Nginx高性能负载均衡配置实战:upstream模块与健康检查机制

Nginx作为反向代理和负载均衡器在Web架构中广泛应用。upstream模块支持多种负载均衡算法和健康检查策略,合理配置可实现流量均匀分配和故障自动剔除。网站运维中,Nginx负载均衡是保障服务高可用的核心组件。

upstream负载均衡算法配置

Nginx支持四种负载均衡算法,每种适用于不同场景:

轮询(round-robin):默认算法,按顺序依次分配请求到后端服务器。适合后端服务器配置相同的场景。

加权轮询(weighted round-robin):按权重分配请求,权重高的服务器接收更多请求。适合后端服务器配置不同的情况。

最少连接(least_conn):将请求分配给当前连接数最少的服务器。适合长连接或请求处理时间差异大的场景。

IP哈希(ip_hash):基于客户端IP计算哈希值,同一IP的请求始终分配到同一服务器。适合需要会话保持的场景。

# /etc/nginx/conf.d/load_balancer.conf

# 加权轮询配置
upstream web_backend {
    server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 weight=2 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 weight=1 max_fails=3 fail_timeout=30s;
    # backup服务器,仅当主服务器全部不可用时启用
    server 192.168.1.13:8080 backup;
}

# 最少连接配置
upstream api_backend {
    least_conn;
    server 10.0.0.1:3000 max_fails=2 fail_timeout=15s;
    server 10.0.0.2:3000 max_fails=2 fail_timeout=15s;
    server 10.0.0.3:3000 max_fails=2 fail_timeout=15s;
}

# IP哈希配置(会话保持)
upstream session_backend {
    ip_hash;
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080;
}

server {
    listen 80;
    server_name lb.example.com;

    location /web/ {
        proxy_pass http://web_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;
        proxy_connect_timeout 5s;
        proxy_read_timeout 30s;
        proxy_send_timeout 10s;
    }

    location /api/ {
        proxy_pass http://api_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

被动健康检查机制配置

Nginx内置被动健康检查,通过max_fails和fail_timeout参数实现。当后端服务器在fail_timeout时间内失败次数达到max_fails,Nginx会暂时将其标记为不可用,在fail_timeout时间后重新尝试。

upstream backend_with_passive_check {
    # max_fails=3: 在fail_timeout窗口内允许3次失败
    # fail_timeout=30s: 30秒内失败3次后,该服务器被标记为不可用30秒
    server 192.168.1.10:8080 weight=1 max_fails=3 fail_timeout=30s;

    # slow_start=10s: 服务器恢复后逐渐增加权重,避免流量涌入压垮
    # 仅商业版Nginx Plus支持slow_start
    server 192.168.1.11:8080 weight=1 max_fails=3 fail_timeout=30s slow_start=10s;
}

# proxy_next_upstream - 请求重试到下一台服务器
server {
    listen 80;
    location / {
        proxy_pass http://backend_with_passive_check;

        # 当后端返回以下错误时,自动重试到下一台服务器
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504;

        # 最多重试次数
        proxy_next_upstream_tries 3;

        # 重试超时总时间
        proxy_next_upstream_timeout 10s;
    }
}

主动健康检查:nginx_upstream_check_module

Nginx开源版不支持主动健康检查,需通过第三方模块nginx_upstream_check_module实现。主动健康检查定期探测后端服务器状态,比被动检查更及时。

# 编译安装(需重新编译Nginx)
# 下载模块
git clone https://github.com/yaoweibin/nginx_upstream_check_module.git

# 编译Nginx时添加模块
cd nginx-1.24.0
./configure --add-module=../nginx_upstream_check_module
make && make install

# 配置主动健康检查
upstream backend_with_active_check {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;

    # 主动健康检查配置
    check interval=3000 rise=2 fall=3 timeout=2000 type=http;
    # interval=3000  每3秒检查一次
    # rise=2         连续成功2次标记为可用
    # fall=3         连续失败3次标记为不可用
    # timeout=2000   检查超时2秒
    # type=http      使用HTTP协议检查

    # 指定检查的URI和期望响应
    check_http_send "HEAD /health HTTP/1.1\r\nHost: backend\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

# 健康检查状态页
server {
    listen 80;
    server_name health.example.com;

    location /status {
        check_status;
        access_log off;
        # 允许内网访问
        allow 192.168.1.0/24;
        deny all;
    }
}

连接保持与性能优化参数

Nginx到后端的连接保持(keepalive)可减少TCP连接建立开销,对高并发场景尤为重要:

upstream backend_keepalive {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;

    # 保持到后端的长连接池
    keepalive 32;
    # 保持连接的超时时间
    keepalive_timeout 60s;
    # 每个连接最大请求数
    keepalive_requests 1000;
}

server {
    listen 80;

    location / {
        proxy_pass http://backend_keepalive;

        # 启用HTTP/1.1支持keepalive
        proxy_http_version 1.1;
        # 清除Connection头,防止传递close
        proxy_set_header Connection "";

        # 连接优化
        proxy_connect_timeout 5s;
        proxy_send_timeout 30s;
        proxy_read_timeout 60s;

        # 缓冲区配置
        proxy_buffering on;
        proxy_buffer_size 16k;
        proxy_buffers 8 32k;
        proxy_busy_buffers_size 64k;

        # 临时文件写入阈值(超过则写磁盘)
        proxy_max_temp_file_size 1024m;
    }
}

蓝绿部署与灰度发布配置

通过upstream权重调整可实现蓝绿部署和灰度发布:

# 蓝绿部署: 100%流量切换
upstream blue_green {
    # 蓝组(当前活跃)
    server 192.168.1.10:8080 weight=10;
    # 绿组(待切换)
    server 192.168.1.20:8080 weight=0 down;
    # 切换时: 将蓝组设为down,绿组设为weight=10
}

# 灰度发布: 按比例分流
upstream canary {
    # 稳定版接收90%流量
    server 192.168.1.10:8080 weight=90;
    # 金丝雀版接收10%流量
    server 192.168.1.20:8080 weight=10;
}

# 按请求头灰度分流(使用split_clients模块)
split_clients "\${remote_addr}\${http_x_user_id}" $backend_pool {
    10%  canary_pool;
    *    stable_pool;
}

upstream stable_pool {
    server 192.168.1.10:8080;
}

upstream canary_pool {
    server 192.168.1.20:8080;
}

server {
    listen 80;
    location / {
        proxy_pass http://$backend_pool;
    }
}

Nginx负载均衡配置需要结合实际流量特征和后端服务能力进行调整。生产环境中建议配合监控系统(如Prometheus + nginx_exporter)实时观测各后端服务器的QPS、响应时间、错误率等指标,基于数据驱动调优权重和健康检查参数。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/nginx-gao-xing-neng-fu-zai-jun-heng-pei-zhi-shi-zhan/

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

相关推荐