数据盘按安全基线把挂载点收成七百之后,nginx 读不到静态文件,错误日志里全是 Permission denied,可文件本身的权限明明是六百四十四。

原因不止一个,得分开看。挂载点属主是 root,运行用户根本进不去。还有一种是父目录某一级没有执行权限,路径无法穿透。

不容易想到的是,SELinux 标签在新盘上没有被正确继承。

第一件事是逐级检查路径权限

namei -l /data/www/site

随后把属主改成运行用户

chown -R www:www /data/www

给目录补执行权限

chmod 755 /data /data/www

末了核对 SELinux 上下文

ls -Zd /data/www && restorecon -Rv /data/www

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

报错是间歇性的,我蹲守了半小时才抓到一次完整现场。

恢复的判定其实很直接。以运行用户身份读取目标文件成功,错误日志不再出现 Permission denied,静态资源返回两百。

补一句。父目录没有执行权限时,子文件给到七百七十七也读不到;排查要从根开始逐级看,别只盯着最后一级。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189