AWS Network Load Balancer前置Nginx出现Too many redirects问题求助
故障原因与解决方案
核心故障原因
你遇到的重定向循环与请求转发异常本质是四层负载均衡(AWS NLB)的特性和配置不匹配导致:
- AWS NLB工作在OSI四层,本身不会处理HTTP协议头,默认无法将原始请求的HTTPS协议信息传递给后端Nginx
- 你当前配置中Nginx的
$scheme变量读取的是NLB转发到80端口的HTTP协议,传给后端unicorn的X-Forwarded-Proto永远是http,如果unicorn配置了强制HTTPS跳转,就会触发请求循环 - 80和443流量都转发到后端80端口的配置,也会导致后端服务无法正确识别原始请求协议
修复步骤
第一步:调整NLB监听器配置
将NLB的80端口监听器规则修改为直接重定向到443端口,不再转发到后端目标组,公网所有HTTP请求会在NLB层直接跳转HTTPS,后端Nginx只会收到来自NLB 443监听器的请求,避免HTTP流量进入后端带来的逻辑混乱。
第二步:修改Nginx配置
调整@app块的请求头配置,强制指定X-Forwarded-Proto为https,确保后端unicorn可以正确识别原始请求为HTTPS协议,不会触发跳转。测试阶段建议临时注释HSTS头,避免浏览器缓存配置影响测试结果:
server { listen 80; server_name test.server.com; client_max_body_size 4M; keepalive_timeout 5; root /etc/project/public; try_files $uri/index.html $uri.html $uri @app; # 测试阶段先注释HSTS,确认无问题后再恢复 # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; add_header Referrer-Policy "strict-origin-when-cross-origin"; add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; add_header X-XSS-Protection "1; mode=block"; location @app { add_header X-Frame-Options ""; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 强制指定原始请求协议为HTTPS proxy_set_header X-Forwarded-Proto https; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; } }
修改配置后执行nginx -t验证配置合法性,再执行nginx -s reload重载配置生效。
第三步:排查多余SSL配置问题
你提到的Nginx SSL始终启用的问题,是因为残留了旧的443端口监听配置,执行nginx -T可以打印所有加载的Nginx配置文件,全局搜索listen 443相关的server块,删除多余配置后重载即可。
第四步:验证后端unicorn配置
确认unicorn加载的中间件(如Rack::SSL等)是通过X-Forwarded-Proto头判断请求协议,而不是直接读取当前请求的scheme,避免后端仍强制跳转HTTP协议。
验证方法
- 执行
curl -v http://test.server.com确认返回301跳转到HTTPS地址 - 执行
curl -v https://test.server.com/动态接口路径确认返回200状态码,无循环跳转
内容的提问来源于stack exchange,提问作者user3143913
相关产品推荐
相关产品推荐

