nginx 的 root 指令必须使用以 / 开头的绝对路径,如 /var/www/my-app/dist/;它不解析相对路径、环境变量或符号链接,且路径优先级遵循 location > server > http 层级继承。

直接写以 / 开头的完整路径,不加点号、不省略层级,Nginx 就不会猜、不会错。
必须用绝对路径,不是“建议”而是硬性要求
Nginx 的 root 指令从不基于配置文件位置或进程工作目录解析路径。它把值当字面字符串处理——你写 root ./dist;,它就真去当前工作目录(比如 /usr/local/nginx)下找 ./dist;你写 root html;,它会去找根目录下的 /html,而不是配置文件同级的 html 文件夹。
- 正确写法示例:
root /var/www/my-app/dist;、root /home/deploy/frontend;、root C:/nginx/html;(Windows 下也一样要写盘符) - 路径末尾加不加
/都可,但统一写成/var/www/my-app/dist/更清晰,避免歧义 - 不要依赖环境变量或符号链接路径,Nginx 不展开它们
确认路径真实存在且可读
光写对还不够,Nginx 进程得能进得去、看得见。
- 在终端执行
ls -ld /你写的绝对路径,检查目录是否存在、权限是否包含r-x(对 Nginx 用户,如www-data或nginx) - 再进该目录执行
ls -l index.html,确认入口文件存在且可读 - 如果用的是 SELinux(如 CentOS/RHEL),还需检查上下文:
ls -Z /path,必要时用chcon -R -t httpd_sys_content_t /path
验证配置是否真正生效
别只靠 reload 就认为 OK,实际访问时出错才暴露问题。
- 先运行
sudo nginx -t,确保语法无误 - 重载配置:
sudo systemctl reload nginx(或sudo nginx -s reload) - 访问页面同时盯住错误日志:
tail -f /var/log/nginx/error.log,它会明确告诉你 Nginx 实际尝试打开哪个路径,以及失败原因(如No such file or directory或Permission denied)
location 块中 root 的优先级与继承逻辑
root 可出现在 http、server、location 三个层级,越靠近请求路径,优先级越高。
- 如果
server块写了root /var/www/main;,而某个location /api/里又写了root /opt/backend/static;,那么该 location 下所有请求都走后者 - 如果某个
location /assets/里没写root,它就会继承server块的 root,拼接出/var/www/main/assets/xxx - 不建议在
http块设全局 root,容易被覆盖且难维护











