nginx 实现轮询负载均衡与动静分离的关键是分层处理请求路径:静态资源由 nginx 直接响应,动态请求通过 upstream 轮询分发至后端服务器;通过 location 精准匹配静态后缀并本地服务,/api/、/v1/ 等动态路径及兜底请求均 proxy_pass 至 upstream。

Nginx 实现轮询负载均衡的同时做动静分离,关键在于分层处理请求路径:静态资源由 Nginx 直接响应,动态请求才交给后端服务器组轮询分发。这不是两个独立功能的拼凑,而是一套协同工作的配置逻辑。
动静分离:用 location 匹配规则分流
核心是利用 location 指令精准识别静态资源路径,避免把本可本地响应的请求转发出去。
- 匹配常见静态后缀(如
.css、.js、.png、.jpg、.html),直接指定 root 或 alias 路径,Nginx 自己读文件返回 - 对
/api/、/v1/、/admin/等明确标识动态接口的路径,统一 proxy_pass 到 upstream 组 - 未匹配到任何静态规则的请求(兜底),也走 proxy_pass,确保业务逻辑不丢失
动态请求轮询:upstream + 默认策略
动态请求的负载均衡靠 upstream 块定义后端服务池,Nginx 默认启用轮询(round robin)——无需额外写 least_conn 或 ip_hash 就是轮询。
- 在 http 块中定义 upstream,例如:
upstream backend { server 192.168.1.10:8080; server 192.168.1.11:8080; } - 所有发往该 upstream 的请求,Nginx 自动按顺序轮流打到各台服务器
- 某台 server 不可用时(如超时或返回 502),Nginx 会临时剔除它,等恢复后再自动加回
完整配置示例(精简可运行)
以下是一个典型整合结构,兼顾动静分离与动态轮询:
http {
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
<pre class="brush:php;toolbar:false;">server {
listen 80;
root /var/www/html;
# 静态资源:直接服务
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 动态接口:全部走轮询
location /api/ {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /v1/ {
proxy_pass http://backend;
}
# 兜底:其他非静态路径也转发
location / {
try_files $uri @dynamic;
}
location @dynamic {
proxy_pass http://backend;
}
}}
注意几个实际细节
-
proxy_pass后面的 URL 末尾是否带斜杠,会影响路径重写行为,务必保持一致 - 静态文件若放在后端应用里(比如 Spring Boot 的 static 目录),建议移到 Nginx 本地托管,否则动静分离就失效了
- 如果后端服务器性能差异大,可在 upstream 中给 server 加
weight=2等参数,升级为加权轮询 - session 问题不靠轮询解决,需要配合
ip_hash或后端共享 session 存储











