Nginx负载均衡的核心配置与调度算法
Nginx作为高性能反向代理服务器,其负载均衡功能是服务器运维中最常用的流量分发方案。与LVS的四层转发不同,Nginx工作在七层,可以根据HTTP头、URL路径、Cookie等应用层信息做智能路由。upstream模块是Nginx负载均衡的核心,支持轮询、权重、IP哈希和最少连接四种调度算法。
轮询(Round Robin)是默认策略,按顺序将请求分配到每台后端服务器。权重轮询通过weight参数调整分配比例,适合后端服务器配置不均的场景。IP哈希(ip_hash)将同一客户端IP固定到同一后端,解决Session一致性问题。最少连接(least_conn)将请求分配到当前连接数最少的服务器,适合请求处理时间差异较大的场景。
反向代理高可用架构设计
单台Nginx本身就是单点故障。生产环境通常采用Keepalived + Nginx双机热备方案,通过VRRP协议实现虚拟IP漂移。主节点故障时,备节点在秒级接管虚拟IP,对用户透明。
架构设计要点:两台Nginx配置完全一致,Keepalived监控Nginx进程存活状态,主节点定时发送VRRP通告,备节点收不到通告则触发故障转移。配合健康检查脚本,可以实现对Nginx进程的精确监控,避免虚拟IP漂移了但Nginx未启动的情况。
Keepalived + Nginx双机热备配置
主节点Keepalived配置:
# /etc/keepalived/keepalived.conf
global_defs {
router_id NGINX_MASTER
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass MySecret123
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_nginx
}
}
备节点配置仅需修改state为BACKUP,priority设为90:
# 备节点 /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass MySecret123
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_nginx
}
}
健康检查脚本:
#!/bin/bash
# /etc/keepalived/check_nginx.sh
if [ -z "$(pgrep nginx)" ]; then
systemctl start nginx
sleep 2
if [ -z "$(pgrep nginx)" ]; then
exit 1
fi
fi
exit 0
upstream后端健康检查与故障自动剔除
Nginx开源版默认不做主动健康检查,只有请求到达后端失败时才标记不可用。max_fails和fail_timeout参数控制被动检查行为:max_fails=3表示在fail_timeout=30s时间窗口内失败3次后标记不可用,30秒后重试。
主动健康检查需要Nginx Plus或第三方模块nginx_upstream_check_module。该模块支持主动探测后端服务存活状态,实时剔除故障节点,比被动检查更可靠。
Nginx负载均衡完整配置示例
upstream backend_pool {
least_conn;
server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.13:8080 weight=1 max_fails=3 fail_timeout=30s backup;
keepalive 32;
}
server {
listen 80;
server_name api.yunthe.com;
location / {
proxy_pass http://backend_pool;
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_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 5s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_next_upstream_tries 3;
}
}
会话保持与SSL终端卸载配置
ip_hash在客户端使用NAT或CDN时会失效,因为大量请求来自同一IP。更可靠的方案是用sticky cookie模块或应用层Token实现会话保持。sticky模块通过在响应中设置Cookie,将后续请求固定到同一后端。
SSL终端卸载让Nginx处理HTTPS加解密,后端服务只处理HTTP,降低后端CPU开销。服务器安全加固配置时需要注意将X-Forwarded-Proto头部传递给后端,确保应用正确识别原始协议。
server {
listen 443 ssl http2;
server_name api.yunthe.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
proxy_pass http://backend_pool;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}
proxy_next_upstream配置至关重要,指定哪些错误触发自动切换到下一台后端。error timeout http_502 http_503 http_504覆盖了连接失败、超时和常见服务端错误,配合proxy_next_upstream_tries限制重试次数,避免雪崩效应。keepalive 32启用长连接复用,减少TCP握手开销,在高并发场景下可提升20%以上吞吐量。高可用集群部署时,Keepalived的priority差值建议设为10-20,避免网络抖动导致频繁切换。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/nginx-fu-zai-jun-heng-yu-fan-xiang-dai-li-gao-ke-yong-pei/