当前位置: 首页 > news >正文

nginx的前世今生(二)

书接上回:

上回书说到,nginx的前世今生,这回我们继续说

3.缓冲秘籍,洪流控水

        Nginx的缓冲区是其处理数据传输和提高性能的关键设计之一,主要用于暂存和管理进出的数据流,以应对不同组件间速度不匹配的问题,确保数据能够高效、有序地传输。缓冲区的设计使得Nginx能够在客户端与后端服务器之间的数据交换中发挥桥梁作用,尤其是在处理动态内容和静态资源时。

        想象一下苦逼程序猿凯叔在一家伟大的公司工作,他经常需要和不同的团队中的妹子交接文件。Nginx的缓冲区在这里就像凯叔手边的一个文件中转站。

  • 凯叔:代表Nginx服务器,负责协调内外部的数据传输。
  • 妹子们:代表客户端和后端服务器,有的是给凯叔送文件的(客户端请求),有的是等待接收文件的(后端响应)。
  1. 接收文件(客户端请求): 当妹子A(客户端)要给凯叔(Nginx)送来一堆文件(请求数据),但凯叔可能正忙于整理其他文件,无暇立刻处理。这时,凯叔身边的客户端缓冲区就发挥作用了,它相当于一个临时存放区,先把妹子A的文件收下,等凯叔有空了再慢慢处理。这样,妹子A可以立刻回去做其他事,不用等待。

  2. 发送文件(后端响应): 凯叔处理完文件后,需要把这些文件交给妹子B(后端服务器)。但假设妹子B今天穿了个小背包,一次拿不了太多东西。这时,服务端缓冲区就派上用场了。凯叔先把文件整理好放在缓冲区里,一点点按照妹子B能接受的速度传递给她,保证数据不会因为一次性给太多而丢失或混乱。

  3. 应对不同速度的交往: 假设某个妹子走得特别快(高速客户端),而凯叔还在整理文件,缓冲区可以让凯叔先告诉妹子“稍等一下,我在准备”,避免妹子一直空等。反过来,如果妹子走得慢(慢速后端响应),凯叔也不会因为等待而浪费时间,他可以把文件先放缓冲区,自己继续处理其他事务。

        缓冲区就是这个灵活的文件中转站,Nginx的缓冲区通过合理调配,解决了数据传输中的速度不匹配问题,确保了信息流通的顺畅,提高了整体的工作效率,同时也保证了数据传输的可靠性,让苦逼的凯叔在与妹子们的工作中更加游刃有余。

缓冲区,江湖过客的临时驿站
  1. 客户端缓冲区:负责存储客户端请求的数据,特别是在客户端发送数据较慢或者请求体较大的情况下,可以防止数据丢失,确保数据完整地被后端处理。

  2. 服务端缓冲区(或称为上游缓冲区):主要用于缓冲从后端服务器返回的响应数据。当后端服务器的响应速度快于客户端的接收速度时,Nginx可以先将数据存储在缓冲区中,然后根据客户端的实际接收能力逐步发送,避免了因速度不匹配导致的效率低下。

        

        Nginx的缓冲区机制通过灵活的配置和高效的数据管理,确保了在不同网络条件下数据传输的高效与稳定,是Nginx作为高性能Web服务器和反向代理服务器的重要特性之一。

调配得宜,行云流水,内存江湖的运筹帷幄

        合理配置Nginx的缓冲区就像是在内存江湖中的运筹帷幄,能让数据流转更加行云流水。为了达到这样的效果,我们需要根据实际应用场景和资源情况,细致调整以下关键参数:

  • proxy_buffering:是否启用缓冲机制,默认为on关闭状态。

  • client_body_buffer_size:设置缓冲客户端请求数据的内存大小。

  • proxy_buffers:为每个请求/连接设置缓冲区的数量和大小,默认4 4k/8k

  • proxy_buffer_size:设置用于存储响应头的缓冲区大小。

  • proxy_busy_buffers_size:在后端数据没有完全接收完成时,Nginx可以将busy状态的缓冲返回给客户端,该参数用来设置busy状态的buffer具体有多大,默认为proxy_buffer_size*2

  • proxy_temp_path:当内存缓冲区存满时,可以将数据临时存放到磁盘,该参数是设置存储缓冲数据的目录。

  • path是临时目录的路径。

  • 语法:proxy_temp_path path; path是临时目录的路径

  • proxy_temp_file_write_size:设置每次写数据到临时文件的大小限制。

  • proxy_max_temp_file_size:设置临时的缓冲目录中允许存储的最大容量。

  • 非缓冲参数项:

    • proxy_connect_timeout:设置与后端服务器建立连接时的超时时。

    • proxy_read_timeout:设置从后端服务器读取响应数据的超时时间。

    • proxy_send_timeout:设置向后端服务器传输请求数据的超时时间。

http{  proxy_connect_timeout 10;  proxy_read_timeout 120;  proxy_send_timeout 10;  proxy_buffering on;  client_body_buffer_size 512k;  proxy_buffers 4 64k;  proxy_buffer_size 16k;  proxy_busy_buffers_size 128k;  proxy_temp_file_write_size 128k;  proxy_temp_path /soft/nginx/temp_buffer;  
}

         1.proxy_buffering

  • 配置位置:http, server, location
  • 功能:控制是否开启对来自后端服务器响应的缓冲。默认值为on。
  • 策略:对于动态内容,若后端响应时间较长且客户端连接速度较慢,开启此选项可提升用户体验。而对于静态内容或响应迅速的动态内容,考虑关闭以减少内存使用。

        2.proxy_buffer_size

  • 配置位置:http, server, location
  • 功能:定义了单个缓冲区的大小,主要用于存储响应头和较小的响应体。
  • 策略:根据响应头的大小合理设置,一般设置为几个KB到几十KB,确保能够容纳大部分响应头,避免频繁分配小块缓冲区。

        3. proxy_buffers

  • 配置位置:http, server, location
  • 功能:定义了缓冲区的数量和大小。格式为proxy_buffers number size;
  • 策略:基于后端响应的平均大小和期望同时处理的请求数量来设定。例如,proxy_buffers 8 4k;表示创建8个大小为4KB的缓冲区。对于大型文件下载或视频流,可能需要更大的缓冲区和更多数量。

         4.proxy_max_temp_file_size

  • 配置位置:http, server, location
  • 功能:指定当缓冲区不足时,Nginx可以使用的临时文件最大大小。
  • 策略:当处理非常大的响应体时,合理设置此参数(如1G、2G),可以避免内存耗尽。但要注意,频繁的磁盘I/O可能会影响性能。

         5.proxy_busy_buffers_size

  • 配置位置:http, server, location
  • 功能:定义了当缓冲区正在被写入磁盘时,Nginx仍保留用于处理新请求的缓冲区大小。
  • 策略:应大于或等于proxy_buffers中最大的缓冲区大小,以确保足够的内存空间用于处理并发请求。

         6.综合策略:

  • 监控与调整:通过日志和性能监控工具,观察实际运行中的缓冲区使用情况,根据实际情况微调参数。
  • 资源平衡:在内存充足的情况下,增加缓冲区可以提升性能,但需注意不要过度消耗内存,影响系统稳定性。
  • 特殊情况处理:对于特定的慢请求或大文件传输,考虑单独配置或利用特殊指令(如proxy_ignore_client_abort)来优化。
  • 测试验证:任何配置变更后,务必进行充分的测试,包括压力测试,确保新的配置既能提升性能,又能保持系统的稳定运行。

        通过以上策略的精细调整,Nginx的缓冲区配置就能更加得宜,实现数据传输的行云流水,有效地运筹帷幄于内存江湖之中。当然除了缓存区,还有缓存机制的配置,也能使得nginx在应用缓存方面如虎添翼。

        如何在Nginx中优化配置代理缓存功能?首先,我们得深入了解一系列与缓存相关的配置指令。

http {# 定义缓存存储路径及参数proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;# 解释:# /data/nginx/cache 是缓存文件存放的目录。# levels=1:2 定义了缓存目录的层次结构。# keys_zone=my_cache:10m 设置缓存键值空间名为my_cache,大小为10MB。# inactive=60m 指定缓存条目在不被访问60分钟后失效。# max_size=1g 限制缓存区最大容量为1GB。upstream backend {server backend_server_ip_or_domain:port; # 后端服务器地址}server {listen 80;server_name example.com;location / {# 开启代理功能并将请求转发给后端服务器proxy_pass http://backend;# 开启代理缓存功能proxy_cache my_cache;# 缓存相关控制proxy_cache_bypass $http_pragma; # 根据Pragma头决定是否绕过缓存proxy_no_cache $http_pragma $http_authorization; # 在某些条件下不进行缓存proxy_cache_revalidate on; # 在使用过期的缓存前,检查其在源服务器上是否已更新proxy_cache_min_uses 1; # 缓存条目至少被使用一次后才可被其他用户使用proxy_cache_lock on; # 防止并发请求时对同一资源的重复更新缓存proxy_cache_valid 200 302 1h; # 对HTTP状态码200和302的响应缓存1小时proxy_cache_valid 404 1m; # 对HTTP状态码404的响应缓存1分钟}}
}

在这个配置中,可以参考:https://juejin.cn/post/7112826654291918855

4.黑白名录,剑指江湖

        Nginx设置IP黑白名单的初衷主要是为了实现网络访问控制和增强安全性。这里就不举例了,应该不管小白小黑的都懂吧。

白名单如友,黑名单似敌,一令封喉

        Nginx的黑白名单功能是一种灵活且实用的网络安全策略,它帮助管理员有效管理访问权限,提升系统安全性,同时也能优化资源利用和服务质量。

        设置黑白名单的主要目的和好处:

  1. 安全防护:通过黑名单机制,可以阻止已知恶意IP地址或有攻击行为的IP访问网站或应用,从而减少DDoS攻击、恶意扫描、尝试入侵等安全威胁,保护服务器资源和服务免受侵害。

  2. 访问权限管理:白名单机制允许指定的IP或IP段访问特定内容或服务,这对于内部系统、测试环境或付费会员专享内容非常有用。这样可以确保只有授权的用户或系统能够访问敏感数据或功能。

  3. 流量优化:通过限制或优先处理某些IP的请求,可以优化服务器资源的分配,提高整体服务质量和响应速度。例如,对于高价值客户或内部员工,可以通过白名单给予更快的访问速度。

  4. 合规性要求:某些行业或地区可能有特定的法规要求,需要对访问者进行严格的访问控制。设置IP黑白名单可以帮助组织满足这些合规性要求。

  5. 故障排查和分析:在遇到问题时,通过临时设置黑名单或观察白名单访问日志,可以辅助识别并隔离问题来源,便于故障排查和分析网络行为。

门派准入,安全之门,Nginx的护山大阵

        Nginx的黑白名单功能就像是一座山门,严格筛选着进出的“江湖人士”,确保了门派(即网站或应用)的安全与秩序。下面我将详细介绍如何通过Nginx配置实现这一“护山大阵”,并解释为何它能成为一道有效的安全屏障。

 黑名单设置:假设我们要阻止特定的恶意IP地址访问我们的站点,通过以下配置实现:

http {# ...server {listen 80;server_name example.com;# 黑名单设置deny 192.168.1.10; # 禁止此IP访问deny 10.0.0.0/8; # 禁止整个IP段访问# 允许所有其他未明确禁止的IPallow all;location / {# ... 其他location配置}}
}
  • deny指令用于定义黑名单,可以直接指定单个IP地址或使用CIDR表示法指定一个IP段。
  • allow all;放置在deny规则之后,意味着除了黑名单中的IP,其他所有IP都允许访问。

 白名单设置:如果我们希望只允许特定IP或IP段访问,采取白名单策略:

http {# ...server {listen 80;server_name example.com;# 白名单设置allow 192.168.1.0/24; # 允许此IP段访问allow 10.0.0.5; # 允许此单独IP访问# 拒绝所有不在白名单中的IPdeny all;location / {# ... 其他location配置}}
}
  • 使用allow指令来定义白名单。
  • deny all;放在allow规则之后,意味着除了白名单中的IP,其他所有IP都将被拒绝访问。
  1. 精确控制访问:通过精细的IP控制,Nginx能够有效阻止恶意访问,如自动化扫描工具、已知攻击源等,减少了安全威胁。
  2. 资源保护:限制不必要的访问可以减少服务器负载,保护带宽资源,提升服务稳定性。
  3. 策略灵活性:黑白名单策略可根据需要随时调整,适应不同的安全策略和业务场景变化。
  4. 简单易部署:只需简单的配置即可实现强大的访问控制功能,无需复杂的第三方安全解决方案。

5.跨界之谜,CORS解咒

跨域之禁,如同武林禁地      

         跨域是指在浏览器中,当一个网页的源(origin)与另一个网页加载资源的源不一致时,就会发生跨域问题。这种情况下,浏览器会限制页面中的脚本或资源与不同源的服务器进行交互,以防止恶意行为。

        想象一下苦逼程序猿凯叔,在一家伟大的公司卖命,公司的几十个妹子再追求凯叔,但是凯叔在另一个部门工作,不在同一个圈子里。妹子想要约凯叔出去,但由于不在同一个部门,他无法直接接触到凯叔,这就叫跨域,解决跨域就需要通过一些中间人或方法来实现。

        CORS(Cross-Origin Resource Sharing)是一种用于解决跨域资源访问限制的机制。它允许在浏览器中运行的Web应用程序从不同源(域、协议或端口)的服务器请求资源,即允许跨域访问。CORS通过在HTTP头部中使用特定的标记来告知浏览器是否允许跨域请求,从而实现跨域资源共享。

        简单来说,CORS允许网页服务器在响应中设置一个许可控制的HTTP头部,从而让浏览器知道该网页是否允许被跨域访问。这样就能够解决浏览器的同源策略对跨域资源请求的限制,实现安全可控的跨域访问。

        了解了机理,那么跨域问题的核心起因在于浏览器实施的“同源策略”,这一安全原则旨在守护用户信息的安全边界,防范恶意网站非法获取数据。简言之,“同源”定义为请求的协议、域名及端口号完全一致;若三者中任一要素不匹配,则视为跨域请求,此时同源策略将介入,限制不同源之间的直接资源访问与交互,以避免潜在的隐私泄露风险。

        特别地,考虑到HTTP协议本身无状态特性,网站通常利用Cookie保存用户会话、身份验证等敏感信息,确保用户在不同页面间浏览时能保持登录状态或个性化设置。若不对跨域访问加以限制,Cookie可能在用户不知情的情况下被第三方网站非法读取,从而危及用户的个人数据安全,比如账户密码等关键信息的泄露。因此,坚持执行同源策略不仅是维护Web生态安全的基石,也是保障用户隐私权益的必要措施。

Nginx一令,破除界限,共筑和谐江湖

        了解了跨域问题,接下来就是nginx发挥作用的时候了,nginx如何配置才能让凯叔和妹子共筑和谐社会。

http {# ...server {listen 80;server_name your.domain.com; # 替换为你的域名# 定义一个location来处理需要跨域的请求location /api { # 假设所有/api开头的请求需要跨域处理# 设置代理,将请求转发到后端服务器proxy_pass http://your_backend_service:3000; # 替换为后端服务器地址和端口# 解决跨域问题,添加必要的响应头add_header 'Access-Control-Allow-Origin' '*'; # 允许所有源进行跨域请求,也可以指定具体的源如'http://example.com'add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; # 允许的HTTP方法add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; # 允许的请求头add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; # 暴露给外部的响应头add_header 'Access-Control-Allow-Credentials' 'true'; # 如果需要携带cookie,设置为true,但注意这会使某些浏览器的预检请求(OPTIONS)失败,除非后端也正确设置了此头# 处理预检请求(OPTIONS请求)if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000; # 预检请求的有效期,单位为秒add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204; # 立即结束请求,不返回任何内容}}}
}
  • listen 80; 指定Nginx监听的端口,这里为默认的HTTP端口80。
  • server_name your.domain.com; 配置你的域名。
  • location /api { ... } 定义了一个location块来匹配所有以/api开头的请求路径。
  • proxy_pass http://your_backend_service:3000; 设置反向代理,将请求转发到后端服务器。
  • add_header 指令用于添加HTTP响应头,解决跨域问题的关键在于设置正确的Access-Control-Allow-OriginAccess-Control-Allow-Methods等头。
  • 特别地,对于需要携带Cookie的跨域请求,需要设置Access-Control-Allow-Credentialstrue,并且后端也需要配置相应的响应头来配合。
  • if ($request_method = 'OPTIONS') {...} 这部分是为了处理预检请求(OPTIONS请求),这是一种安全机制,浏览器在实际发送跨域请求前,会先发送一个OPTIONS请求来确认服务器是否支持跨域。

        面对分布式架构中的后端RPC调用,确保跨域访问的顺畅同样至关重要。为了解决这一挑战,你可以在后端项目中采取以下策略优化跨域配置:

  1. 自定义拦截器(Interceptor):通过继承HandlerInterceptorAdapter类(或直接实现HandlerInterceptor接口,针对较新版本的Spring框架),你可以定制化处理跨域请求。在拦截器中,添加必要的响应头以允许跨域访问,实现细粒度的控制。

  2. 全局配置(WebMvcConfigurer):实现WebMvcConfigurer接口并重写addCorsMappings方法,为整个应用提供一套统一的跨域策略。这种方式有利于简化配置,避免在每个控制器或方法上重复添加跨域注解。

  3. 利用@CrossOrigin注解:对于特定的控制器或方法,直接使用@CrossOrigin注解来开启跨域支持,这是一种更为简便且针对性的方法。虽然不如前两者灵活,但对于快速解决局部跨域需求非常有效。

6.巨刃传书,不动如山

大文件传输,考验耐心与实力

        在一个阳光明媚的春日午后,苦逼程序猿开始,卖着老命在一个伟大的公司辛勤的工作,就在此时公司里的妹子们正苦恼于一个棘手的问题:她们精心制作的产品演示视频文件过大,每当试图通过公司内部平台分享给团队成员,尤其是那位总是埋头代码、沉默寡言的程序员凯叔时,浏览器总是无情地提示传输失败。这不仅让妹子们的工作进度受阻,也让本就紧张的项目期限雪上加霜。

        妹子们为了进一步拉近与凯叔的距离。她们开始研究如何优化大文件传输,却意外发现,公司使用的Nginx服务器正是解决这个问题的关键。

        在一番深入交流后,凯叔通过调整了Nginx的配置,增加了client_max_body_size的值,确保服务器能接受更大的文件。同时,她还启用了HTTP/2,利用其多路复用特性提高文件传输效率。为了增强用户体验,她甚至提议采用前端分片上传方案,让大文件分割成小块逐步上传,即使网络偶有波动也不至于前功尽弃。

        当一切准备就绪,妹子们满怀期待地再次尝试上传视频文件,这次,奇迹发生了,文件顺利上传,没有出现任何中断。她们迫不及待地将成功的好消息和优化心得通过内网邮件分享给了所有人,当然,还有那位英俊潇洒,气宇轩昂,头顶没毛的凯叔。凯叔收到邮件,心中暗暗佩服自己咋这么牛逼。但是针对上传大文件,也提出了一些进一步优化的建议,就这样围绕技术话题又进一步的深入交流。

        最终,这段由一个大文件传输问题牵起的缘分,让技术与艺术完美融合,成就了一段美好的佳话。

浏览器大文件传输主要面临以下问题:

  1. 网络不稳定:长时段的文件传输过程中,网络波动可能导致传输中断,尤其是在移动网络或不稳定网络环境下。
  2. 浏览器限制:浏览器对上传文件大小有所限制,不同浏览器限制不同,可能会阻止大文件的上传。
  3. 服务器限制:服务器端(如Nginx)也可能对上传文件大小有默认限制,导致大文件上传被拒绝。
  4. 资源占用:大文件上传会占用较多的客户端和服务器资源,可能影响其他服务性能。
  5. 上传超时:长时间的文件上传可能导致HTTP请求超时。
  6. 用户体验:上传大文件时,用户等待时间较长,可能造成用户体验不佳。

Nginx为解决大文件传输问题提供了以下策略:

        1.调整配置参数

        client_max_body_size:通过修改此参数增加允许上传的最大文件大小。例如,client_max_body_size 1000m;允许上传最大为1GB的文件。        

                超时时间调整:增加client_header_timeoutclient_body_timeoutproxy_connect_timeoutproxy_read_timeout, 和 proxy_send_timeout等超时时间设置,以适应大文件传输所需的更长时间。

        2.分块上传:虽然HTTP协议本身支持文件分块上传,但Nginx可以通过与前端应用配合,实现更精细化的分片上传和断点续传功能。前端将大文件分割成多个小块,逐一上传,Nginx在服务器端负责接收并合并这些文件块,确保网络中断后可以从断点继续上传,提高传输可靠性。

        3.缓存优化:优化缓存策略,减少因缓存问题导致的上传失败,特别是在上传过程中需要多次请求验证或交互的场景。

        4.使用HTTP/2或HTTP/3:支持HTTP/2或HTTP/3协议,它们在多路复用、流控制等方面的优势有助于提升大文件传输的效率和稳定性。

        5.负载均衡:在分布式系统中,Nginx作为负载均衡器可以将大文件上传请求分配给多个后端服务器,分散单个服务器的压力,提升整体处理能力。

Nginx持重,分段传输,稳如磐石

        在Nginx中解决大文件传输问题,特别是实现分片传输,主要是通过调整Nginx的配置参数来优化文件上传的限制条件,并确保客户端与服务器之间的稳定通信。虽然Nginx本身并不直接支持前端的文件分片上传逻辑(这部分通常由前端应用实现),但它的配置可以很好地支持和配合这种分片上传的机制。以下是如何配置Nginx以支持大文件分片上传的步骤:

1. 调整文件大小限制

调整Nginx允许接收的请求体大小,以适应大文件上传的需求。

http {client_max_body_size 1000m; # 设置最大上传文件大小为1GB
}

2. 设置超时时间

为了避免上传大文件时因超时而导致的失败,适当增加超时时间参数。

http {client_body_timeout 600s; # 请求体读取超时时间设置为600秒client_header_timeout 600s; # 请求头读取超时时间proxy_read_timeout 600s; # 代理读取超时时间proxy_send_timeout 600s; # 代理发送超时时间
}

3. 开启高效文件传输模式

对于文件传输,确保sendfile指令设置得当。

http {sendfile on; # 开启高效文件传输模式
}

4. 配合前端分片上传

虽然Nginx配置本身不涉及分片上传的具体实现,但需确保Nginx能够正确接收和处理前端分片上传的请求。前端应用需要负责将大文件分割成多个小块,每个小块独立上传,并在服务器端进行重组。

PS:

  • 分片上传的逻辑需要客户端(如JavaScript)实现,将文件切分为多个片段,并为每个片段发起独立的POST请求,通常包含一个标识符来指示属于哪个文件以及是文件的哪一部分。
  • 服务器端(如后端应用)需要能够识别这些分片,存储它们,并在所有分片上传完成后,将它们合并成原始文件。

        Nginx通过调整上述配置,为大文件分片上传提供了基础支持,而实际的分片上传逻辑则需要前端与后端应用程序共同协作完成。确保Nginx配置与前端、后端的分片上传逻辑相匹配,是实现大文件稳定上传的关键。 

7.防盗链锁,独步武林

        Nginx的防盗链锁是一种安全机制,用于防止恶意用户盗用网站资源。通过配置Nginx服务器,管理员可以限制只有特定来源的请求才能访问网站资源,其他来源的请求将被拒绝访问。这样可以防止其他网站盗用资源,减少带宽消耗和保护网站内容的安全性。

独门秘技,防盗链术,守卫珍稀资源

        Nginx的防盗链功能,是保护网站资源免遭未经授权的第三方盗用的一门“独门秘技”。这项技术通过检查HTTP请求头中的“Referer”字段,判断请求是否源自站内,进而决定是否允许访问资源,以此来防止他人直接链接到你的图片、视频等静态资源,减少了流量消耗,保护了版权和服务器资源。工作机理如下:

  1. 检查Referer头:当用户从一个网页点击链接到另一个网页时,浏览器会在请求中自动附带原网页的URL,这个信息储存在HTTP头部的“Referer”字段中。Nginx通过分析这个字段来判断请求来源。

  2. 配置规则:在Nginx的配置文件中,可以设置基于Referer的访问控制规则。如果请求的Referer与预期不符(即不是来自你信任的域名),Nginx可以拒绝提供资源,返回错误码或重定向到其他页面。

  3. 白名单/黑名单:你可以设置白名单(只允许特定Referer访问)、黑名单(禁止某些Referer访问),或者更复杂的规则逻辑,以适应不同的安全需求。

nginx的防盗链锁的作用如下:

  • 节约流量成本:避免其他网站直接链接你的资源,从而消耗你的服务器带宽。
  • 版权保护:确保你的图片、视频等内容不会被随意嵌入到第三方网站,保护知识产权。
  • 提升安全性:防止恶意网站通过链接你的资源来进行钓鱼攻击或其他形式的网络安全威胁。
  • 增强用户体验:通过重定向或自定义错误页面,引导用户正确访问你的网站,维护品牌形象。
一链一锁,让盗者望而却步

        Nginx防盗链功能的详细配置涉及对特定location块的定制,以便检查HTTP请求中的Referer头信息,从而决定是否允许该请求访问静态资源。下面是一个更详细的配置示例,包括了白名单设置、错误处理、以及可选的复杂逻辑,比如基于特定条件的动态Referer检查。

基础配置:

server {listen 80;server_name yoursite.com;location /protected/ {# 设置防盗链检查valid_referers none blocked yoursite.com *.yoursite.com subdomain.yoursite.com;# none 表示直接访问无Referer的情况,blocked是指Referer被禁用或被篡改# 指定允许的Referer,可以是确切的域名、子域名或使用通配符# 如果Referer不在允许列表中if ($invalid_referer) {# 返回403 Forbidden错误return 403;# 或者重定向到错误页面# return 302 http://yoursite.com/forbidden.html;}# 正常处理请求,指向资源所在目录root /var/www/your-site/htdocs;index index.html index.htm;}
}

高级配置:

        在某些场景下,可能需要更灵活的Referer检查逻辑,比如根据请求的其他条件动态调整。Nginx的map模块可以用来实现更复杂的逻辑判断 

http {map $http_referer $trusted_referer {default 0;"~^(https?://)?(www\.)?yoursite\.com(/|$)" 1;"~^(https?://)?subdomain\.yoursite\.com(/|$)" 1;# 更多匹配规则...}server {listen 80;server_name yoursite.com;location /protected-dynamic/ {# 使用map定义的$trusted_referer变量if ($trusted_referer = 0) {return 403;}root /var/www/your-site/advanced-htdocs;index index.html index.htm;}}
}

        在这个例子中,map指令在http块中定义,用于预先计算Referer是否可信。然后在location块中,通过比较$trusted_referer变量的值来决定是否允许访问。还需要注意以下几点:

  • 精确匹配与安全:配置Referer白名单时,确保正则表达式精确,避免误伤或被恶意绕过。
  • 性能考量:防盗链检查会增加Nginx处理请求的开销,尤其是在高并发场景下,应考虑性能影响。
  • 兼容性:部分旧版浏览器或特殊情况可能不发送Referer,需评估是否允许此类访问。

8.HTTPS金钟罩,固若金汤

        HTTPS的产生主要是为了加强网络通信的安全性。在HTTP协议中,数据是以明文形式传输的,容易被窃取和篡改,因此引入了HTTPS协议来加密数据传输,保护用户隐私和数据安全。HTTPS使用SSL/TLS协议对数据进行加密,确保数据在传输过程中不被窪窃取或篡改。HTTPS还可以验证服务器的身份,防止中间人攻击,提高网络通信的安全性。HTTPS的普及使得网络通信更加安全可靠,成为现代互联网通信的标准。

SSL证书,加密之钥,金钟罩铁布衫

随着HTTPS的广泛采纳,Nginx配置已拓展至支持加密通信,要求对443端口的HTTPS请求进行监听。为确保数据传输安全无虞,整合SSL证书成为Nginx网关配置的必备环节。以下是简明的SSL配置指南:

  1. 证书获取:首要步骤是从权威CA机构或云服务提供商获取专为Nginx设计的SSL证书。完成审核流程后,下载包括.crt(或等效的PEM格式证书)、.key(服务器私钥)在内的必要文件。

    • .crt:代表证书实体的数字证明,偶尔以.pem格式呈现。
    • .key:存储服务器私钥,用于解密由公钥加密的数据,确保数据安全。
    • .pem:一种通用的编码格式文件,可能包含证书、私钥或两者,根据情况可调整扩展名。
  2. 证书部署:在Nginx安装根目录下新建一个certificates文件夹,将下载的所有证书文件移至此处。此举便于管理并确保Nginx能够无缝访问这些关键安全组件。

Nginx铸盾,安全之路,光明正大

        应用SSL证书至Nginx服务器具有极其重要的意义,主要体现在以下几个方面:

  1. 数据加密:SSL证书通过TLS/SSL协议为客户端与服务器间的通信提供加密,确保传输的数据(如登录凭证、敏感信息等)不被第三方窃取或篡改,保护用户隐私和数据安全。
  2. 身份验证:CA颁发的SSL证书能验证网站的真实身份,帮助用户识别假冒网站,增强信任度和品牌信誉。
  3. SEO优化:搜索引擎如Google倾向于优先展示已启用HTTPS的网站,使用SSL证书有助于提升搜索排名。
  4. 合规性:许多法律法规和行业标准要求网站采用HTTPS,特别是涉及到个人信息处理的场景。
server {listen 443 ssl; # 监听443端口,开启SSLserver_name your_domain.com www.your_domain.com; # 替换为你的域名# SSL证书和私钥的路径ssl_certificate /etc/nginx/ssl/your_domain.crt; # 证书文件路径ssl_certificate_key /etc/nginx/ssl/your_domain.key; # 私钥文件路径# SSL/TLS协议和密码套件配置,推荐使用更安全的选项ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';ssl_prefer_server_ciphers on;# 其他配置,如访问控制、代理转发等# HTTP重定向到HTTPS(如果需要)if ($scheme != "https") {return 301 https://$host$request_uri;}# 你的location块和其他配置location / {# ...}
}# 可选:如果你同时运行HTTP服务,可以配置一个简单的重定向
server {listen 80;server_name your_domain.com www.your_domain.com;return 301 https://$host$request_uri;
}

  • ssl_certificatessl_certificate_key指令分别指定了SSL证书和私钥的路径。
  • ssl_protocols配置了支持的SSL/TLS协议版本,推荐至少使用TLSv1.2以保证安全性。
  • ssl_ciphers定义了支持的密码套件,选择安全且高效的组合是关键。
  • ssl_prefer_server_ciphers设为on表示优先使用服务器端首选的密码套件。

完成配置后,测试Nginx配置文件的语法是否正确(使用nginx -t命令),然后重新加载或重启Nginx服务(systemctl reload nginxservice nginx restart),即可使SSL配置生效

未完待续

相关文章:

nginx的前世今生(二)

书接上回: 上回书说到,nginx的前世今生,这回我们继续说 3.缓冲秘籍,洪流控水 Nginx的缓冲区是其处理数据传输和提高性能的关键设计之一,主要用于暂存和管理进出的数据流,以应对不同组件间速度不匹配的问题…...

浏览器跨域详解

一、什么是跨域 浏览器跨域是指当一个Web应用程序试图访问另一个协议、主机或端口不同的资源时,所发生的情况。这主要是由于浏览器的同源策略造成的,它是为了网站的安全而设置的安全限制,防止一个网站恶意访问另一个网站的资源。当然这是比较…...

华为5700配置

恢复出厂设置,清空配置 1、更改名字 system-view sysname tp-10-50-01-04 2、配置管理接口 int vlan 1 ip add 10.50.1.4 255.255.254.0 quit 2、链路汇聚 interface eth-trunk 1 mode lacp quit 3、绑定端口 interface eth-trunk 1 trunkport gigabitethernet …...

使用Axios从前端上传文件并且下载后端返回的文件

前端代码: function uploadAndDownload(){showLoading();const fileInput document.querySelector(#uploadFile);const file fileInput.files[0];const formData new FormData()formData.append(file, file)return new Promise((resolve, reject) > {axios({…...

open 函数到底做了什么

使用设备之前我们通常都需要调用 open 函数,这个函数一般用于设备专有数据的初始化,申请相关资源及进行设备的初始化等工作,对于简单的设备而言,open 函数可以不做具体的工作,你在应用层通过系统调用 open 打开设备…...

ue引擎游戏开发笔记(32)——为游戏添加新武器装备

1.需求分析: 游戏中角色不会只有一种武器,不同武器需要不同模型,甚至可能需要角色持握武器的不同位置,因此需要添加专门的武器类,方便武器后续更新,建立一个武器类。 2.操作实现: 1.在ue5中新建…...

【个人博客搭建】(17)使用FluentValidation 参数校验

FluentValidation 是一个用于 .NET 的开源验证库,它提供了一种流畅的接口和强类型验证规则,使得验证逻辑表达得更加清晰和简洁。(Apache-2.0) FluentValidation 的主要作用包括: 提高代码可读性:通过使用 F…...

数据结构===散列表

文章目录 概要散列思想散列函数散列冲突开放寻址法装载因子 链表法 代码Java小结 概要 散列表是一种很有趣的数据结构。 散列表是一个很有用的数据结构。它是数组演练而来的,又是一个基于数组的扩展的数据结构。接下来看看。 散列思想 散列表用的是数组支持按照下…...

10G MAC层设计系列-(2)MAC RX模块

一、概述 MAC RX模块的需要进行解码、对齐、CRC校验。 因为在空闲的时候10G PCS/PMA会一直向外吐空闲符(x07)所以需要根据开始符、结束符将有效数据从码流中截取,也就是解码。 因为开始字符的所在位置有两种形式,而结束字符的位…...

解码Starknet Verifier:深入逆向工程之旅

1. 引言 Sandstorm为: 能提交独立proof给StarkWare的Ethereum Verifier,的首个开源的STARK prover。 开源代码见: https://github.com/andrewmilson/sandstorm(Rust) L2Beat 提供了以太坊上Starknet的合约架构图&…...

【C++语言】类和对象--默认成员函数 (中)

文章目录 前言类的六个默认成员函数:1. 构造函数概念特性做了什么?易错注意:显式定义和默认构造函数 2. 析构函数概念特征做了什么?注意事项: 3.拷贝构造函数概念特征做了什么?注意事项: 4.赋值运算符重载…...

前端递归常见应用

概览 在 JavaScript 中,递归是一种编程技术,指的是函数直接或间接调用自身的过程。 递归通常用于解决可以分解为相同子问题的问题。通过不断地将问题分解成更小的、相似的子问题,直到达到某种基本情况(不再需要进一步递归的简单情…...

AI工具如何改变我们的工作与生活

AI工具在当今社会中扮演着越来越重要的角色,它们已经开始改变着我们的工作方式和生活方式。在接下来的2000字篇幅中,我将详细探讨AI工具如何影响我们的工作和生活。 AI工具在工作中的影响: 自动化和智能化生产流程: AI工具可以通…...

深入了解C/C++的内存区域划分

🔥个人主页:北辰水墨 🔥专栏:C学习仓 本节我们来讲解C/C的内存区域划分,文末会附加一道题目来检验成果(有参考答案) 一、大体有哪些区域?分别存放什么变量开辟的空间? …...

C++构造函数和析构函数的调用顺序

一般情况下,调用析构函数的次序正好与调用构造函数的次序相反,也就是最先被调用的构造函数,其对应的析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。 当然对象的构造函数和析构函数调用时机和…...

智能家居1 -- 实现语音模块

项目整体框架: 监听线程4: 1. 语音监听线程:用于监听语音指令, 当有语音指令过来后, 通过消息队列的方式给消息处理线程发送指令 2. 网络监听线程:用于监听网络指令,当有网络指令过来后, 通过消息队列的方…...

Leetcode 3139. Minimum Cost to Equalize Array

Leetcode 3139. Minimum Cost to Equalize Array 1. 解题思路2. 代码实现 题目链接:3139. Minimum Cost to Equalize Array 1. 解题思路 这一题是一道hard的题目,而且看了一下答出率低的离谱,就一开始被吓到了,不过实际做了一下…...

【element-ui】el-table横向滚动后,通过is-scrolling-left获取滚动高度失效的问题

el-table横向滚动后,通过is-scrolling-left获取滚动高度失效的问题 需求 现在有一个需求,需要监听el-table的纵向滚动,当滚动高度达到特定值时进行一些操作。 代码如下: methods:{throttledHandleScroll() {// 如果已经有定时器…...

JAVA中的日期

获取当前的日期 LocalDate LocalDate today LocalDate.now();System.out.println("今天是:"today);//今天是:2024-05-06String format today.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));System.out.println("今天是:"…...

一起了解开源自定义表单的优势表现

随着社会的进步和科技的发展,越来越多的中小企业希望采用更为先进的软件平台,助力企业实现高效率的流程化管理。低代码技术平台、开源自定义表单已经慢慢走入大众视野,成为一款灵活、高效的数字化转型工具。流辰信息专注于低代码技术平台的研…...

体育老师工资高吗,奖金有吗

教师的薪资水平与多种因素相关,包括教育经验、工作地点、学校类型以及个人的教学成果等。在讨论体育教师的工资问题时,不能仅仅关注数字,更应了解教育价值和个人发展。 初中体育教师的工资水平受多种因素影响。根据网络统计的数据&#xff0c…...

Linux驱动开发——(十一)INPUT子系统

目录 一、input子系统简介 二、input驱动API 2.1 input字符设备 2.2 input_dev结构体 2.3 上报输入事件 2.4 input_event结构体 三、代码 3.1 驱动代码 3.2 测试代码 四、平台测试 一、input子系统简介 input子系统是管理输入的子系统,和pinctrl、gpio子…...

大数据毕业设计Python+Django旅游景点评论数据采集分析可视化系统 NLP情感分析 LDA主题分析 bayes分类 旅游爬虫 旅游景点评论爬虫 机器学习 深度学习 人工智能 计算机毕业设计

毕业论文(设计)开题报告 学生姓名 学 号 所在学院 信息工程学院 专 业 指导教师姓名 指导教师职称 工程师 助教 指导教师单位 论文(设计)题目 基于朴素贝叶斯算法旅游景点线上评价情感分析 开 题 报 告…...

FSNotes for Mac v6.7.1中文激活版:强大的笔记管理工具

FSNotes for Mac是一款功能强大的文本处理与笔记管理工具,为Mac用户提供了一个直观、高效的笔记记录和整理平台。 FSNotes for Mac v6.7.1中文激活版下载 FSNotes支持Markdown语法,使用户能够轻松设置笔记格式并添加链接、图像等元素,实现笔记…...

课程34:Windows Docker部署.Net Core项目

这里写目录标题 🚀前言一、安装Docker Desktop1.1 官网下载Docker1.2 安装Docker1.2.1 选择配置,默认都勾选1.2.2 安装中1.2.3 安装成功1.2.4 启动1.2.5 启动成功二、.Net Core 项目发布与部署2.1 修改Dockerfile文件2.2 Web项目发布2.3 修改配置2.3.1 修改dockerfile<...

分布式与一致性协议之ZAB协议(四)

ZAB协议 ZooKeeper是如何选举领导者的。 首先我们来看看ZooKeeper是如何实现成员身份的&#xff1f; 在ZooKeeper中&#xff0c;成员状态是在QuorumPeer.java中实现的&#xff0c;为枚举型变量 public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING }其实&…...

在M1芯片安装鸿蒙闪退解决方法

在M1芯片安装鸿蒙闪退解决方法 前言下载鸿蒙系统安装完成后&#xff0c;在M1 Macos14上打开闪退解决办法接下来就是按照提示一步一步安装。 前言 重新安装macos系统后&#xff0c;再次下载鸿蒙开发软件&#xff0c;竟然发现打不开。 下载鸿蒙系统 下载地址&#xff1a;http…...

Linux基础-socket详解、TCP/UDP

文章目录 一、Socket 介绍二、Socket 通信模型三、Socket 常用函数1 创建套接字2 绑定套接字3、监听连接4、接受连接5、接收和发送数据接收数据发送数据 6、关闭套接字 四、Socket编程试验1、源码server.cclient.c 2、编译&#xff1a;3、执行结果 五、补充TCP和UDP协议的Socke…...

【菜单下拉效果】基于jquery实现二级菜单下拉效果(附完整源码下载)

Js菜单下拉特效目录 &#x1f354;涉及知识&#x1f964;写在前面实现效果&#x1f367;一、涉及知识&#x1f333;二、具体实现2.1 搭建一级菜单2.2 搭建二级菜单项2.3 引入js文件2.4 构建CSS文件 &#x1f40b;三、源码获取&#x1f305; 作者寄语 &#x1f354;涉及知识 ht…...

如何使用resource-counter统计跨Amazon区域的不同类型资源数量

关于resource-counter resource-counter是一款功能强大的命令行工具&#xff0c;该工具基于纯Python 3开发&#xff0c;可以帮助广大研究人员跨Amazon区域统计不同类型资源的数量。 该工具在统计完不同区域的各类资源数量后&#xff0c;可以在命令行中输出并显示统计结果。res…...

wordpress微信扫码登录/建设网站制作公司

网页基本元素-按钮打造 按钮分类 平面类、体积类、光感类、凹面类按钮特点 有区别于背景的外框有对应的文字/图标按钮的本质特点就是可以点击 按钮规范 按钮大小根据文字大小确定&#xff0c;文字大小一般为18~24px文字大小一般为按钮高度的一半&#xff0c;左右边距大于上…...

手机网页无法访问如何解决/重庆 seo

今天在写一个给第三方同步数据的接口时遇到一个这种情况&#xff0c;我有一大坨数据&#xff0c;但是第三方只需要其中的几个而已&#xff0c;不及思索的就开始foreach$ret array();foreach ($needParams as $pk) {if (isset($params[$pk])) {$ret[$pk] $params[$pk];}}由于还…...

宜昌公司做网站/网络营销广告名词解释

一、安装问题1)高级安装新建分区sda1必须是/boot分区&#xff0c;sda2是根分区&#xff1f;A&#xff1a;如在飞腾平台&#xff0c;高级安装新建分区sda1必须是/boot分区&#xff0c;sda2是根分区&#xff0c;且这两个分区类型必须是主分区&#xff0c;除这两个分区外其他分区类…...

长春专业做网站/厦门搜索引擎优化

首先我们创建一个.c文件 &#xff08;打开终端 快捷键 ctrlaltT&#xff09; vim fork.c然后在里面写入代码 按esc&#xff0c;然后:wq&#xff0c;保存并退出&#xff0c;esc指的是进入普通模式 然后编译 gcc fork.c -o fork最后执行 ./是运行某文件的操作 ./fork在默认情…...

青岛网站开发建设/拼多多商品关键词搜索排名

栈上分配内存和回收都是自动的&#xff0c;不用程序员来处理 堆上分配内存有系列的函数或操作符 如c的 malloc vs free c的 new vs delete 这些内存的分配和释放由程序员来负责 引用的长篇大论开始了&#xff1a; 在C中&#xff0c;内存分成5个区&#xff0c;他们分别是堆、栈、…...

重庆网上商城网站建设公司/seo网站推广优化就找微源优化

随着5G手机入网许可的陆续发放&#xff0c;第一批5G手机已经开始上市发售。在价格方面&#xff0c;5G手机并未像此前预测的超过万元。vivo通信研究院总经理秦飞在接受媒体采访时透露&#xff0c;首款5G手机将在8月份上市&#xff0c;价格亲民&#xff0c;或将亏本售卖。中国移动…...