负载均衡是啥
简单说就是把请求分发给多台后端服务器。单台扛不住,多台分摊压力。Nginx做这个事轻量、配置简单、性能好。
基本配置结构
先看一个最简配置:
http {
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
`upstream`块定义后端服务器组,`proxy_pass`把流量转过去。就这么简单。
五种负载均衡策略
1. 轮询(默认)
什么都不加就是轮询,请求按顺序轮流发给后端。适合后端服务器配置一样的情况。
2. 权重(weight)
服务器性能不一样时用权重:
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
}
10号机器处理能力强,给它3倍流量。Nginx按权重比例分配,不是绝对轮询。
3. IP哈希(ip_hash)
需要用户会话保持在同一个服务器时用:
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
同一个IP永远打到同一台机器。注意:如果某台挂了,这个IP的请求会转移到其他机器。
4. 最少连接(least_conn)
把请求发给当前连接数最少的服务器:
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
适合请求处理时间差异大的场景,长连接服务特别适合这个策略。
5. 一致性哈希(hash)
自定义key做哈希:
upstream backend {
hash $request_uri;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
按URL哈希,同一个URL永远到同一台。适合缓存场景,减少缓存穿透。
健康检查
Nginx免费版没有主动健康检查,只能做被动检查:
upstream backend {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}
连续失败3次,标记为不可用,30秒后重新尝试。生产环境建议用Nginx Plus或者自己写脚本做主动检查。
重试与超时
后端挂了别让用户一直等:
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
}
请求出错自动重试下一个后端,连接超时5秒,读取超时10秒。注意:幂等请求(GET)可以放心重试,POST类请求要谨慎,防止重复提交。
备份服务器
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080 backup;
}
12号机器平时不接流量,只有前两台全挂了才启用。适合冷备场景。
实际部署经验
– 服务器数量2-4台足够,太多反而增加Nginx负担。单机Nginx能扛几万并发,瓶颈一般在后端。
– 如果后端是Java应用,注意调整keepalive:
upstream backend {
server 192.168.1.10:8080;
keepalive 32;
}
保持长连接,减少TCP握手开销。
– 日志里加上upstream地址,方便排查:
log_format main '$remote_addr - $upstream_addr - $upstream_status';
踩坑提醒
– upstream里的server不要写域名,写IP。Nginx启动时解析一次域名,后面不会自动更新,除非配置resolver。
– 权重不要设太大差异,比如weight=100和weight=1,流量倾斜严重,小权重服务器基本吃不到请求。
– 如果后端服务器在同一个局域网,内网IP通信延迟更低。我习惯用雨云的服务器做后端,内网延迟不到1ms,性价比高,稳定好用,部署起来省心。
完整配置示例
http {
upstream backend {
least_conn;
server 10.0.0.2:8080 weight=3 max_fails=3 fail_timeout=30s;
server 10.0.0.3:8080 weight=2 max_fails=3 fail_timeout=30s;
server 10.0.0.4:8080 weight=1 backup;
keepalive 64;
}
server {
listen 80;
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
proxy_next_upstream error timeout http_500;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
测试配置:`nginx -t`,没问题就`nginx -s reload`。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容