网页一片白?Docker 跑 Nginx 读不到文件,403 Forbidden 排查实录

📖 背景

大屏前后端分离。前端打包成静态文件。用 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 标签。

相关推荐
\光辉岁月/3 小时前
2.spring5-IOC
java·容器·ioc·注解
ms72wx3 小时前
Docker 命令学习笔记:从入门到进阶的实战指南
笔记·学习·docker
java_logo3 小时前
Docker 部署 Excalidraw:轻松搭建手绘风格白板
运维·docker·容器·excalidraw·白板·轩辕镜像
海的透彻6 小时前
如何让docker容器启动时用自定义的用户
java·docker·dubbo
程序员清风7 小时前
LibreChat 实战:用 Docker 搭建可扩展的多模型对话平台
运维·docker·容器
Web3&Basketball8 小时前
从0到1落地AI Agent沙箱隔离Docker实战:踩坑全记录
运维·docker·容器·agent·容器安全·沙箱隔离
bluebonnet278 小时前
【docker】使用regctl免安装docker下载镜像
运维·docker·容器
Java开发追求者1 天前
windows快速安装docker
windows·docker·安装·1024程序员节
骑着蜗牛撵大象3271 天前
飞牛fnOS部署Damselfly:Compose编排、照片目录与7100固定访问
java·docker·rpc·dubbo·fnos·照片管理·damselfly