Nginx反向代理是服务器运维中最常见的基础设施配置之一。通过Nginx实现负载均衡和SSL证书自动化管理,能够有效提升Web服务的可用性和安全性。本文以Nginx 1.24+版本为基础,覆盖upstream负载均衡配置、Let’s Encrypt证书自动签发续期、以及HTTPS安全加固的完整流程。
Nginx反向代理基础配置
反向代理的核心是将客户端请求转发到后端服务器,后端服务器对客户端不可见。基础配置结构如下:
# /etc/nginx/nginx.conf
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 backup;
}
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_connect_timeout 5s;
proxy_read_timeout 60s;
proxy_send_timeout 30s;
}
}
}
weight参数控制请求分配比例,backup标记的服务器仅在主服务器全部不可用时才接收请求。
负载均衡策略配置与选型
Nginx支持多种负载均衡算法,适用于不同的业务场景:
轮询(默认):按顺序依次分配请求,适合后端服务器性能相近的场景。
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
最少连接数:将请求分配到当前连接数最少的服务器,适合请求处理时间差异较大的场景。
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
IP哈希:基于客户端IP的哈希分配,保证同一客户端始终访问同一后端服务器,适合有会话状态的场景。
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
一致性哈希:使用nginx_upstream_consistent_hash模块,在后端服务器增减时最小化缓存失效范围。
健康检查与会话保持配置
Nginx开源版不主动检测后端服务器健康状态,请求转发到不可用服务器时会返回502错误。可以通过max_fails和fail_timeout参数实现被动健康检查:
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;
}
max_fails=3表示30秒内失败3次后,该服务器在fail_timeout时间内不再接收新请求。对于需要主动健康检查的场景,可以使用nginx_upstream_check_module或Nginx Plus。
会话保持(Session Sticky)通过sticky cookie实现:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
sticky cookie_name route_domain expires=1h domain=.example.com httponly;
}
Let’s Encrypt SSL证书自动化部署
使用Certbot工具自动签发和续期Let’s Encrypt免费SSL证书,是实现HTTPS自动化的主流方案。
安装Certbot并签发证书:
# 安装certbot
apt update && apt install -y certbot python3-certbot-nginx
# 签发证书并自动修改Nginx配置
certbot --nginx -d api.example.com -d www.example.com \
--non-interactive --agree-tos --email admin@example.com \
--redirect
Certbot会自动在Nginx配置中添加443端口监听、证书路径和HTTP到HTTPS的301重定向。
SSL安全加固配置
默认的Certbot配置已满足基本安全要求,但可以进一步加固:
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
# 仅使用TLS 1.2和1.3
ssl_protocols TLSv1.2 TLSv1.3;
# 配置加密套件
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
# 会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
# HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 安全响应头
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
}
证书自动续期配置
Let’s Encrypt证书有效期为90天,需定期续期。Certbot安装后默认创建systemd timer自动续期,但可以额外配置续期后的Nginx重载:
# /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
nginx -t && systemctl reload nginx
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
手动测试续期流程:
certbot renew --dry-run
完整生产环境配置示例
整合负载均衡、SSL和反向代理的完整配置:
http {
upstream backend {
least_conn;
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 max_fails=3 fail_timeout=30s backup;
}
# HTTP重定向到HTTPS
server {
listen 80;
server_name api.example.com;
return 301 https://$host$request_uri;
}
# HTTPS反向代理
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
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;
}
location /health {
access_log off;
return 200 "ok\n";
add_header Content-Type text/plain;
}
}
}
常见问题排查
502 Bad Gateway:后端服务未启动或端口不通。使用curl直接请求后端地址确认服务状态,检查防火墙规则是否放行对应端口。
SSL握手失败:确认证书文件路径正确,检查证书是否过期。使用openssl s_client -connect api.example.com:443验证证书链完整性。
证书续期失败:80端口需对公网开放(Let’s Encrypt通过HTTP-01验证域名所有权)。确认Nginx配置中80端口的server_name与证书域名一致。
负载不均匀:使用ip_hash时,客户端IP过于集中会导致不均匀。可以考虑改用least_conn或一致性哈希策略。通过Nginx的stub_status模块监控各upstream的请求分布。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-nginx-fan-xiang-dai-li-pei-zhi-shi-zhan-fu/