选root:url与磁盘路径结构一致时更简洁,如/→/var/www/frontend/;选alias:路径不一致时精准替换前缀,如/static/→/data/assets/,且二者末尾均须带/。

高效配置 Nginx 静态资源托管,核心是两件事:路径映射要准、权限边界要严。root 和 alias 选对了不踩坑,www-data 的权限设错了,轻则 403,重则代码泄露。
根目录托管:用 root 还是 alias?
多数场景直接用 root 最稳妥:
-
root /var/www/frontend; 表示请求
/logo.png会去查/var/www/frontend/logo.png - 适合单入口结构(如 Vue/React 打包后整个放一个目录),配合
try_files $uri $uri/ /index.html;支持前端路由 - 避免在 location 中嵌套多层 root,容易因路径拼接出错
只有当 URL 路径和磁盘路径不一致时才用 alias:
- 比如请求
/static/logo.png实际对应磁盘/data/assets/logo.png,就写:location /static/ { alias /data/assets/; } - 注意末尾斜杠:alias 后必须带
/,且 location 路径结尾也要有/,否则文件匹配会错位
权限配置:www-data 只能“进得去、读得到、写不了”
关键不是给谁所有权,而是让 www-data 刚好够用:
- 根静态目录(如
/var/www/example.com):
属主设为deploy:www-data,目录权限750,文件权限640 - 上传类子目录(如
uploads/):
属组保持www-data,加组写权限chmod g+w uploads,但必须禁用脚本执行:location ~ \.php$ { deny all; } - 每一级父路径(
/var/www→/var/www/example.com)都要有x权限,否则 www-data 进不去子目录
安全加固:默认关掉所有危险通道
静态服务不需要的功能,一律显式关闭:
- 禁止目录浏览:
autoindex off;(不加这行,访问空目录会列文件) - 限制 HTTP 方法:
if ($request_method !~ ^(GET|HEAD|OPTIONS)$) { return 405; } - 隐藏敏感文件:
location ~ /\. { deny all; }(屏蔽 .git、.env 等) - 禁用高危后缀:
location ~* \.(php|pl|py|sh|cgi)$ { return 444; }
性能与缓存:让浏览器多扛一会儿
静态资源变少,服务器压力才真小:
- 通用资源(JS/CSS/字体):
expires 1y;+add_header Cache-Control "public, immutable"; - 图片类资源:
expires 30d;,加上access_log off;减少 IO - 开启内核零拷贝:
sendfile on;+tcp_nopush on; - 文件句柄缓存:
open_file_cache max=1000 inactive=20s;,避免反复 open/close











