Nginx 中合理划分静态与动态路径的核心是隔离存放、权限最小化与精准匹配:静态资源统一置于 /var/www/static/ 及其子目录,由 Nginx 直接服务并缓存;动态脚本(PHP/Python/Java等)必须存于非 Web 可达路径(如 /opt/myapp/backend/),仅通过 fastcgi_pass 或 proxy_pass 转发,严禁暴露源码。

合理划分静态资源与动态脚本的存放路径,核心是让 Nginx 能清晰识别、高效分发,同时避免权限冲突、路径越界和维护混乱。这不是纯技术配置问题,而是架构习惯问题——路径设计直接影响可读性、安全性与后续扩展。
静态资源路径:集中、隔离、可缓存
静态资源(HTML/CSS/JS/图片/字体等)应统一放在独立目录下,不与后端代码混放。推荐结构:
-
/var/www/static/ —— 主静态根目录(Nginx
root或alias指向此处) -
/var/www/static/css/、/var/www/static/js/、/var/www/static/img/、/var/www/static/fonts/—— 按类型细分,便于权限管理和 CDN 同步 - 避免使用
/var/www/html/混合存放,否则容易在 location 匹配时产生歧义(比如/api/xxx.js被误判为静态) - 若项目含多套前端(如 admin / mobile / h5),可进一步划分子目录:
/var/www/static/admin/,再通过 location 前缀精准路由
动态脚本路径:与应用服务解耦,不暴露给 Nginx 直接读取
动态脚本(PHP、Python WSGI、Java WAR 解包后内容等)不应放在 Nginx 可直接访问的文件系统路径中。正确做法是:
-
PHP 场景:脚本存于
/opt/app/php/或/srv/myapp/src/,Nginx 仅通过fastcgi_pass转发请求,不配置root指向该目录;禁止在 server 或 location 中将root设为代码目录 -
JVM/Go/Node.js 场景:后端服务监听本地端口(如
127.0.0.1:8080),Nginx 用proxy_pass转发;其源码或构建产物(jar、dist)应放在非 Web 可达路径,如/opt/myapp/backend/或/home/deploy/app/ - 绝对不要把
.php、.py、.jsp文件放在/var/www/static/或 Nginxroot下——这等于把源码暴露在 HTTP 可访问路径,存在严重安全风险
动静混合项目的典型安全路径结构示例
以一个前后端分离的 Vue + Spring Boot 项目为例:
-
/var/www/static/→ Nginx 直接服务:所有index.html、打包后的js/css/img -
/opt/myapp/backend.jar→ 后端服务运行文件,由 systemd 托管,监听localhost:8080 -
/etc/nginx/conf.d/myapp.conf中配置:location / { proxy_pass http://127.0.0.1:8080; }location ~* \.(js|css|png|jpg|gif|svg|woff2?)$ { root /var/www/static; expires 1y; } -
/var/log/nginx/myapp.access.log和/var/log/myapp/backend.log分开记录,便于归因分析
关键避坑提醒
几个常被忽略但影响深远的细节:
-
别用相对路径写 root:Nginx 的
root必须是绝对路径,如root /var/www/static;,而非root static;(后者依赖当前工作目录,极易出错) -
区分 alias 与 root 的语义:用
location /static/ { alias /var/www/static/; }时,URI 中的/static/会被截掉;而root会拼接完整路径,选错会导致 404 -
禁止递归暴露源码目录:确保
/var/www/static/不包含.git、.env、node_modules等敏感目录;Nginx 配置中应加location ~ /\.(git|env|log|ini)$ { deny all; } -
权限最小化:Nginx worker 进程用户(如
www-data)只需对/var/www/static/有读取权,对后端代码目录应无任何访问权限


















