-
发生时间:2022-10-13
-
问题描述:
- 产线平台使用 nginx 搭建了静态文件服务,并且静态文件存放在个人账号 wuhualong 的 HOME 目录下,因此我想将静态文件移动到公共账号的 HOME 目录下。
- 首先执行
adduser命令来创建 pat 账号 - 然后执行
sudo mv /home/wuhualong/assets /home/pat命令来移动静态文件目录。 - 接着修改 nginx 配置文件
/etc/nginx/sites-available/default的相关文件路径,并使用sudo nginx -s reload命令来重启 nginx 服务。 - 最后,在浏览器访问静态文件,浏览器页面报错
403 Forbidden。
-
问题类别:软件部署
-
原因分析:
- 执行命令
sudo cat /var/log/nginx/error.log查看 nginx 错误日志,发现确实有相关打印:stat() "/home/pat/assets/dfh2/" failed (13: Permission denied) - 为避免影响产线生产,暂时将产线服务器的静态文件和 nginx 配置都恢复到原始状态,然后在本地环境进行问题复现与分析。
- 我很快想起来自己是参考软件组的 admin-rules 仓库的「账号管理」一文来创建账号的,里面要求在
/etc/adduser.conf配置DIR_MODE=0750,表示用户 HOME 目录默认不允许其他用户查看。
# 根据以下输出结果,/home/pat 的权限为 `drwxr-x---`,最后三个字符 `---` 代表其他用户不能访问此目录。 -> % ls -al /home/ total 28 drwxr-xr-x 7 root root 4096 Oct 13 16:02 . drwxr-xr-x 18 root root 4096 Jul 14 2021 .. drwxr-xr-x 5 gitlab-runner gitlab-runner 4096 Apr 20 16:55 gitlab-runner drwxr-x--- 5 pat pat 4096 Oct 14 12:09 pat drwxr-xr-x 8 wuhualong wuhualong 4096 Oct 14 14:10 wuhualong- 因此不难猜测到原因:nginx 进程对应的用户不具有查看 pat 账号的 HOME 目录的权限。执行
ps命令发现 nginx 进程对应的用户是 www-data。 (/etc/nginx/nginx.conf文件的第一行配置了user www-data)
-> % ps -elf | grep nginx 5 S root 1499432 1 0 80 0 - 21548 - Oct13 ? 00:00:00 nginx: master process nginx 5 S www-data 1501439 1499432 0 80 0 - 21652 - 12:09 ? 00:00:00 nginx: worker process 5 S www-data 1501440 1499432 0 80 0 - 21652 - 12:09 ? 00:00:00 nginx: worker process- 执行
groups命令发现 www-data 用户并没加入除自身以外的其他 group,因此确实没有访问 pat 用户的 HOME 目录的权限。
-> % groups www-data www-data : www-data- 那为什么 www-data 用户能够访问 wuhualong 用户 的 HOME 目录呢?
这是因为 wuhualong 用户的 HOME 目录配置了
0755的权限——这意味着其他用户也能访问。
- 执行命令
-
解决方案:
- 执行
adduser www-data pat命令将 www-data 账号添加到 pat 群组。
- 执行
-
实施结果:
- 将 www-data 账号添加到 pat 群组后,可以通过浏览器正常访问静态文件。
-
经验总结:
- 使用 nginx 搭建静态文件服务时,需要确保 nginx 用户具有访问对应静态文件的权限。