ZBLOG

nginx tcp 代理,当连接一组server的某个节点失败时,会尝试连接另一个server吗

是的,Nginx 的 TCP 代理(通过 stream 模块实现)在默认情况下具备故障转移(failover)能力。当上游(upstream)组中的某个 server 节点失败时,Nginx 会自动尝试连接组内的其他可用 server。


关键机制说明

  1. 默认故障转移行为

    • Nginx 会按照配置的负载均衡策略(如轮询、最少连接等)选择 server。
    • 如果连接一个 server 失败(如超时、拒绝连接或返回错误),Nginx 会标记该节点为“不可用”,并自动尝试下一个 server。
  2. 失败判定条件

    • 连接超时:由 proxy_connect_timeout 控制(默认 60s)。
    • TCP 握手失败:如目标端口未监听或主机不可达。
    • 代理协议错误:如 SSL 握手失败(若配置了 SSL)。
  3. 重试机制

    • Nginx 默认不主动重试同一个失败的请求,但会为后续的新请求选择其他可用 server。
    • 如果需要显式重试,需配置 proxy_next_upstream(类似 HTTP 模块的逻辑,但在 TCP/UDP 代理中功能有限)。

配置示例

  1. stream {
  2. upstream backend {
  3. # 上游服务器组
  4. server backend1.example.com:3306;
  5. server backend2.example.com:3306;
  6. server backend3.example.com:3306 backup; # 备用节点
  7. }
  8. server {
  9. listen 3306;
  10. proxy_pass backend;
  11. # 超时与健康检查
  12. proxy_connect_timeout 3s; # 快速失败
  13. proxy_timeout 10s; # 连接存活时间
  14. # (可选)启用被动健康检查
  15. health_check interval=10s passes=2 fails=3;
  16. }
  17. }

注意事项

  1. 被动 vs. 主动健康检查

    • Nginx TCP 代理默认依赖被动健康检查(即通过实际请求的失败触发故障转移)。
    • Nginx Plus(商业版)支持主动健康检查(定期探测服务器状态)。
  2. 临时标记不可用

    • Nginx会根据 max_fails (默认1)和 fail_timeout (默认10s)参数暂时将故障节点移出候选池。
  3. 备份节点(backup)

    • backup标记的server仅在所有非备份节点不可用时才会被使用。
  4. 日志监控建议

    1. error_log /var/log/nginx/tcp_error.log warn;

    监控日志中的 no live upstreamsconnection refused等错误。


验证方法

  1. 手动测试工具: 使用 telnetnc模拟客户端请求,观察Nginx是否自动切换到其他节点:

    1. telnet nginx_proxy_ip port
  2. 强制触发故障转移: 临时关闭某个上游节点的服务端口,观察新请求是否会路由到其他节点。

如果需要更精细的控制,可以考虑结合Keepalived或商业版Nginx Plus的功能。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23170

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?