当STREAM上游主机不可用时,如何避免Nginx整体崩溃?
解决Nginx STREAM后端不可用导致整体崩溃的方案
修改后的配置
直接替换原有STREAM服务配置为以下内容即可:
server { listen 0.0.0.0:55; listen [::]:55; # 用变量存储后端地址,让Nginx仅在建立连接时动态解析域名,避免启动阶段依赖后端可用性 set $backend_host hostname:22; proxy_pass $backend_host; # 缩短连接超时时间,避免因后端不可用导致连接长时间挂起 proxy_connect_timeout 5s; proxy_timeout 10s; # 后端连接失败时直接丢弃请求,无需尝试重试(单后端场景下重试无意义) proxy_next_upstream off; }
配置逻辑说明
- 变量绕过启动时解析:Nginx默认会在启动阶段解析
proxy_pass中的静态域名,一旦域名解析失败或后端不可达,整个服务会启动失败。改用变量传递后端地址后,Nginx只会在有实际连接请求时才去解析域名,启动阶段不再受后端状态影响,其他服务可正常运行。 - 超时限制减少资源占用:短超时设置能快速终止与不可用后端的连接尝试,避免无效连接占用服务器资源。
- 关闭重试简化流程:单后端场景下开启重试只会增加无效操作,直接关闭后,后端不可用时会直接丢弃当前连接,不会影响其他服务的正常运行。
可选优化(针对DNS不稳定场景)
如果你的环境中DNS解析存在延迟或不稳定问题,可以在stream全局块中指定可靠的DNS服务器,提升域名解析的稳定性:
stream { # 配置公共DNS服务器,每30秒刷新一次解析缓存 resolver 8.8.8.8 1.1.1.1 valid=30s; server { listen 0.0.0.0:55; listen [::]:55; set $backend_host hostname:22; proxy_pass $backend_host; proxy_connect_timeout 5s; proxy_timeout 10s; proxy_next_upstream off; } }
内容的提问来源于stack exchange,提问作者Paillat
相关产品推荐
相关产品推荐

