静态资源多存储路径不适用负载均衡,而是通过location+alias路由、try_files多路径fallback或map动态root实现多根目录服务。

静态资源多存储路径本身不适用“负载均衡”概念——负载均衡作用于后端应用服务器之间,而静态资源路径是 Nginx 本地文件系统上的不同目录。你真正需要的是:让 Nginx 支持从多个本地目录查找并提供静态文件,这属于“多根目录(multi-root)静态服务”或“按规则路由到不同静态路径”,不是传统意义上的负载均衡。
用 location + alias 实现多静态路径路由
这是最常用、最清晰的方式:为不同 URL 前缀指定不同物理路径。
- 每个
location块匹配特定路径(如/images/、/assets/js/),用alias指向对应目录 -
alias会完全替换匹配路径,注意末尾斜杠与路径拼接逻辑 - 不使用
root,避免路径拼接歧义
示例配置:
server {
listen 80;
server_name static.example.com;
<pre class="brush:php;toolbar:false;"># /images/ → /data/static/images/
location /images/ {
alias /data/static/images/;
}
# /css/ → /opt/web/assets/css/
location /css/ {
alias /opt/web/assets/css/;
}
# /uploads/ → /var/www/uploads/(可来自用户上传)
location /uploads/ {
alias /var/www/uploads/;
}
# 默认兜底(可选)
location / {
root /usr/share/nginx/html;
index index.html;
}}
用 try_files 实现多路径 fallback 查找
适合同一类资源(如图片)分散存放在多个目录,希望按优先级依次查找。
-
try_files按顺序检查文件是否存在,命中即返回 - 常用于 CDN 回源、灰度静态资源、A/B 版本静态文件共存等场景
- 注意:Nginx 不会“负载”分发请求,而是逐个尝试直到找到第一个存在的文件
示例(查找 logo.png):
location = /logo.png {
try_files
/v2/logo.png # 先查 v2 目录
/v1/logo.png # 再查 v1 目录
/default/logo.png # 最后查默认目录
=404; # 都不存在则 404
}用 map + root 动态切换根目录(高级用法)
当路径选择逻辑较复杂(如基于域名子段、请求头、参数),可用 map 提前计算目标路径。
-
map在 http 块中定义变量映射关系 - 在 server 或 location 中通过
root $static_root;动态生效 - 适合多租户、多环境共用同一 Nginx 实例的场景
示例:
http {
map $host $static_root {
hostnames;
~^assets\.prod\.example\.com$ /data/prod/static;
~^assets\.staging\.example\.com$ /data/staging/static;
default /data/common/static;
}
<pre class="brush:php;toolbar:false;">server {
listen 80;
server_name assets.example.com;
location / {
root $static_root;
index index.html;
}
}}
为什么不能对静态路径做“负载均衡”?
Nginx 本身不支持把一个请求(比如 /style.css)随机或轮询地转发到多个本地目录去读取——它不是反向代理,没有 upstream 后端组的概念。所谓“多路径负载”,本质是路由策略或 fallback 策略,而非并发分发。
- 如果你真想让多个 Nginx 实例共同对外提供静态资源,那应部署多个 Nginx 节点,再在其上游加一层负载均衡器(如另一台 Nginx 或 LVS)
- 若目标是提升静态资源吞吐,更有效的方式是:启用
sendfile、调整tcp_nopush/tcp_nodelay、配置缓存(expires、open_file_cache)


















