应使用 location 匹配后缀配合 root/alias 提供静态资源,而非 proxy_pass;需将静态规则置于 proxy_pass 之前,推荐 location ~* .(js|css|png|jpg|gif|woff2|ttf|svg)$ 配 root /var/www/static; 并添加缓存头。

在 Nginx 中,proxy_pass 本身是用于反向代理的,它不负责“本地托管”——要让特定后缀文件(比如 .js、.css、.png)跳过代理、直接由 Nginx 读取本地文件返回,应该用 location 匹配 + root/alias 指令,而不是依赖 proxy_pass。
匹配后缀并本地服务静态资源
核心思路:用正则或前缀 location 精准捕获请求路径中的文件后缀,然后通过 root 或 alias 指向本地目录,Nginx 自动读取并返回文件。
- 推荐用
location ~* \.(js|css|png|jpg|gif|woff2|ttf|svg)$——~*表示忽略大小写的正则匹配 - 搭配
root /var/www/static;:表示把整个请求路径(含 URI)拼到该目录下查找,例如请求/assets/main.js,Nginx 就去读/var/www/static/assets/main.js - 如果只想映射某一段路径(如所有匹配请求都对应根目录下的文件),改用
alias /var/www/static/;,注意结尾必须有斜杠 - 加上
expires 1y;和add_header Cache-Control "public, immutable";可提升缓存效率
避免和 proxy_pass 冲突
location 的匹配顺序很重要。Nginx 按最长前缀匹配 → 正则匹配(按配置顺序,第一个命中即停止)。所以要把静态文件的 location 放在 proxy_pass 的通用规则之前,否则请求会被先代理走,根本不会落到静态规则里。
- 错误写法:先写
location / { proxy_pass http://backend; },再写后缀匹配 —— 后缀规则永远不会执行 - 正确顺序:先写具体的静态后缀 location,再写泛用的
location /代理块 - 也可以用
location ^~ /static/这类前缀匹配,专用于某个子路径下的静态资源,更清晰可控
验证是否生效
最直接的方式是查看 Nginx 访问日志,确认对应请求的 status 是 200 且没有 upstream 地址字段;或者用 curl -I 看响应头中是否有 X-Accel-Buffering: no(非必须),更重要的是确认响应来自本地磁盘而非后端服务。
- 检查 Nginx 配置语法:
nginx -t - 重载配置:
nginx -s reload - 确保目标文件真实存在、Nginx 进程有读取权限(常见坑:SELinux 或文件属主为 root,而 nginx 工作进程是 nobody/www-data)











