CentOS Stream 下 Nginx 403 权限问题解决
最近在 B 站跟黑马学运维,传送地址:https://www.bilibili.com/video/BV1heK3znEeH?p=33&vd_source=d87d2c69a2fd95640b02bb71c72f29ca。在部署前端项目时,Nginx 一直返回 403 Forbidden
,静态资源死活访问不了。作为 CentOS Stream 系统的“受害者”,踩了一堆权限坑后,终于解决,把过程整理成这篇文章,帮大家避坑!
起因是我访问服务器地址 ,浏览器持续显示 403 Forbidden
,Nginx 错误日志疯狂输出 Permission denied
,静态文件完全无法访问。
最开始认为是文件权限问题,用 ls -l
查看 /var/www/dist
目录,发现文件权限好像确实不对。
然后用常规命令修改权限:
chown -R nginx:nginx /var/www/dist
chmod -R 755 /var/www/dist
改完重启 Nginx ,但是还是一样的显示!显然,不是设置这个权限的问题。
后来一想,是不是我nginx的配置文件问题,重新修改了一次配置文件,还是不行。甚至我还在想是不是我的后端有问题,也去检查了一下后端通信,发现没有问题,但是还是显示不了。最后当我要放弃的时候,灵机一动,想着有没有可能是系统的问题(因为之前遇到过),然后就去查了一下,发现CentOS Stream 默认开启 SELinux,它会通过“安全上下文”额外限制进程访问文件。用 getenforce
检查,果然是 Enforcing
模式。
这样即使我们的 Linux 权限正确,SELinux 不允许的话,Nginx 仍无法访问文件。
找到了问题的根源,终于可以解决了。首先我们先关闭一下SELinux,执行下面的命令:
setenforce 0 # 临时关闭,重启系统后失效
关闭后立即访问了一下,发现可以正常打开前端页面了(开心到起飞!):
这就说明了 SELinux 是主要原因,接下来我们配置永久规则(之前那个命令系统重启后就失效了):
这里有两种方法,第一个是直接修改 /var/www/dist
目录及其子文件的 SELinux 安全上下文,将其标记为 httpd_sys_content_t
类型,明确允许 Nginx 访问。
安全上下文是 SELinux 的核心控制机制,每个文件和进程都有特定的标签,SELinux 根据标签决定是否允许访问。我们给 /var/www/dist
目录设置正确的 SELinux 安全上下文:
chcon -Rv --type=httpd_sys_content_t /var/www/dist
setsebool -P httpd_can_network_connect 1
第二个方法是通过修改 SELinux 的 布尔值(Boolean) 规则,允许 Nginx读取用户目录下的文件。
布尔值是 SELinux 中一种灵活的开关机制,可以在不改变文件安全上下文的情况下,临时或永久调整进程的访问权限。通过布尔值灵活开放权限:
setsebool -P httpd_read_user_content 1
sudo setsebool -P httpd_can_network_connect 1
这就是解决这个问题的方法啦,如果你遇到这种类似的问题,修改权限解决不了,可以试试从系统层面来试着解决一下哦!!!