我的踩坑实录:用Nginx搭建多节点负载均衡的完整指南
上周公司项目突然迎来流量高峰,单台服务器直接被打爆。作为团队里负责基础设施的倒霉蛋,我被迫在36小时内从零搭建起一套多节点负载均衡系统。今天就把这次实战经验整理出来,希望能帮到有同样需求的开发者。
为什么需要负载均衡?
记得第一次看到服务器监控图飙红时,我天真地以为升级配置就能解决问题。直到发现CPU使用率持续100%,响应时间突破5秒才明白:垂直扩展有极限。真正的解决方案是水平扩展 – 通过多台服务器分摊流量。
血泪教训: 负载均衡不仅是流量分发,还能实现故障转移。有次后端服务崩溃,幸亏配置了健康检查,Nginx自动把流量切到了备用节点。
环境准备:三台服务器的奇幻漂流
我的配置方案是:1台Nginx做负载均衡器 + 2台应用服务器。如果你在本地测试,用虚拟机就能模拟:
# 三台Ubuntu服务器
192.168.1.100 # 负载均衡器
192.168.1.101 # 应用服务器A
192.168.1.102 # 应用服务器B
建议先在测试环境验证配置,我在生产环境直接操作时,因为一个配置错误导致服务中断了17分钟(别学我)。
Nginx配置:从入门到精通
核心配置其实就几行代码,但魔鬼藏在细节里。这是我的最终版配置:
upstream backend {
# 加权轮询配置
server 192.168.1.101 weight=3;
server 192.168.1.102 weight=2;
# 30秒内失败3次就标记为不可用
server 192.168.1.101 backup max_fails=3 fail_timeout=30s;
}
server {
listen 80;
location / {
proxy_pass http://backend;
# 关键的头信息转发
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
特别注意proxy_set_header
这行,我当初漏掉后导致后端拿不到真实客户端IP,排查了整整两小时。
那些年我踩过的坑
- 会话保持问题: 用户登录状态丢失?需要配置
ip_hash
或使用Redis共享session - 健康检查误报: 某次Nginx认为所有节点都挂了,其实是检查接口返回了404
- 配置缓存: 修改后一定要
nginx -s reload
,重启服务会中断现有连接!
性能优化小技巧
经过压力测试后,我总结出几个有效优化点:
- 启用HTTP/2能显著提升并发性能
- 调整
keepalive_timeout
减少TCP握手开销 - 使用
least_conn
算法替代默认轮询,更均衡
现在这套系统已经稳定运行两周,成功扛住了日均50万PV。如果你也在搭建负载均衡,欢迎在评论区交流遇到的问题 – 毕竟我踩过的坑可能比某些人写的代码都多(笑)。
写得真详细!刚好最近也在搞负载均衡,那个proxy_set_header的问题我也遇到过,太真实了😅
开源技术生态园的路过,楼主分享的这个方案其实可以配合consul做服务发现更加动态
原来健康检查能用max_fails配置!以前都是自己写脚本定时检测