实现动静分离+负载均衡的核心是用多个upstream块分别定义静态与动态资源集群,并按请求特征(如后缀、路径)在location中精准路由:静态请求(如.jpg/.js)走static_servers,动态请求(如/api/.php)走dynamic_servers,确保各集群独立应用负载策略,避免混用。

要实现动静分离 + 负载均衡,核心是用多个 upstream 块分别定义静态资源集群和动态资源集群,再在 location 中按请求特征(如后缀、路径)精准路由到对应 upstream。不是所有请求都走同一组后端,而是“静态归静态、动态归动态”,各走各的负载策略。
一、定义两类 upstream 集群
在 http 块内,分别声明静态服务组和动态服务组。静态组可指向 Nginx 本地文件系统或专用静态服务器;动态组则指向 Tomcat、PHP-FPM 等应用容器:
-
静态集群(如图片、CSS、JS):
upstream static_servers {<br> server 192.168.1.10:80;<br> server 192.168.1.11:80 weight=2;<br>} -
动态集群(如 .php、/api、.jsp):
upstream dynamic_servers {<br> ip_hash;<br> server 192.168.1.20:8080 max_fails=2 fail_timeout=10s;<br> server 192.168.1.21:8080 weight=3;<br>}
注意:动态服务常需会话保持,ip_hash或sticky(需模块)更稳妥;静态服务通常用轮询或加权轮询即可。
二、在 server 块中按规则分流
利用 location 的匹配能力,把不同类型的请求导向不同 upstream:
- 匹配常见静态后缀,直接走
static_servers:location ~* \.(jpg|jpeg|gif|png|css|js|ico|woff2|svg)$ {<br> proxy_pass http://static_servers;<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br>} - 匹配动态路径或后缀,转发给
dynamic_servers:location ~ ^/(api|admin|user)/ {<br> proxy_pass http://dynamic_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>}
也可用location ~ \.php$或location = /index.jsp等更精确匹配。 - 兜底规则(如根路径)建议明确归属,避免误入静态逻辑:
location / {<br> proxy_pass http://dynamic_servers;<br> # 不要留空或只写 root,否则可能绕过代理<br>}
三、动静内容协同的关键细节
动静分离不是简单拆开,而是要保障前端资源能正确加载后端接口:
-
静态资源路径需统一:前端 HTML/CSS/JS 中引用的 API 地址,应与 Nginx 的
location /api/规则对齐,避免跨域或 404;可用proxy_redirect重写后端返回的 Location 头。 -
文件一致性必须保证:若静态资源由 Nginx 直接提供(
root /var/www/html),需确保所有静态服务器节点内容完全一致——推荐用 rsync 定时同步,或挂载 NFS/MFS 共享存储。 -
避免静态 location 拦截动态请求:正则匹配顺序很重要。把
location ~ \.php$放在location ~* \.(js|css)$后面,会导致 .php 文件被当成静态文件处理。建议按“精确 → 前缀 → 正则”顺序组织,或用^~提前终止正则匹配。
四、验证与调优建议
配置完成后别急着上线,重点确认三点:
- 用
curl -I http://your-domain/logo.png和curl -I http://your-domain/api/user分别看响应头中的Server和X-Upstream(可自定义添加),确认流量确实分到了不同集群。 - 检查日志:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $upstream_addr';,观察$upstream_addr是否按预期轮转或固定。 - 动态集群启用
ip_hash后,换不同公网 IP 访问,验证是否始终打到同一台后端;静态集群开启weight后,用 ab 或 wrk 压测,观察访问比例是否接近配置值。


















