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/