nginx的root指令定义请求uri到文件系统的映射基准,需指向容器内路径(如/usr/share/nginx/html),并配合docker -v挂载宿主机目录至此路径;location中root会拼接完整uri,非/路径时推荐用alias避免多层目录。

Root 指令本身不挂载,它只是告诉 Nginx 去哪个路径找文件;真正起作用的是 Docker 的 -v 卷挂载,把宿主机目录映射到 root 所指向的容器内路径。
明确 root 路径与挂载目标的对应关系
Nginx 配置中的 root 指令定义的是“请求根路径(如 location /)下资源的物理起点”。例如:
-
root /usr/share/nginx/html;→ Nginx 会从容器内这个路径开始查找文件 - 你必须用
-v把宿主机的静态文件目录(如/data/www)挂载到/usr/share/nginx/html,Nginx 才能读到真实文件 - 如果配置写成
root /var/www;,但没挂载该路径,或挂载错了位置,就会 403/404
推荐挂载方式:直接映射到 root 指向的路径
最清晰、最不容易出错的做法是让挂载点和 root 值完全一致:
- 宿主机准备静态文件:
mkdir -p /data/nginx/html && echo "<h1>OK</h1>" > /data/nginx/html/index.html - 配置 nginx.conf 或 conf.d/*.conf 中的 server 块:
root /usr/share/nginx/html; - 启动容器时挂载:
docker run -d -p 80:80 -v /data/nginx/html:/usr/share/nginx/html nginx - 此时访问
http://localhost/就能正确加载 index.html
注意 location 与 root 拼接逻辑(易错点)
当 location 不是 / 时,root 的行为是“拼接”,不是“替换”:
-
location /api/ { root /usr/share/nginx/static; }→ 请求/api/data.json实际查找的是/usr/share/nginx/static/api/data.json(多了/api目录) - 若想让
/api/直接映射到某目录,应改用alias:location /api/ { alias /usr/share/nginx/static/; }(结尾斜杠关键) - 多数静态站点用
location /+root即可,无需复杂嵌套
配合 conf.d 挂载实现多站点隔离
若需多个虚拟主机,建议每个站点用独立 .conf 文件 + 独立挂载路径:
- 宿主机结构:
/data/sites/site-a/html、/data/sites/site-b/html - site-a.conf:
server { listen 80; server_name a.example; root /var/www/site-a; } - 启动时挂载:
-v /data/sites/site-a/html:/var/www/site-a -v /data/sites/site-a/conf:/etc/nginx/conf.d - 这样 root 路径、挂载路径、配置文件三者一一对应,维护清晰











