关于php-fpm启动之后出现file not found情况的原因分析

这两天遇到个特别诡异的问题,系统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外或给把$document_root换成真实路径什么的,虽然能解决一些普通的原因,却解决不了这个。如果路径不对的话不可能说通过方式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//相当于刷新使立即生效。

到此,问题解决!

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值