一次 Nginx 音频 403 问题的完整排查与复盘(Docker 场景)
·1 分钟
一次 Nginx 音频 403 问题的排查与复盘,涉及 Docker 场景下的权限配置问题,排查过程、问题根因以及正确的解决方式
nginx
docker
403
背景 #
在今天工作时碰到了一个非常奇怪的问题:
- 明明后端接口正常返回了音频文件的访问链接
- 但在页面或播放器中请求该链接时,直接返回
403 - 且接口本身无任何异常日志
然后我经过同事的指导:
- 将 Nginx 配置修改为
user root时,一切正常 - 改成普通用户(如
user user)后,音频请求立刻403
运行环境说明 #
宿主机
└── Docker
└── nginx 容器
├── nginx master(root)
└── nginx worker(由 user 指令决定)
也就是说:
- Nginx 运行在 Docker 容器中
- 实际读音频文件的是
nginx worker进程 worker的 Linux 用户由nginx.conf中的user指令决定
初步排查过程 #
1. 检查 Nginx 状态 #
systemctl status nginx 主要用于确认:
- 是否存在宿主机 nginx
- 理清当前环境的 nginx 来源
最终确认:真正提供服务的是 Docker 容器内的 nginx。
2. 修改 Nginx 配置并 reload #
在经理的帮助下,修改 nginx 配置,将:
user nginx;
改为:
user root;
并通过以下命令重新加载配置(在运行中的 Nginx 容器内):
docker exec -it nginx nginx -s reload
说明:该命令向容器内 Nginx 的 master 进程发送
reload信号,使其重新加载配置,不中断服务。
关键结论 #
这不是接口 403,而是 Nginx 文件系统权限导致的 403。
为什么 user root 没问题? #
- 当
user root时,nginx worker进程以root身份运行 root可以无视大部分文件权限限制- 即使文件或目录权限不正确,也能成功读取
为什么普通用户会 403? #
nginx worker以普通用户运行- 对音频文件或其父目录没有读取 / 执行权限
- Linux 返回
Permission denied - Nginx 将其映射为 HTTP
403
为什么接口能返回链接,但访问链接失败? #
这是本次问题中最迷糊的点。
| 模块 | 实际执行者 | 权限体系 |
|---|---|---|
| 接口返回音频链接 | 后端服务 | 后端进程权限 |
| 访问音频 URL | Nginx worker | Linux 文件权限 |
两个进程、两套权限体系,互不相干。
经验总结 #
本次问题的核心收获:
- HTTP
403并不一定是接口权限问题 - Nginx 静态资源访问直接依赖 Linux 文件权限
user root能跑 ≠ 配置是正确的- Docker 容器内的服务不能用
systemctl管理