在 VPS 上配置 Nginx 负载均衡器

当流量超出单台服务器的承载能力时,负载均衡器就显得不可或缺。Nginx 内置了生产级的负载均衡功能,无需额外安装其他软件。本文将一步步介绍如何在 VPS Ubuntu 上将 Nginx 配置为负载均衡器,将请求分发到多台后端服务器。

负载均衡的工作原理

负载均衡器位于后端服务器的前端,接收客户端发来的请求并将其转发给最合适的后端。其优势包括:处理更多流量、消除单点故障,以及实现零停机部署。

轮询(Round-Robin)

将请求均匀地轮流分配给所有服务器。适用于后端配置完全相同的场景。

最少连接(Least Connection)

将每个新请求发送给当前活跃连接数最少的服务器。适合处理耗时较长的请求。

IP 哈希(IP Hash)

同一客户端 IP 始终路由到同一台后端。适合需要会话保持(sticky session)的应用。

架构概览

在本示例中,运行负载均衡器的 VPS(IP:10.0.0.1)接收来自 80/443 端口的流量,并将其分发到两台后端服务器(10.0.0.2 和 10.0.0.3),这两台服务器的应用运行在 8080 端口。

在负载均衡器 VPS 上安装 Nginx

sudo apt update && sudo apt install -y nginx sudo systemctl enable nginx

配置 Upstream 与负载均衡

创建一个新的配置文件:

sudo nano /etc/nginx/sites-available/loadbalancer

添加以下配置(轮询模式):

# Define the backend server pool upstream backend_pool { server 10.0.0.2:8080; server 10.0.0.3:8080; # keepalive improves performance keepalive 32; } server { listen 80; server_name yourdomain.com; location / { proxy_pass http://backend_pool; proxy_http_version 1.1; proxy_set_header Connection ""; 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; } }

切换到最少连接模式

upstream backend_pool { least_conn; server 10.0.0.2:8080; server 10.0.0.3:8080; }

切换到 IP 哈希模式(会话保持)

upstream backend_pool { ip_hash; server 10.0.0.2:8080; server 10.0.0.3:8080; }

针对不同服务器配置加权分配

upstream backend_pool { server 10.0.0.2:8080 weight=3; # 承担 3/4 的流量 server 10.0.0.3:8080 weight=1; # 承担 1/4 的流量 }

启用配置并进行测试

sudo ln -s /etc/nginx/sites-available/loadbalancer /etc/nginx/sites-enabled/ sudo nginx -t # 验证配置语法 sudo systemctl reload nginx

为生产环境调优超时与缓冲区

合理调整代理超时时间和缓冲区设置,可以防止后端响应缓慢或响应体较大时出现请求失败的问题。将以下指令添加到 location / 块内或 server 层级。

location / { proxy_pass http://backend_pool; proxy_http_version 1.1; proxy_set_header Connection ""; 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 60s; proxy_read_timeout 60s; # 缓冲区设置 — 根据响应体大小调整 proxy_buffering on; proxy_buffer_size 16k; proxy_buffers 8 16k; proxy_busy_buffers_size 32k; }

对于返回小响应体、追求低延迟的 API 端点,可以使用 proxy_buffering off; 禁用缓冲——但这会增加 Nginx Worker 进程的负载,请在全局应用前先进行基准测试。

在负载均衡器上终止 SSL/TLS

生产环境中最常见的方案是 SSL 终止(SSL Termination):由负载均衡器处理来自客户端的 HTTPS,然后以明文 HTTP 转发给后端服务器。后端不再需要管理证书,既降低了开销,也简化了证书管理工作。

# Obtain a free certificate with Certbot first sudo certbot --nginx -d yourdomain.com # HTTPS server block server { listen 443 ssl http2; server_name yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; location / { proxy_pass http://backend_pool; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto https; } } # Redirect HTTP to HTTPS server { listen 80; server_name yourdomain.com; return 301 https://$host$request_uri; }

限速以防范流量洪峰

负载均衡器是所有流量进入的唯一入口,因此是实施限速策略的理想位置。这样可以在不修改应用代码的情况下,保护后端服务器免受流量洪峰、暴力破解和恶意爬取的威胁。

# Define zone in the http{} block (nginx.conf or conf.d/) http { limit_req_zone $binary_remote_addr zone=general:10m rate=30r/m; limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m; } # Apply per endpoint location /api/auth/ { limit_req zone=login burst=3 nodelay; limit_req_status 429; proxy_pass http://backend_pool; } location / { limit_req zone=general burst=50 nodelay; proxy_pass http://backend_pool; }
速率 适用场景 说明
10r/s 通用 API 适度限制
1r/s 登录接口 严格限制 — 防止暴力破解
100r/s 静态资源 宽松限制 — 公开资源

被动健康检查

Nginx 开源版本自动支持被动健康检查——若某台后端持续返回错误,Nginx 会将其临时从后端池中移除:

upstream backend_pool { server 10.0.0.2:8080 max_fails=3 fail_timeout=30s; server 10.0.0.3:8080 max_fails=3 fail_timeout=30s; }

注意:主动健康检查(每隔 N 秒主动探测后端)需要 Nginx Plus(商业版)或 Nginx + Lua 模块。如需开源版的主动健康检查,可考虑使用 HAProxy 作为替代方案。

负载均衡器运行后的后续步骤

Nginx 成功分发流量后,再完成以下几个步骤,即可让架构达到生产就绪状态,并保持长期可维护性。

在 VPS 上使用 Nginx 负载均衡,是构建高可用架构最具性价比的方案之一。该软件完全开源,无需支付授权费用,且在普通硬件上即可处理极高的请求量。AsiaGB VPS 提供完整的 root 权限,让您可以根据实际需求自由配置 Nginx,不受托管服务商的任何限制。

Monitor the Load Balancer

sudo nginx -t && sudo systemctl status nginx # Watch access log in real time sudo tail -f /var/log/nginx/access.log

AsiaGB VPS — 专为高流量应用设计

AsiaGB VPS 运行 Linux Ubuntu/Debian,提供完整 root 权限,可按需配置 Nginx 负载均衡。套餐起价 500 泰铢/月。

查看 VPS 套餐

查看泰国VPS主机全部套餐 →