为什么需要负载均衡?
当单台服务器无法承载高并发流量时,负载均衡通过将请求分发到多台后端服务器,实现水平扩展。Nginx作为高性能反向代理服务器,内置负载均衡功能,无需额外软件即可实现。
Nginx upstream基本配置
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
负载均衡策略详解
轮询(Round Robin,默认):请求按顺序依次分发到每台后端服务器,适合服务器配置相近的场景。
权重(Weight):根据服务器性能分配不同权重,性能强的服务器承担更多请求。
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
}
IP哈希(ip_hash):同一客户端IP始终访问同一后端,适合需要Session保持的场景。
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
最少连接(least_conn):将请求分发给当前活跃连接数最少的服务器,适合请求处理时间差异较大的场景。
健康检查配置
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;
server 192.168.1.12:8080 backup; # 备用节点
}
参数说明:max_fails表示30秒内失败超过3次则标记为不可用;fail_timeout定义检测时间窗口和不可用持续时间;backup标记备用节点,仅主节点全部不可用时启用。
连接超时优化
location / {
proxy_pass http://backend;
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_next_upstream error timeout http_500 http_502 http_503;
}
proxy_next_upstream指定当后端返回特定错误时,自动重试其他节点,大幅提升可用性。
Session保持方案
在多节点场景下,Session保持是常见挑战。推荐方案:
- Redis集中存储Session:所有节点共享同一Redis,最为推荐
- IP哈希:简单但当节点变化时路由会打乱
- JWT无状态认证:彻底解决Session问题的现代方案
验证负载均衡效果
每个后端节点返回不同内容(如节点编号),然后连续请求:for i in $(seq 1 9); do curl -s http://example.com/node; done,观察返回是否轮流切换,验证负载均衡生效。