阅读前:
此文排除了nginx存放静态文件目录与配置的静态文件目录不一致的情况。你可以百度此原因
本文探讨的是centOS7的selinux安全机制,会导致文件访问受限,从而nginx报错403
本文基于上文 nginx启动报错[emerg]bind xxx failed, permission denied(原因是selinux 安全机制端口限制) 的进一步发现问题及探究。
上文情况解决后,然后访问nginx代理的前端,会出现nginx 403 forbidden的问题,这个问题依然源于 selinux 安全机制
先简单科普一下,selinux 安全机制分为进程安全上下文、文件安全上下文。两者保持一致性则可通行!selinux 安全机制在上述问题上放行了端口限制,还需要 文件安全 限制的开放。
另外,可在某些命令加参数 -Z 来查看selinux 信息
分析验证:
首先,查看nginx 进程的selinux 信息
ps -efZ | grep nginx
结果为:
注意,红色方框内,通过冒号分隔的四个字段,代表:用户:角色:类型:级别,这些描述 selinux 的安全上下文(详知请百度),先注意第三个字段为 httpd_t 类型
查看nginx 静态文件目录(centOS下是 /usr/share/nginx/html,或者你自定义前端dist的目录)的 selinux 信息
PS:注意,我这里的目录是自定义的目录,总之是你静态文件的目录
可看到红色框内,第三个字段为 user_home_t 类型,与 nginx 进程的 httpd_t 不同,导致nginx进程无法访问该目录以及相应的文件!
因为 nginx 进程只能访问httpd_sys_content_t类型的文件,而 httpd可以读httpd_sys_content_t类型的文件。
于是,需要将该目录及子文件目录的 SELinux 信息修改为 httpd_sys_content_t
semanage fcontext -a -t httpd_sys_content_t '/yourpath/dist(/.*)?'
并刷新文件上下文信息即可(不刷新未更新,可自行查看 selinux 信息验证)
restorecon -R /yourpath/dist
总结:centOS7的selinux安全机制默认限制文件上下文访问,需要放行。