是的,Nginx 的 TCP 代理(通过 stream
模块实现)在默认情况下具备故障转移(failover)能力。当上游(upstream)组中的某个 server 节点失败时,Nginx 会自动尝试连接组内的其他可用 server。
关键机制说明
默认故障转移行为:
- Nginx 会按照配置的负载均衡策略(如轮询、最少连接等)选择 server。
- 如果连接一个 server 失败(如超时、拒绝连接或返回错误),Nginx 会标记该节点为“不可用”,并自动尝试下一个 server。
失败判定条件:
- 连接超时:由
proxy_connect_timeout
控制(默认 60s)。 - TCP 握手失败:如目标端口未监听或主机不可达。
- 代理协议错误:如 SSL 握手失败(若配置了 SSL)。
- 连接超时:由
重试机制:
- Nginx 默认不主动重试同一个失败的请求,但会为后续的新请求选择其他可用 server。
- 如果需要显式重试,需配置
proxy_next_upstream
(类似 HTTP 模块的逻辑,但在 TCP/UDP 代理中功能有限)。
配置示例
stream {
upstream backend {
# 上游服务器组
server backend1.example.com:3306;
server backend2.example.com:3306;
server backend3.example.com:3306 backup; # 备用节点
}
server {
listen 3306;
proxy_pass backend;
# 超时与健康检查
proxy_connect_timeout 3s; # 快速失败
proxy_timeout 10s; # 连接存活时间
# (可选)启用被动健康检查
health_check interval=10s passes=2 fails=3;
}
}
注意事项
被动 vs. 主动健康检查:
- Nginx TCP 代理默认依赖被动健康检查(即通过实际请求的失败触发故障转移)。
- Nginx Plus(商业版)支持主动健康检查(定期探测服务器状态)。
临时标记不可用:
- Nginx会根据
max_fails
(默认1)和fail_timeout
(默认10s)参数暂时将故障节点移出候选池。
- Nginx会根据
备份节点(backup):
backup
标记的server仅在所有非备份节点不可用时才会被使用。
日志监控建议:
error_log /var/log/nginx/tcp_error.log warn;
监控日志中的
no live upstreams
、connection refused
等错误。
验证方法
手动测试工具: 使用
telnet
或nc
模拟客户端请求,观察Nginx是否自动切换到其他节点:telnet nginx_proxy_ip port
强制触发故障转移: 临时关闭某个上游节点的服务端口,观察新请求是否会路由到其他节点。
如果需要更精细的控制,可以考虑结合Keepalived或商业版Nginx Plus的功能。
内容由零声教学AI助手提供,问题来源于学员提问