Nginx负载均衡配置实战:高可用集群与健康检查方案

Nginx作为反向代理服务器,负载均衡是其核心功能之一。在生产环境中,单台后端服务器无法满足高并发需求,通过Nginx将请求分发到多台后端服务器,不仅能提升处理能力,还能在单机故障时自动切换,实现高可用。本文从配置方法、调度算法、健康检查三个维度展开。

Nginx负载均衡基础配置

Nginx的负载均衡通过upstream模块实现。以下是一个基础配置示例,将请求轮询分发到三台后端服务器:

http {
    upstream backend {
        server 192.168.1.101:8080;
        server 192.168.1.102:8080;
        server 192.168.1.103:8080;
    }

    server {
        listen 80;
        server_name api.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;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

proxy_set_header是负载均衡配置中容易遗漏的部分。如果不设置X-Real-IP和X-Forwarded-For,后端服务器收到的源IP全部是Nginx的IP,日志分析和IP限制功能将失效。X-Forwarded-Proto标记原始协议类型,后端据此判断是否为HTTPS请求。

负载均衡调度算法详解

Nginx默认使用轮询(Round Robin)算法,请求依次分配。实际生产环境中需要根据场景选择合适的调度算法。

加权轮询(Weighted Round Robin):为性能不同的后端服务器分配不同权重,配置简单直接。

upstream backend {
    server 192.168.1.101:8080 weight=3;  # 高配服务器,处理3倍请求
    server 192.168.1.102:8080 weight=2;
    server 192.168.1.103:8080 weight=1;  # 低配服务器
}

IP哈希(ip_hash):根据客户端IP做哈希固定分配到同一后端,实现会话保持。缺点是后端服务器增减时哈希重分布,已有会话会断开。

upstream backend {
    ip_hash;
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

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

upstream backend {
    least_conn;
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

一致性哈希(hash):Nginx商业版默认支持一致性哈希,开源版需通过第三方模块或Lua脚本实现。一致性哈希在节点增减时只影响相邻节点上的数据,减少会话重分布。

服务器健康检查机制配置

Nginx开源版默认的健康检查是被动的——只有当请求转发到某台服务器失败时,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;
    server 192.168.1.103:8080 max_fails=3 fail_timeout=30s backup;
}

# max_fails:30秒内失败3次则标记为不可用
# fail_timeout:不可用后等待30秒再尝试恢复
# backup:备份服务器,仅当主服务器全部不可用时才启用

被动检查的局限性在于:故障发现依赖实际请求,如果某台服务器宕机但没有请求打到它上面,Nginx不会感知。主动健康检查需要借助nginx_upstream_check_module模块或Nginx Plus。

使用nginx_upstream_check_module实现主动检查:

upstream backend {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    
    # 主动健康检查:每3秒检查一次,超时1秒,连续2次失败标记不可用,连续2次成功恢复
    check interval=3000 rise=2 fall=2 timeout=1000 type=http;
    check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

server {
    location /status {
        check_status;          # 访问/status查看后端健康状态
        access_log off;
    }
}

后端服务器需要实现/health接口,返回2xx状态码表示健康。接口内部可以检查数据库连接、缓存连接、磁盘空间等关键依赖项。

Keepalived实现Nginx高可用双机热备

Nginx本身是单点,需要Keepalived配合实现VIP浮动。两台Nginx服务器一主一备,通过VRRP协议共享VIP,主节点宕机时VIP自动漂移到备节点。

# /etc/keepalived/keepalived.conf — 主节点
global_defs {
    router_id NGINX_MASTER
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -20
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass MyPass123
    }
    
    virtual_ipaddress {
        192.168.1.100
    }
    
    track_script {
        chk_nginx
    }
}
#!/bin/bash
# /etc/keepalived/check_nginx.sh
if ! pidof nginx > /dev/null; then
    systemctl restart nginx
    sleep 2
    if ! pidof nginx > /dev/null; then
        systemctl stop keepalived
    fi
fi

备节点配置基本相同,state改为BACKUP,priority设为90。check_nginx.sh脚本检测Nginx进程是否存活,先尝试重启,重启仍失败则关闭Keepalived触发VIP漂移。weight参数确保即使Nginx短暂故障也能降低优先级,提前触发切换。

负载均衡性能调优参数

高并发场景下需要对Nginx做内核参数和Nginx自身参数的双重调优。以下参数写入/etc/sysctl.conf:

# TCP连接复用
net.ipv4.tcp_tw_reuse = 1
# 增加文件描述符上限
fs.file-max = 655350
# 减少TIME_WAIT状态超时
net.ipv4.tcp_fin_timeout = 15
# 增加SYN队列长度
net.ipv4.tcp_max_syn_backlog = 65535
# 增加全连接队列长度
net.core.somaxconn = 65535

Nginx配置层面,worker_processes设为auto自动匹配CPU核心数,worker_connections根据业务并发量设置,通常10000-65535。开启keepalive_timeout复用后端连接,减少TCP握手开销:

worker_processes auto;
events {
    worker_connections 65535;
    use epoll;
}
http {
    upstream backend {
        server 192.168.1.101:8080;
        keepalive 32;  # 保持32个空闲长连接
    }
    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";  # 清除Connection头,启用长连接
    }
}

upstream块中的keepalive参数保持到后端的长连接池,避免每次请求都新建TCP连接。proxy_http_version和Connection空值是长连接生效的必要条件,缺一不可。

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

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

相关推荐