root指令通过拼接请求uri与指定路径查找文件,如location /files/ { root /data/storage; }时,/files/report.pdf对应/data/storage/files/report.pdf;需确保目录结构存在、权限正确、不写在if中且末尾无斜杠。

用 root 指令搭静态文件服务器,核心就一条:让 Nginx 知道“文件放在哪”,然后它自动把请求地址拼上去找。不写错路径、不漏权限、不混用 alias,基本就能跑通。
root 是怎么找文件的
root 不改请求路径,只做拼接。比如配置:
location /files/ { root /data/storage; }
当用户访问 /files/report.pdf,Nginx 实际查找的是:
/data/storage/files/report.pdf
注意:location 中的 /files/ 会原样出现在拼接路径里。也就是说,/data/storage 目录下必须真实存在 files/ 这个子目录,否则 404。
- root 值末尾不要加斜杠(如
/data/storage/),Nginx 会自动处理,多加可能引发双斜杠异常 - 它不解析软链接本身,但操作系统会跟随软链接——若目标路径权限不对或 SELinux 限制,照样 403
- 不能写在
if块里,行为不可靠,必须放在location或更外层作用域
三步完成基础配置
以服务个人博客或前端构建产物为例:
- 确认文件已就绪:Hexo 执行
hexo g、Hugo 执行hugo,输出目录(如/home/user/blog/public)里有index.html且能本地打开 - 编辑站点配置(如
/etc/nginx/conf.d/blog.conf):server { listen 80; server_name blog.example.com; root /home/user/blog/public; index index.html; location / { try_files $uri $uri/ =404; } } - 检查并加载:
- 运行
nginx -t验证语法 - 确保 Nginx 用户(如
www-data)对/home/user/blog/public及其父目录有读+执行(r-x)权限 - 执行
nginx -s reload
- 运行
什么时候该换 alias
当你不想让 location 路径出现在最终文件路径里,就该用 alias。
例如,想把所有 /api-docs/xxx 请求都指向 /usr/share/nginx/html/redoc/xxx:
- ✅ 正确(用 alias):
location /api-docs/ { alias /usr/share/nginx/html/redoc/; }
→ 请求/api-docs/index.html查找/usr/share/nginx/html/redoc/index.html - ❌ 错误(用 root):
location /api-docs/ { root /usr/share/nginx/html/redoc; }
→ 实际去找/usr/share/nginx/html/redoc/api-docs/index.html,目录不存在就 404
alias 的值结尾必须带斜杠,且必须是绝对路径;它直接替换 location 前缀,不拼接。
常见问题快速排查
遇到 403、404 或空白页,先看这几点:
-
403 Forbidden:多半是权限问题。检查 Nginx 工作用户能否进入 root 目录每一级父目录(
ls -ld /home /home/user /home/user/blog /home/user/blog/public),每级都要有x权限 -
404 Not Found:确认请求路径是否和磁盘上实际路径结构完全一致;用
curl -I http://localhost/files/test.txt和ls -l /data/storage/files/test.txt对照 -
页面打开但资源加载失败(CSS/JS 404):检查 HTML 中引用的路径是否为相对路径(如
css/style.css),它会相对于当前 URL 拼接,不是相对于 root 目录 - SELinux 启用时,即使权限正确也可能拦截:临时禁用测试
setenforce 0,或为目录添加上下文semanage fcontext -a -t httpd_sys_content_t "/data/storage(/.*)?"再restorecon -Rv /data/storage











