在 CentOS 环境中提到“context 拒绝访问”,通常和 SELinux 有关,而不是普通权限(chmod/chown)问题。
下面分点说明原因和排查方法。
在 CentOS(尤其是启用 SELinux 的系统)中:
user:role:type:level
例如:system_u:object_r:httpd_sys_content_t:s0
当 进程的 context 和 文件的 context 不匹配 时,即使 ls -l 显示权限是 755,也会被拒绝访问。
例如:
/home 下,但 context 仍是 user_home_t例如:
mv /home/test.html /var/www/html/
mv 会保留原来 context,导致错误。
getenforce
# Enforcing
sudo tail -f /var/log/audit/audit.log
# 或
sudo ausearch -m avc -ts recent
看到类似:
avc: denied { read } for ... scontext=... tcontext=...
说明 SELinux 拒绝了访问。
# 恢复默认 context
restorecon -Rv /var/www/html
# 或修改指定类型
semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
restorecon -Rv /data/www
例如:
/var/www/var/ftpsetenforce 0 # 临时关闭 SELinux
如果这样能访问,说明就是 context / SELinux 问题。
ausearch -c 'nginx' --raw | audit2allow -M mynginx
semodule -i mynginx.pp
getenforce → Enforcing?audit.log 是否 avc deniedls -Z 看文件 contextrestorecon 修复如果你能告诉我:
我可以直接给你精确的修复命令。