You need to enable JavaScript to run this app. Nginx配置跨端口Host重定向后多次访问出现网页崩溃问题
优惠活动
大模型
产品
解决方案
定价
更多

Nginx配置跨端口Host重定向后多次访问出现网页崩溃问题

问题根因
  • 重定向逻辑存在循环跳转漏洞,触发请求风暴导致资源耗尽
    你当前的跳转规则存在逻辑缺陷:
    • 2206端口的server块逻辑为「任何Host不等于server-block-1.test.ml的请求,全部301跳转到8206端口」
    • 8206端口的server块逻辑为「任何Host不等于server-block-2.test.ml的请求,全部301跳转到2206端口」
      只要遇到Host既不是server-block-1.test.ml、也不是server-block-2.test.ml的请求(比如陌生爬虫、被恶意指向的域名、测试时输入的错误域名),请求就会在两个端口之间来回301跳转,形成无限循环。
      301属于永久重定向,浏览器、爬虫会长期缓存这条跳转规则,短时间内就会产生大量重复请求,快速占满Nginx的连接数、文件描述符、内存资源,此时新的正常请求会被直接拒绝,外部表现就是网页崩溃无法访问。当所有循环请求因为超时断开、资源释放后,服务就会自行恢复。
  • 异常跳转叠加,进一步放大无效流量
    你在2206端口的server块里配置了error_page 497处理HTTP访问HTTPS端口的场景,当循环请求里出现「用HTTPS协议访问8206端口」的情况时,会触发497错误再发起一次跳转,进一步增加循环请求的量级。
  • 错误日志的匹配佐证
    你贴的日志里反复出现signal process started记录,本质是Nginx master进程检测到worker进程因为连接/内存占满,主动发送信号重启worker进程;而循环请求全程由Nginx直接返回301响应,不会打到后端PHP服务,因此不会出现502、404这类常规错误日志,和当前日志的表现完全吻合。
对应的解决方法
  • 修正重定向规则,从根源杜绝循环跳转
    将两个server块里的Host判断逻辑从「非本域名就跳转」改成「仅匹配对应用域才跳转,其他不匹配的请求直接断开连接」,彻底消除循环路径:
    • 2206端口(SSL)的原跳转规则替换为:
    # 仅当Host是server-block-2.test.ml时,才跳转到8206端口的对应服务
    if ($host = server-block-2.test.ml) {
        return 301 http://$host:8206$request_uri;
    }
    # 其他不匹配本服务域名的请求直接断开,不返回跳转响应
    if ($host != server-block-1.test.ml) {
        return 444;
    }
    
    • 8206端口(HTTP)的原跳转规则替换为:
    # 仅当Host是server-block-1.test.ml时,才跳转到2206端口的对应服务
    if ($host = server-block-1.test.ml) {
        return 301 https://$host:2206$request_uri;
    }
    # 其他不匹配本服务域名的请求直接断开
    if ($host != server-block-2.test.ml) {
        return 444;
    }
    
    注:444是Nginx特有的响应状态码,会直接断开客户端连接,不返回任何响应头和响应体,比返回301/404更节省服务器资源,能快速过滤无效的爬虫、错误域名请求。
  • 增加流量限制,避免异常请求打满服务
    在Nginx的http配置段添加限速规则,在两个server块里应用,就算有残留的循环请求、恶意爬取,也会被控制在合理的请求量级:
    # 在http块里定义单IP限速规则,10M共享内存存储IP状态,单IP每秒最多10个请求
    limit_req_zone $binary_remote_addr zone=per_ip_limit:10m rate=10r/s;
    
    然后在每个server块的根配置下加:
    # 允许突发20个请求,超过直接拒绝
    limit_req zone=per_ip_limit burst=20 nodelay;
    
  • 调整Nginx基础运行参数,提升资源冗余度
    修改主配置nginx.conf的全局参数,避免小流量异常就导致服务崩溃:
    • 增加worker_rlimit_nofile 65535;,给worker进程开放足够的文件描述符上限
    • 调整worker_connections数值到10240,提升单worker的最大并发连接数
    • 缩短keepalive_timeout到15s,让空闲连接快速释放,避免被无效请求长期占用
  • 清理301缓存残留
    因为301永久重定向会被客户端、爬虫长期缓存,就算修正了配置,之前缓存了循环跳转规则的客户端还是会持续发起请求。测试阶段可以临时把return 301改成return 302临时重定向,待功能验证正常后再改回301,同时清理浏览器的跳转缓存,避免残留影响。

内容的提问来源于stack exchange,提问作者noobinprogramming

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 08:36:08