Nginx反向代理负载均衡配置实战:upstream健康检查与HTTPS证书自动化管理方案

Nginx作为反向代理在DevOps实践中承担流量分发、SSL终结、健康检查等核心职责。合理配置upstream负载均衡算法、被动健康检查策略和HTTPS证书自动化续签,是保障服务高可用性的关键。本文从负载均衡算法选型、健康检查机制、证书自动化管理三个维度给出完整配置方案。

upstream负载均衡算法选型与配置

Nginx支持轮询(round robin)、加权轮询、IP哈希、最少连接、一致性哈希等多种调度算法。不同算法适用于不同业务场景。

# /etc/nginx/conf.d/upstream.conf

# 加权轮询:按服务器性能分配权重
upstream web_backend {
    server 10.0.1.11:8080 weight=5;
    server 10.0.1.12:8080 weight=3;
    server 10.0.1.13:8080 weight=2;
    keepalive 32;
}

# IP哈希:保证同一客户端固定访问同一后端
upstream web_backend_iphash {
    ip_hash;
    server 10.0.1.11:8080;
    server 10.0.1.12:8080;
}

# 最少连接:将请求分发到当前连接数最少的服务器
upstream web_backend_leastconn {
    least_conn;
    server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.12:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.13:8080 max_fails=3 fail_timeout=30s backup;
}

# 一致性哈希(需nginx_upstream_check_module或第三方模块)
upstream web_backend_hash {
    consistent_hash $request_uri;
    server 10.0.1.11:8080;
    server 10.0.1.12:8080;
}

加权轮询适合后端服务器性能不均的场景,weight值按CPU核心数或处理能力设置。IP哈希解决Session粘性问题,但服务器扩缩容时会导致哈希重分布。least_conn适合长连接或请求处理时间差异大的场景。backup参数标记备用服务器,仅在主服务器全部不可用时启用。

被动健康检查与主动健康检查配置

Nginx开源版内置被动健康检查:通过max_fails和fail_timeout参数,在指定时间窗口内失败次数达到阈值后自动剔除节点。nginx_upstream_check_module模块可提供主动健康检查能力。

# 被动健康检查参数
upstream web_backend {
    # max_fails=3: 30秒内失败3次标记为不可用
    # fail_timeout=30s: 标记不可用后30秒内不再尝试
    server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.12:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.13:8080 max_fails=3 fail_timeout=30s;
}

# proxy层健康检查响应判定
server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://web_backend;
        proxy_next_upstream error timeout http_502 http_503 http_504;
        proxy_next_upstream_timeout 5s;
        proxy_next_upstream_tries 2;
        proxy_connect_timeout 3s;
        proxy_read_timeout 10s;
        proxy_send_timeout 5s;
    }
}

proxy_next_upstream配置在当前后端返回502/503/504或超时时自动切换到下一个后端节点。proxy_next_upstream_tries限制重试次数避免请求放大。proxy_connect_timeout设为3秒可快速感知后端宕机,避免客户端长时间等待。

# 主动健康检查(需编译nginx_upstream_check_module)
upstream web_backend {
    server 10.0.1.11:8080;
    server 10.0.1.12:8080;
    server 10.0.1.13:8080;

    # 每3秒检查一次,超时2秒,连续2次成功恢复
    check interval=3000 rise=2 fall=3 timeout=2000 type=http;
    check_http_send "GET /health HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

# 健康检查状态页面
server {
    listen 8080;
    server_name localhost;
    location /status {
        check_status;
        access_log off;
        allow 10.0.0.0/8;
        deny all;
    }
}

主动健康检查定期向后端发送HTTP请求,基于响应状态码判断健康状态。rise=2表示连续2次成功才标记为健康,fall=3表示连续3次失败才标记为不可用,避免网络抖动导致的误判。check_status页面提供可视化状态查看,配合access_log off避免日志污染。

HTTPS证书自动化管理:Let’s Encrypt与acme.sh

HTTPS证书的自动化申请和续签是CI/CD流水线中不可忽视的环节。acme.sh轻量且不依赖额外运行时,适合服务器环境批量管理证书。

# 安装acme.sh
curl https://get.acme.sh | sh
source ~/.bashrc

# DNS验证方式申请通配符证书(推荐)
export Ali_Key="your_access_key"
export Ali_Secret="your_access_secret"
acme.sh --issue --dns dns_ali -d "yunthe.com" -d "*.yunthe.com" \
    --keylength ec-256

# 安装证书到Nginx目录并自动reload
acme.sh --install-cert -d "yunthe.com" --ecc \
    --key-file       /etc/nginx/ssl/yunthe.com.key \
    --fullchain-file /etc/nginx/ssl/yunthe.com.crt \
    --reloadcmd      "nginx -s reload"

# 设置自动续签(acme.sh默认已添加cron)
# 查看cron
crontab -l | grep acme
# 输出: 8 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh

DNS验证方式无需在Web服务器开放HTTP验证目录,适合通配符证书申请。阿里云DNS插件dns_ali自动完成TXT记录添加和清理。acme.sh的cron任务每天检查证书到期时间,到期前30天自动续签。

Nginx SSL安全加固配置

# /etc/nginx/conf.d/ssl.conf

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name yunthe.com;

    ssl_certificate     /etc/nginx/ssl/yunthe.com.crt;
    ssl_certificate_key /etc/nginx/ssl/yunthe.com.key;
    ssl_ecdh_curve      secp384r1:secp256r1;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers on;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;

    # HSTS强制HTTPS
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

    # HTTP跳转HTTPS
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    }
}

# HTTP 80端口跳转
server {
    listen 80;
    server_name yunthe.com;
    return 301 https://$host$request_uri;
}

TLSv1.3优先使用可减少一次RTT握手延迟,ssl_session_cache共享缓存减少重复握手开销。OCSP Stapling(ssl_stapling)启用后服务器主动获取证书状态并返回给客户端,避免客户端单独查询OCSP服务器造成的延迟。HSTS头强制浏览器后续访问使用HTTPS协议,max-age设为2年。

日志分析与故障应急响应

Nginx日志是故障排查的第一信息源。合理配置日志格式和切割策略,配合ELK或Loki实现集中化日志分析。

# 自定义日志格式,包含上游响应时间和缓存状态
log_format upstream_detail '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent" '
    'upstream:$upstream_addr '
    'upstream_status:$upstream_status '
    'upstream_time:$upstream_response_time '
    'request_time:$request_time';

access_log /var/log/nginx/access.log upstream_detail buffer=32k flush=5s;
error_log  /var/log/nginx/error.log warn;

# logrotate配置:按天切割保留30天
cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

buffer=32k flush=5s配置日志缓冲写入,减少I/O操作频率。upstream_response_time字段记录每个后端节点的响应时间,是定位慢节点和超时问题的关键指标。配合logrotate按天切割压缩,避免单文件过大影响日志检索效率。

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

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

相关推荐