Nginx负载均衡配置实战:upstream模块与动静分离部署方案

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/

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

相关推荐