在互联网应用的实际运行中,我们经常会遇到这样的场景:当用户量突然激增时,单台服务器很容易因为资源耗尽而崩溃。我曾经负责过一个电商项目,在促销活动开始后的5分钟内,主服务器CPU直接飙到100%,导致整个网站无法访问。这就是典型的单点故障问题。
负载均衡技术通过将流量分散到多台服务器,能够有效解决这个问题。具体来说,它能带来三个核心价值:
在开始配置前,我们需要准备:
安装Nginx时有个小技巧:建议使用官方源而不是系统默认源,能获得最新稳定版:
bash复制# CentOS示例
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
sudo yum install nginx -y
Nginx的负载均衡配置主要涉及upstream模块,这是我最常用的生产级配置模板:
nginx复制upstream backend {
# 基础服务器配置
server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 max_fails=3 fail_timeout=30s;
# 健康检查配置
keepalive 32;
keepalive_timeout 60s;
# 负载均衡算法
least_conn; # 最少连接算法
}
server {
listen 80;
server_name api.yourdomain.com;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
# 关键头信息传递
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超时设置
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
proxy_send_timeout 30s;
}
}
这个配置有几个关键点需要注意:
max_fails和fail_timeout实现了自动故障转移keepalive复用TCP连接提升性能least_conn算法适合处理时间不均衡的场景对于需要会话保持的应用,我们有三种实现方案:
IP Hash(简单但不够灵活)
nginx复制upstream backend {
ip_hash;
server 192.168.1.101;
server 192.168.1.102;
}
Sticky Cookie(推荐方案)
nginx复制upstream backend {
sticky cookie srv_id expires=1h domain=.yourdomain.com path=/;
server 192.168.1.101;
server 192.168.1.102;
}
自定义Header(最灵活但需要应用配合)
nginx复制map $http_x_session_id $backend_server {
default "";
"user1" 192.168.1.101;
"user2" 192.168.1.102;
}
在生产环境中,我们经常需要根据服务器性能动态调整权重。可以通过Nginx Plus的API或开源方案实现:
bash复制# 动态调整权重示例
curl -X PATCH -d '{"weight":2}' http://localhost/api/3/http/upstreams/backend/servers/1
对于超大规模应用,建议采用分层负载均衡架构:
code复制客户端 → L7负载均衡(Nginx) → L4负载均衡(LVS) → 应用服务器集群
这种架构下,Nginx负责:
建议监控以下核心指标:
nginx.active_connectionsnginx.request_ratenginx.upstream_response_timenginx.error_rate使用Prometheus监控的配置示例:
nginx复制server {
listen 9145;
location /metrics {
stub_status on;
access_log off;
}
}
问题1:502 Bad Gateway
tail -f /var/log/nginx/error.logcurl -v http://backend-server问题2:负载不均衡
nginx -T验证完整配置ss -tnp查看实际连接分布问题3:性能瓶颈
worker_processes为CPU核心数worker_connections(建议值:worker_connections = 1024 * worker_processes)sendfile和tcp_nopush经过多个项目的实战验证,我总结出以下经验:
容量规划:每台后端服务器建议预留30%的CPU和内存余量,以应对突发流量
灰度发布:通过权重调整实现平滑发布
nginx复制upstream backend {
server 192.168.1.101 weight=10; # 新版本
server 192.168.1.102 weight=90; # 旧版本
}
跨机房部署:使用geo模块实现就近访问
nginx复制geo $backend_pool {
default backend_beijing;
10.0.0.0/8 backend_shanghai;
}
安全防护:在负载均衡层实现基础防护
limit_req_zonelimit_conn_zonegeo模块性能压测:使用wrk进行基准测试
bash复制wrk -t4 -c1000 -d60s --latency http://yourdomain.com
在实际项目中,我曾经通过优化Nginx的keepalive_timeout参数,将API的QPS从800提升到1500。关键是要根据监控数据持续调整参数,而不是简单地套用默认值。