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配置生效

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1410087.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【JVM】class文件格式,JVM加载class文件流程,JVM运行时内存区域,对象分配内存流程

这篇文章本来只是想讲一下class文件格式,讲着讲着越讲越多。JVM这一块吧,知识比较散比较多,如果深研究下去如死扣《深入理解Java虚拟机》,这本书很深很细,全记住是不可能的,其实也没必要。趁这个机会直接把…

[Java EE] 多线程(六):线程池与定时器

1. 线程池 1.1 什么是线程池 我们前面提到,线程的创建要比进程开销小,但是如果线程的创建/销毁比较频繁,开销也会比较大.所以我们便引入了线程池,线程池的作用就是提前把线程都创建好,放到用户态代码中写的数据结构中,后面就可以随用随取. 线程池最大的好处就是减少每次启动,…

【Canvas】给图片绘制矩形以及添加文字

效果图: <!DOCTYPE html> <html lang"en"><head><title>Canvas Marker Example</title></head><body><!-- 图片 --><imgid"myImage"src图片地址alt"Image to mark"style"display: no…

java-函数式编程-函数对象

定义 什么是合格的函数&#xff1f;无论多少次执行函数&#xff0c;只要输入一样&#xff0c;输出就不会改变 对象方法的简写 其实在类中&#xff0c;我们很多参数中都有一个this&#xff0c;被隐藏传入了 函数也可以作为对象传递&#xff0c;lambda就是很好的例子 函数式接口中…

uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之使用jar包插件

前言 如果你不会编写安卓插件,你可以先看看我之前零基础的文章(uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件), 我们使用第三方包,jar包编写安卓插件 开始 把依赖包,放到某个模块的/libs目录(myTestPlug/libs) 还要到build…

Source-Free Domain Adaptation for Semantic Segmentation

Batch Normalization Statistics (BNS)&#xff0c;dual attention module (DAM).dual attention distillation (DAD)&#xff0c;intra-domain patch-level self-supervision module (IPSM).ADV means adversarial 引用的文献较老&#xff0c;不建议复现

java面试(MySQL)

优化 如何定位慢查询 方案一&#xff1a;开源工具 调试工具&#xff1a;Arthas 运维工具&#xff1a;Prometheus,Skywalking 方案二&#xff1a;MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;llong_query_time,单位&#xff1a;秒&#xff0c;默认十…

操作系统(2)——进程线程

目录 小程一言专栏链接: [link](http://t.csdnimg.cn/8MJA9)基础概念线程详解进程详解进程间通信调度常用调度算法 重要问题哲学家进餐问题问题的描述策略 读者-写者问题问题的描述两种情况策略 总结进程线程一句话 小程一言 本操作系统专栏&#xff0c;是小程在学操作系统的过…

专注 APT 攻击与防御—工具介绍Veil-Evasion

专注 APT 攻击与防御 - Micro8 系列教程项目地址&#xff1a;https://github.com/Veil-Framework/Veil-Evasion 1、Veil-Evasion Veil-Evasion 是与 Metasploit 生成相兼容的 Payload 的一款辅助框架&#xff0c;并可以绕过大多数的杀软。 Veil-Evasion 并没有集成在kali&am…

macOS sonoma 14.4.1编译JDK 12

macOS sonoma 14.4.1编译JDK 12 环境参考文档开始简述问题心路历程着手解决最终解决(前面有点啰嗦了&#xff0c;可以直接看这里) 记录一次靠自己看代码解决问题的经历(总之就是非常开心)。 首先&#xff0c;先diss一下bing&#xff0c;我差一点就放弃了。 环境 macOS sonom…

nginx--自定义日志跳转长连接文件缓存状态页

自定义日志服务 [rootlocalhost ~]# cat /apps/nginx/conf/conf.d/pc.conf server {listen 80;server_name www.fxq.com;error_log /data/nginx/logs/fxq-error.log info;access_log /data/nginx/logs/fxq-access.log main;location / {root /data/nginx/html/pc;index index…

Copilot Venture Studio創始合伙人楊林苑確認出席“邊緣智能2024 - AI開發者峰會”

隨著AI技術的迅猛發展&#xff0c;全球正逐步進入邊緣計算智能化與分布式AI深度融合的新時代&#xff0c;共同書寫著分布式智能創新應用的壯麗篇章。邊緣智能&#xff0c;作為融合邊緣計算和智能技術的新興領域&#xff0c;正逐漸成為推動AI發展的關鍵力量。借助分布式和去中心…

在Mac上恢复已删除文件夹的最佳方法

“嗨&#xff0c;我从我的Mac Documents文件夹中删除了很多文件夹。已删除的文件夹包含我的重要文档和文件&#xff0c;是否可以取回它们&#xff1f;垃圾桶已被清洁软件清空。如何在我的Mac上恢复已删除的文件夹&#xff1f; 当您在 Mac 上删除 1 或 2 个文件夹时&#xff0c…

字符串函数与字符函数运用(1)

字符串与字符函数介绍1 前言一、字符分类函数字符函数练习 二、字符函数转换1.引入库2.代码改进 字符串函数strlen函数strcpy 结尾 前言 字符串函数大概有以下这几种 strcpy、strcat 、strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror 这些函数可以很好的解决你…

Java 笔记 12:Java 方法的相关使用,方法重载、参数传递,以及递归等内容

一、前言 记录时间 [2024-05-02] 系列文章简摘&#xff1a; Java 笔记 01&#xff1a;Java 概述&#xff0c;MarkDown 常用语法整理 Java 笔记 02&#xff1a;Java 开发环境的搭建&#xff0c;IDEA / Notepad / JDK 安装及环境配置&#xff0c;编写第一个 Java 程序 Java 笔记 …

队列以及信号量

什么是队列 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;队列可以在任务与任务间、中断和任 务间传递信息。 为什么不使用全局变量&#xff1f; 如果使用全局变量&#xff0c;兔子&#xff08;任务1&#xff09;修改了变量 a &#xff0c;等待树…

vulnhub靶场之FunBox-1

一.环境搭建 1.靶场描述 Boot2Root ! This is a reallife szenario, but easy going. You have to enumerate and understand the szenario to get the root-flag in round about 20min. This VM is created/tested with Virtualbox. Maybe it works with vmware. If you n…

81、动态规划-爬楼梯

思路: 爬楼梯是一个特别经典的动态规划题&#xff0c;动态规划最好的办法就是从递归改到动态规划。 比如现在n阶楼梯&#xff0c;每次爬1阶或者2阶&#xff0c;一共有多少种方法。那么我就可以全排列&#xff0c;比如当前我可以走一阶算一下有多少种方法&#xff0c;然后我可…

1.C#图像区域分割与提取

&#xff08;1&#xff09;创建一个名为SplitImage的窗体的应用程序&#xff0c;将窗体改名为FormSplitImage。 &#xff08;2&#xff09;创建一个名为ImageProcessingLibrary的类库程序&#xff0c;为该工程添加名为ImageProcessing的静态类 &#xff08;3&#xff09;为Imag…

负债56亿,购买理财产品遭违约,操纵虚假粉丝,流量在下滑,客户数量减少,汽车之家面临大量风险(一)

本文由猛兽财经历时5个多月完成。猛兽财经将通过以下二十二个章节、8万字以上的内容来全面、深度的分析汽车之家这家公司。 由于篇幅限制&#xff0c;全文分为&#xff08;一&#xff09;到&#xff08;十&#xff09;篇发布。 本文为全文的第一章、第二章、第三章。 目录…