nginx生产环境root必须用绝对路径(如/var/www/my-app),避免相对路径;其与location拼接生成真实文件路径,需严格匹配前端打包结构,并配合try_files和权限控制防404与越权。

生产应用发布时,Nginx 的 root 配置不是随便写个路径就行,关键在于路径语义清晰、层级结构匹配、避免权限和缓存干扰。配错会导致 404、资源加载失败、甚至跨目录越权访问风险。
root 路径必须是绝对路径
不要用相对路径(比如 root html; 或 root ./dist;),生产环境一律用完整绝对路径:
- ✅
root /var/www/my-app; - ❌
root dist;或root ../frontend/dist;
理由:Nginx 启动用户(通常是 nginx 或 www-data)工作目录不确定,相对路径解析不可靠;绝对路径明确、可审计、便于运维定位。
root + location 的拼接逻辑要对得上文件实际位置
root 不是“直接映射到该目录”,而是 root 路径 + location 匹配路径 + URI 剩余部分 → 最终文件路径。
例如:
location /assets/ {
root /var/www/my-app;
}
请求 /assets/js/app.js,Nginx 实际查找:/var/www/my-app/assets/js/app.js
⚠️ 注意:/assets/ 这段路径必须真实存在于 /var/www/my-app/ 下,否则 404。
如果前端打包后静态资源全在 /var/www/my-app/ 根下(无 assets 子目录),那就不该用 location /assets/,而应:
location / {
root /var/www/my-app;
try_files $uri $uri/ /index.html;
}
这样 /js/app.js → /var/www/my-app/js/app.js,符合常见前端部署结构。
静态资源建议统一用 root + try_files,别混 alias
-
root适合整个站点或大范围路径映射,语义直观、支持index和try_files; -
alias适合局部路径重定向(如/api-docs/ → /usr/share/nginx/html/swagger/),但易出错(结尾/忘加、正则捕获缺失),生产环境非必要不推荐用于主应用。
典型安全配置示例:
server {
listen 80;
server_name app.example.com;
# 确保 root 权限可控:目录属主 nginx:nginx,权限 755,文件 644
root /var/www/my-app;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# 防止泄露敏感文件
location ~ ^/(\.ht|\.git|\.env|node_modules|package.json) {
return 403;
}
}
发布时检查三件事
- 文件是否真在
root指定目录里?用ls -l /var/www/my-app/index.html确认; - Nginx 用户是否有读取权限?
sudo -u nginx ls /var/www/my-app/index.html; - 配置重载是否成功?
sudo nginx -t && sudo nginx -s reload,别只改配置不重载。
不复杂但容易忽略。











