• 发生时间: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 用户具有访问对应静态文件的权限。