Nginx负载均衡配置实战:Upstream健康检查与会话保持策略

Nginx负载均衡的基本配置方法

Nginx作为高性能反向代理服务器,负载均衡是其最核心的功能之一。通过upstream模块定义后端服务器池,Nginx将客户端请求按照指定算法分发到多台后端服务器,实现流量分配和故障转移。与LVS等四层负载均衡器不同,Nginx工作在七层,可以根据HTTP头部、URL路径、Cookie等信息做智能路由决策。

一个基础的upstream配置如下:

http {
    upstream backend {
        server 192.168.1.10:8080 weight=3;
        server 192.168.1.11:8080 weight=2;
        server 192.168.1.12:8080 weight=1;
    }

    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_connect_timeout 5s;
            proxy_read_timeout 30s;
        }
    }
}

weight参数控制服务器权重,权重越高的服务器接收的请求越多。上述配置中三台服务器的流量比例约为3:2:1。proxy_connect_timeout设置连接超时为5秒,避免后端不可达时长时间阻塞。

负载均衡算法的选择与配置

Nginx内置四种负载均衡算法,适用于不同场景:

# 1. 轮询(默认):按顺序逐一分配
upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

# 2. 加权轮询:按权重分配
upstream backend {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=1;
}

# 3. ip_hash:基于客户端IP哈希固定分配
upstream backend {
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

# 4. least_conn:优先分配给连接数最少的服务器
upstream backend {
    least_conn;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

轮询适合后端服务器性能相近的场景。加权轮询在服务器配置不一时使用,将更多流量分配给高性能机器。ip_hash实现会话保持,同一客户端IP始终路由到同一后端服务器,适合需要粘性会话的应用。least_conn适合请求处理时间差异较大的场景,避免长请求堆积到同一服务器。

被动健康检查与故障转移配置

Nginx开源版内置被动健康检查机制。当后端服务器返回错误或超时后,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=3表示在fail_timeout时间段内连续失败3次后标记为不可用。fail_timeout=30s表示不可用状态持续30秒后重新尝试。backup参数标记备用服务器,仅在所有主服务器不可用时才启用。

被动检查的局限在于无法主动探测后端健康状态。Nginx Plus(商业版)提供主动健康检查功能,可以定期向后端发送健康探测请求:

# Nginx Plus 主动健康检查
upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    health_check interval=5s fails=3 passes=2 uri=/health;
}

开源替代方案是结合nginx_upstream_check_module第三方模块,或使用Consul/etcd等服务发现工具配合动态upstream配置。

会话保持策略的实现

除了ip_hash之外,Nginx还支持基于Cookie的会话保持。这种方式比ip_hash更灵活,不受客户端IP变化影响:

# Nginx Plus 基于Cookie的粘性会话
upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    sticky cookie srv_id expires=1h domain=.example.com path=/;
}

对于开源版Nginx,可以通过lua模块实现类似的Cookie会话保持:

# 使用lua实现简单的会话保持
upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

server {
    location / {
        set $backend '';
        access_by_lua_block {
            local cookie = ngx.var.cookie_backend_id
            if cookie == 's1' then
                ngx.var.backend = '192.168.1.10:8080'
            elseif cookie == 's2' then
                ngx.var.backend = '192.168.1.11:8080'
            else
                ngx.var.backend = '192.168.1.10:8080'
            end
        }
        proxy_pass http://$backend;
    }
}

SSL/TLS卸载与HTTPS配置

在负载均衡层统一处理SSL/TLS加解密,可以让后端服务器专注于业务逻辑,减少重复的证书管理和CPU消耗:

server {
    listen 443 ssl http2;
    server_name api.example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        proxy_pass http://backend;
        proxy_set_header X-Forwarded-Proto https;
    }
}

ssl_session_cache启用会话缓存,避免同一客户端重复完整握手。ssl_session_timeout设置缓存有效期10分钟,在安全性和性能之间取得平衡。X-Forwarded-Proto头部告知后端原始请求协议为HTTPS,后端可据此生成正确的重定向URL。

限流与过载保护配置

在高并发场景下,负载均衡器本身也需要过载保护。Nginx提供limit_req和limit_conn两个模块实现请求限流:

# 按IP限流:每秒10个请求,突发20个
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

server {
    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;
        proxy_pass http://backend;
    }
}

# 并发连接数限制:每个IP最多50个并发连接
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

server {
    location / {
        limit_conn conn_limit 50;
        proxy_pass http://backend;
    }
}

burst=20允许短时突发20个请求排队,nodelay参数表示突发请求立即处理而不等待。limit_conn防止单个客户端占用过多连接资源。两个模块配合使用,从请求速率和并发数两个维度进行过载保护。

负载均衡日志与监控

Nginx的负载均衡日志需要记录后端服务器响应状态和耗时,便于排查性能问题和调整权重配置。通过自定义log_format记录upstream相关信息:

log_format upstream_log '$remote_addr - $request_time '
    'upstream:$upstream_addr '
    'upstream_status:$upstream_status '
    'upstream_response_time:$upstream_response_time '
    'upstream_cache_status:$upstream_cache_status';

access_log /var/log/nginx/upstream.log upstream_log;

$upstream_response_time记录后端响应耗时,$upstream_status记录后端返回的HTTP状态码。当某台后端服务器响应时间持续偏高时,可以降低其weight或暂时移出upstream池。配合Prometheus exporter采集Nginx指标,可以建立完整的负载均衡监控告警体系。

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

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

相关推荐