Nginx负载均衡与反向代理高可用配置:从单机到集群的部署方案

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/

(0)
小编小编
上一篇 1小时前
下一篇 1小时前

相关推荐