网页一片白?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 标签。

相关推荐
csdn_aspnet9 小时前
macOS 10 、Docker 玩轉 MySQL
运维·mysql·macos·docker·容器·mac
Java码农也是农9 小时前
一篇文章讲清 NGINX 反向代理:location、proxy_pass、负载均衡与排错
nginx·负载均衡·后端开发·反向代理·proxy_pass
对象存储与RustFS10 小时前
Jenkins 的构建产物别堆在控制器磁盘:用 RustFS 当它的 S3 工件仓库
后端·docker·云原生
李纲明1 天前
WordPress 打开页面直接报 500 而不是白屏:先核伪静态与文件权限,再查服务器错误日志
nginx·wordpress·文件权限·伪静态·错误日志·devdiy·500错误
java_logo1 天前
Docker 部署 DeepSeek Harness(moelin):轻松搭建带登录的本地 AI Agent 平台
运维·docker·容器·ai agent·deepseek·harness·轩辕镜像
xbzb1 天前
容器 IP 每次重建都变?docker network 五种模式与自定义网桥固定地址
网络·docker·容器·ip·network·固定
打工仔折腾 AI1 天前
Changedetection.io 网页变动监控:Docker 部署、通知配置与公网暴露实践
运维·人工智能·后端·python·docker·容器·性能优化
xbzb2 天前
自建镜像仓库:registry 一条命令 + harbor 部署、授权、跨库同步与卸载
docker·harbor·镜像·仓库·同步·registry
Csvn2 天前
Nginx 配置语法与上下文:一次搞懂继承、变量与用 map 替掉 if
后端·nginx
wz97542 天前
Docker 从 systemd 托管容器、overlay2 存储驱动到 Compose 多容器实战
spring cloud·docker·eureka