Nginx默认轮询实现无状态服务扩容的核心是“加机器+零配置”,需确保服务真正无状态(状态外存至Redis/DB、禁用本地文件上传)、启用健康检查、统一服务发现与监控。
用Nginx默认轮询做无状态服务扩容,核心是“加机器+零配置”,前提是服务真无状态、健康检查到位、上游注册及时。
确保服务真正无状态
无状态不是口号,得从数据存储和会话管理上落地:
所有用户状态(如登录态、临时缓存)必须存到外部系统(Redis、数据库),不能写在本地内存或磁盘
避免使用本地文件上传——改用对象存储(如MinIO、OSS)或统一文件服务
配置中心、日志采集、指标上报全部走中心化服务,不依赖单机路径或本地端口
用默认轮询(round-robin)快速接入新实例
Nginx默认就是轮询,无需额外配置
或
。只要把新服务IP:PORT加进
块,reload即可生效:
注意:新增后执行
,连接平滑过渡,旧请求不受影响。
配套必须做的三件事
光加机器不够,要让扩容真正可靠、可感知:
启用健康检查
:在
中加上
,自动摘除故障节点
统一服务发现入口
:用Consul、Nacos或简单脚本定期更新
配置并reload,避免手动维护IP列表
监控关键指标
:跟踪各上游的
、
和5xx比率,确认流量已均摊且无异常延迟
为什么不用ip_hash或least_conn?
默认轮询最适合无状态快速扩容场景:
会绑定客户端IP,导致扩容后部分节点负载突增,还可能因NAT失衡
虽更均衡,但需Nginx Plus或较新开源版(1.11.5+),且在连接数差异小时效果接近轮询
纯轮询简单、稳定、兼容性好,配合健康检查和足够实例数,实际负载偏差通常小于10%
weightip_hashupstreamupstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080; # 新增节点,直接加在这里
}nginx -s reloadupstreammax_fails=2 fail_timeout=30supstreamupstream_response_timeupstream_statusip_hashleast_conn