Nginx通过upstream定义静态与动态两组轮询后端,并用location按文件后缀或路径前缀分流请求,再结合健康检查、缓存和头信息透传实现高可用动静分离。

Nginx 实现轮询负载均衡 + 静态资源与动态请求分流,核心是结合 upstream 定义轮询组 和 location 匹配路径/后缀做路由分离。不是靠一种策略完成所有事,而是分层处理:先区分动静,再在各自通道内轮询分发。
定义两组轮询后端服务器
静态资源和动态服务通常部署在不同机器或不同端口,需分别建 upstream 块:
注意:静态服务器一般用轻量 HTTP 服务(如 Nginx 自身或 CDN 边缘节点),动态服务器多为应用服务(如 Node.js、Java、Python 后端)。
- 为静态资源建一个轮询组,例如:
upstream static_servers {<br> server 192.168.1.20:80;<br> server 192.168.1.21:80;<br> server 192.168.1.22:80;<br> } - 为动态接口建另一个轮询组,例如:
upstream api_servers {<br> server 192.168.1.30:3000;<br> server 192.168.1.31:3000;<br> server 192.168.1.32:3000;<br> }
用 location 规则分流动静请求
在 server 块中,通过匹配 URI 特征把请求导向对应 upstream:
- 静态资源常见匹配方式:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|ttf|svg)$ {<br> proxy_pass http://static_servers;<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br> }
(支持大小写不敏感匹配,覆盖主流静态文件类型) - 动态请求通常走 API 路径前缀,例如:
location ^~ /api/ {<br> proxy_pass http://api_servers;<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br> }
(使用^~确保前缀匹配优先于正则,避免冲突) - 兜底规则处理根路径或 HTML 页面(常属动态):
location / {<br> proxy_pass http://api_servers;<br> # 可加 proxy_redirect 或 cookie 处理逻辑<br> }
增强稳定性的关键配置项
轮询本身简单,但生产环境必须考虑容错和一致性:
- 给每个 server 行加上健康检查参数:
server 192.168.1.20:80 max_fails=3 fail_timeout=30s;
Nginx 会自动跳过连续失败的节点,30 秒后重试。 - 静态组可启用缓存头优化(非必须但推荐):
proxy_cache_valid 200 302 1h;<br> proxy_cache_valid 404 1m;
- 动态组建议透传真实客户端 IP 和协议信息:
proxy_set_header X-Forwarded-Proto $scheme;<br> proxy_set_header X-Forwarded-Host $host;
验证是否生效
不需要复杂工具,几条命令就能确认分流与轮询都在工作:
- 访问一个 JS 文件:
curl -I http://your-domain.com/app.js,查看响应头中的Server或自定义 header,确认来自 static_servers 中某台; - 访问一个 API:
curl -I http://your-domain.com/api/user,对比响应来源是否落在 api_servers 中; - 连续发起 6 次静态请求,查各后端 access.log,应看到请求按顺序打到三台机器(如 20→21→22→20→21→22)。











