📖 背景
大屏前后端分离。前端打包成静态文件。用 Docker 起了个 Nginx 做反代。
本地跑得好好的。上到 2核2G 服务器后,浏览器打开大屏直接白屏。F12 一看,CSS 和 JS 全报 403 Forbidden。
🔍 原因
小学生版解释:
宿主机的文件,是我用 ubuntu 账号建的,权限是 rw-r--r--。
Nginx 跑在 Docker 里,它在容器里的身份是个叫 nginx 的小弟(UID 101)。
Nginx 跨过门(挂载目录)去拿文件,发现文件夹大门紧锁,连看都不让看,直接甩个 403。
排查宿主机文件权限:
bash
ls -ld /home/user/dashboard/static
发现目录是 700,只有创建者能进。
🛠 解决
给容器里的小弟开条缝。绝对不能用 chmod 777。
最优雅的做法:在 docker-compose.yml 里指定容器运行用户,和宿主机保持一致。
services:
nginx:
image: nginx:alpine
user: "1000:1000" # 强制容器用 ubuntu 用户的 UID 和 GID 跑
volumes:
- /home/user/dashboard/static:/usr/share/nginx/html:ro
或者,如果不想改用户,给文件加 ACL 权限(仅限特定用户):
bash
sudo setfacl -R -m u:101:rx /home/user/dashboard/static
# 101 是 nginx 容器默认用户的 UID
✅ 验证效果
docker compose up -d。
刷新大屏。F12 网络面板,CSS/JS 从红色的 403 变成绿色的 200。
用 curl -I https://example.com/static/css/main.css 验证,返回 200 OK。
💣 三个坑
无脑 chmod 777:新手最爱。确实能立刻解决,但等于把大门敞开,安全风险极大,黑客最喜欢这种目录。
挂载路径写错:Docker 挂载如果是空目录,Nginx 会用自己的默认欢迎页顶替,导致你看到的是 Nginx 欢迎页,而不是你的大屏。
SELinux:如果你的云服务器开了 SELinux(虽然 Ubuntu 默认没有,但 CentOS 有),光改 rwx 权限没用,必须加 😒 或 :Z 标签。