这两天遇到个特别诡异的问题,系统 centOS7,有两种方式可以启动 php-fpm:
1 /usr/sbin/php-fpm 直接启动 (我的可执行文件在这个路径)
2 通过 service 启动,即 systemctl start php-fpm
然而会出现一个诡异的现象,通过方式 1 启动的进程没有任何问题,而通过 service 启动的 php-fpm 进程在加载 php 文件时却会出现 file not found 的错误,访问静态文件正常。
网上搜索了很多原因,却都是千篇一律,都是说什么路径没配置好,nginx 配置文件的 root 选项应该放在 location 外或给把 $documentroot 换成真实路径什么的,虽然能解决一些普通的原因,却解决不了这个。如果路径不对的话不可能说通过方式 1 能正常访问的,这个大家应该都能明白。
好了,进入正题,如果你也像为一样遇到了这个问题,那么你很幸运,不需要像我一样踩这么多坑了。
经过一番折腾,排除所有原因,最终发现问题:selinux 权限问题所致!
怎么样,坑吧 ^^, 差点崩溃。
以我的网站目录为例:/home/www/web.
php-fpm 在访问 web 目录下 的 index.php 文件时,被 selinux 拦截,访问被阻止,所以出现一开始说的 file not found 的情况。
至于为什么会出现,个人感觉应该是因为通过 service 方式启动时,selinux 会有一个检测的过程,没有被通过,所以导致这个结果。
而为什么没被通过?则是跟 / home/www/web/index.php 文件的属性权限有关,通过 ll -Z 命令可以看到:
[root@vikie-pc web]# ll -Z
-rwxrwxr-x. www www unconfined_u:object_r:httpd_user_content_t:s0 index.php
可以看到 object_r:httpd_user_content_t,叫作安全性文本
接下来就会有两个解决办法:
第一种:关闭 selinux!——简单粗暴,给力有效。然而,会降低系统的安全性,所以就有了第二种方法。
第二种:将 httpd_user_content_t 添加至 selinux 安全上下文,可通过执行如下命令:
[root@vikie-pc www]# semanage fcontext -a -t httpd_user_content_t '/data/www/index.php'//增加index.php的selinux安全上下文设置
[root@vikie-pc www]# restorecon -v '/data/www/index.php'//恢复默认安全上下文
restorecon reset /data/www/index.php context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_user_content_t:s0
[root@vikie-pc www]# grep php-fpm /var/log/audit/audit.log | audit2allow -M mypol//将php-fpm添加至selinux拦截白名单
[root@vikie-pc www]# semodule -i mypol.pp//相当于刷新使立即生效。
到此,问题解决!
Sharezer , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于php-fpm启动之后出现 file not found 情况的原因分析!