nginx的前世今生(二)

news2024/12/22 22:16:01

书接上回:

上回书说到,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段访问
        
        # 允许所有其他未明确禁止的IP
        allow 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访问
        
        # 拒绝所有不在白名单中的IP
        deny 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端口,开启SSL
    server_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.coloradmin.cn/o/1639298.html

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

相关文章

图片高效批量美化,支持将图片进行旋转180度并生成浴室玻璃图片,让图片瞬间焕然一新!

图片已成为我们生活与工作中不可或缺的一部分。然而,一张张手动美化图片却是一项既耗时又耗力的任务。为了帮助您轻松应对这一挑战,我们推出了一款高效批量美化图片的工具,并支持将图片旋转180度及生成浴室玻璃效果,让您的图片瞬间…

安装英伟达nvidia p4计算卡驱动@FreeBSD14

FreeBSD也能跑cuda AI训练拉! 在FreeBSD安装好pytorch和飞桨cpu版本后,尝试安装英伟达nvidia p4计算卡驱动。毕竟全靠cpu速度太慢了,还是GPU快啊!在磕磕绊绊几天后,终于成功成功安装好nvidia p4的cuda驱动&#xff0c…

拆单算法交易(Algorithmic Trading)

TWAP TWAP交易时间加权平均价格Time Weighted Average Price 模型,是把一个母单的数量平均地分配到一个交易时段上。该模型将交易时间进行均匀分割,并在每个分割节点上将拆分的订单进行提交。例如,可以将某个交易日的交易时间平均分为N 段&am…

密码学基础练习五道 RSA、elgamal、elgamal数字签名、DSA数字签名、有限域(GF)上的四则运算

1.RSA #include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h>#include <time.h>#define PRIME_MAX 200 //生成素数范围#define EXPONENT_MAX 200 //生成指数e范围#define Element_Max 127 //加密单元的…

26版SPSS操作教程(高级教程第十八章)

目录 前言 粉丝及官方意见说明 第十八章一些学习笔记 第十八章一些操作方法 经典判别分析 数据假设 具体操作 结果解释 判别结果的图形化展示 结果解释 判别效果验证 结果解释 适用条件的判断 结果解释 贝叶斯判别分析 具体操作 结果解释 逐步判别法 结束语…

Redis---------实现查询缓存业务

目录 数据库与缓存之间的工作业务逻辑&#xff1a; 接下来看查询缓存代码实现&#xff0c;主要是捋清楚业务逻辑&#xff0c;代码实现是死的&#xff1a; Controller: Service: P37作业实现&#xff1a;总体逻辑跟上面的业务逻辑差不多 Controller&#xff1a; Service&#…

【项目构建】04:动态库与静态库制作

OVERVIEW 1.编译动态链接库&#xff08;1&#xff09;编译动态库&#xff08;2&#xff09;链接动态库&#xff08;3&#xff09;运行时使用动态库 2.编译静态链接库&#xff08;1&#xff09;编译静态库&#xff08;2&#xff09;链接静态库&#xff08;3&#xff09;运行时使…

数字身份管理:Facebook如何利用区块链技术?

随着数字化进程的加速&#xff0c;个人身份管理已成为一个关键议题。在这方面&#xff0c;区块链技术正在逐渐展现其巨大潜力。作为全球最大的社交媒体平台&#xff0c;Facebook也在积极探索和应用区块链技术来改进其数字身份管理系统。本文将深入探讨Facebook如何利用区块链技…

【Docker学习】docker start深入研究

docker start也是很简单的命令。但因为有了几个选项&#xff0c;又变得复杂&#xff0c;而且... 命令&#xff1a; docker container start 描述&#xff1a; 启动一个或多个已停止的容器。 用法&#xff1a; docker container start [OPTIONS] CONTAINER [CONTAINER...] 别名&…

【软件工程】需求分析

目录 前言需求分析UML概述用例图用例图的组成用例图中的符号和含义包含的两种使用场景 用例图补充&#xff1a;“系统”用例模型建模确定系统参与者确定系统用例 用例文档用例文档组成部分 活动图组成元素初始节点和终点活动节点转换决策与分支、合并分岔与汇合 类图类的表示类…

【DevOps】怎么找合适的Docker镜像?

目录 一、Docker Hub介绍 主要特点和功能 使用场景 二、怎么找合适的镜像 步骤 1: 访问 Docker Hub 步骤 2: 使用搜索功能 步骤 3: 分析搜索结果 步骤 4: 阅读详细描述 步骤 5: 下载并使用镜像 例子 三、怎么样使用国内镜像加速 常用的国内 Docker 镜像加速器地址 …

2023下半年软件设计师上午题——冒泡排序

快速排除法&#xff0c;根据冒泡排序特性&#xff0c;每一趟排序都会确实最大/最小值&#xff0c;故升序两趟后&#xff0c;最后两个元素应该是已经排序好的第二大&#xff0c;和最大的元素&#xff0c;所以排除B,D&#xff0c;再因为每次排序都会两两交换&#xff0c;所以排除…

C语言-调试技巧

目录 一、调试介绍1.1 Debug和Release的介绍1.2 Windows环境调试介绍1.2.1 学会快捷键1.2.2 查看临时变量的值1.2.3 查看内存信息1.2.4 查看调用堆栈1.2.4 查看汇编信息1.2.5 查看寄存器信息 二、编程常见的错误2.1 编译型错误2.2 链接型错误2.3 运行时错误 三、易于调试的代码…

如何配置和使用Apollo的component里的plugin

关于如何使用Apollo的Component里的plugin&#xff0c;在Apollo的文档里只有如果和开发的说明却没有找到一个清楚完整说明怎么把plugin跑起来的说明&#xff0c;例如我想把lidar_detection_filter按我们的需求对目标过滤算法作修改然后编译完后&#xff0c;执行 cyber_launch …

刷题训练之位运算

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握位运算算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…

菜鸡学习netty源码(一)——ServerBootStrap启动

1.概述 对于初学者而然,写一个netty本地进行测试的Server端和Client端,我们最先接触到的类就是ServerBootstrap和Bootstrap。这两个类都有一个公共的父类就是AbstractBootstrap. 那既然 ServerBootstrap和Bootstrap都有一个公共的分类,那就证明它们两个肯定有很多公共的职…

代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

977.有序数组的平方 题目链接https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 题解&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ int* sortedSquares(int* nums, int numsSize, int* returnSize) {/…

【Vue中的Ajax配置代理slot插槽】

Vue脚手架配置代理 安装命令 npm install axios vue.config.js 是一个可选的配置文件 如果项目的(和package . json同级的)根目录中存在这个文件&#xff0c; 那么它会被vue/cli-service自动加载 你也可以使用package.json中的 [vue字段&#xff0c;但是注意这种写法需要你严格…

Vue入门篇:样式冲突scoped,data函数,组件通信,prop data单向数据流,打包发布

这里写目录标题 1.组件的样式冲突scoped2.data函数3.组件通信1.两种组件关系分类和对应的组件通信方案2.父子通信方案的核心流程 4.prop & data、单向数据流5.打包发布6.打包优化:路由懒加载 1.组件的样式冲突scoped 默认情况:写在组件中的样式会全局生效→因此很容易造成多…

axios.get请求 重复键问题??

封装的接口方法&#xff1a; 数据&#xff1a; 多选框多选后 能得到对应的数组 但是请求的载荷却是这样的,导致会请求不到数据 departmentChecks 的格式看起来是一个数组&#xff0c;但是通常 HTTP 请求的查询参数不支持使用相同的键&#xff08;key&#xff09;名多次。如…