Nginx upstream模块配置与负载均衡算法
Nginx的upstream模块是实现服务器高可用集群的核心组件,通过将客户端请求分发到多台后端服务器,提升系统整体吞吐量和容错能力。upstream模块内置四种负载均衡算法:轮询(默认)、权重轮询、IP哈希和最少连接数。
# /etc/nginx/conf.d/upstream.conf
upstream backend_api {
# 权重轮询:weight值越高,分配到的请求越多
server 192.168.1.101:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.103:8080 weight=1 max_fails=3 fail_timeout=30s;
# 健康检查参数
# max_fails: 30秒内失败3次则标记为不可用
# fail_timeout: 标记不可用后30秒内不再尝试该服务器
# 备用服务器:主服务器全部不可用时启用
server 192.168.1.104:8080 backup;
keepalive 32; # 保持32个到后端的长连接
}
upstream static_resource {
# IP哈希:同一客户端IP固定访问同一后端
ip_hash;
server 192.168.1.201:80;
server 192.168.1.202:80;
}
upstream least_conn_pool {
# 最少连接数:将请求分发到当前连接数最少的服务器
least_conn;
server 192.168.1.301:8080;
server 192.168.1.302:8080;
}
权重轮询适用于服务器配置不均的场景,IP哈希解决会话保持问题但可能导致负载不均,最少连接数在请求处理时间差异较大时效果最好。max_fails和fail_timeout组合实现了被动健康检查,Nginx 1.19+版本还支持主动健康检查模块。
动静分离部署架构与配置
动静分离是将静态资源(图片、CSS、JS)与动态请求(API、页面渲染)分发到不同后端的架构模式。静态资源由Nginx直接处理或CDN回源,动态请求转发到应用服务器,显著降低应用服务器的负载压力。
# /etc/nginx/conf.d/yunthe.conf
server {
listen 80;
server_name api.yunthe.com;
# 动态API请求转发到后端应用集群
location /api/ {
proxy_pass http://backend_api;
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_send_timeout 30s;
proxy_read_timeout 60s;
# 代理缓存(可选)
proxy_cache api_cache;
proxy_cache_valid 200 10m;
proxy_cache_key $request_method$host$request_uri;
}
# 静态资源直接由Nginx处理
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2?|ttf|svg)$ {
root /data/static;
expires 30d;
add_header Cache-Control "public, immutable";
# 开启sendfile和零拷贝
sendfile on;
tcp_nopush on;
# 防盗链
valid_referers none blocked yunthe.com *.yunthe.com;
if ($invalid_referer) {
return 403;
}
}
# 文件上传
location /upload/ {
client_max_body_size 50m;
proxy_pass http://backend_api;
proxy_request_buffering off; # 大文件上传禁用缓冲
}
}
proxy_set_header中的三个配置项确保后端服务器能获取客户端真实IP和协议信息,不配置会导致后端日志记录的IP全部是Nginx的内网地址。sendfile和tcp_nopush配合使用可以减少内核态到用户态的数据拷贝,静态文件传输性能提升约30%。
SSL/TLS配置与HTTPS负载均衡
生产环境的负载均衡器通常需要处理HTTPS请求。Nginx可以在负载均衡层终止SSL/TLS,后端使用HTTP通信(SSL offloading),降低后端CPU开销。
server {
listen 443 ssl http2;
server_name api.yunthe.com;
ssl_certificate /etc/nginx/ssl/yunthe.com.crt;
ssl_certificate_key /etc/nginx/ssl/yunthe.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# HTTP/2推送静态资源
location / {
proxy_pass http://backend_api;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# HTTP自动跳转HTTPS
server {
listen 80;
server_name api.yunthe.com;
return 301 https://$host$request_uri;
}
HTTP/2的proxy_http_version必须设为1.1,proxy_set_header Connection “upgrade”支持WebSocket协议升级。ssl_session_cache启用会话缓存后,客户端重连时无需完整TLS握手,减少约100ms的连接延迟。
负载均衡故障排查与性能调优
Nginx负载均衡的常见故障集中在后端服务器不可达和502/504错误。排查时需确认Nginx与后端的网络连通性、后端服务状态和Nginx自身配置。
# 查看upstream实时状态
nginx -V 2>&1 | grep upstream # 确认是否编译了upstream模块
# 日志分析:定位502/504错误
tail -f /var/log/nginx/error.log | grep "upstream"
# 502 Bad Gateway: 后端服务未启动或崩溃
# 检查后端服务: curl -I http://192.168.1.101:8080/health
# 检查防火墙: iptables -L -n | grep 8080
# 504 Gateway Timeout: 后端响应超时
# 调整proxy_read_timeout: proxy_read_timeout 120s;
# 检查后端是否存在慢查询或死锁
# 连接数优化
# /etc/nginx/nginx.conf
worker_processes auto;
worker_connections 4096;
worker_rlimit_nofile 65535;
worker_processes设置为auto会自动匹配CPU核心数。每个worker进程的worker_connections决定单进程最大连接数,总并发连接数为worker_processes乘以worker_connections。在高并发场景下需要同时调整worker_rlimit_nofile和系统的ulimit -n参数,否则Nginx会报”too many open files”错误。
后端服务器的健康检查在开源版Nginx中依赖被动检查(max_fails + fail_timeout),Nginx Plus商业版或编译nginx_upstream_check_module模块可实现主动健康检查,定期发送探测请求并自动剔除异常节点。对于IDC数据中心环境,建议在Nginx层和后端应用层都实现健康检查接口,形成双重保障。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/nginx-fu-zai-jun-heng-pei-zhi-shi-zhan-upstream-mo-kuai-yu/