问题描述
最近接手了一台别人配好的lnmp环境, php脚本不执行.
解决问题的思路
在开发环境下, 最好打开所有调试功能
如(nginx的access log;nginx的error log;php的error log;php-fpm的log)
下面是部分配置
php.ini
display_errors = On 这里打开后, 页面上就不会只显示500错误, 而是会提示具体的错误信息
log_errors = On //开启php的错误日志, 错误日志有助于定位问题
error_log = /var/log/php-error.log //设置错误日志的存放位置
php-fpm.conf
error_log = /var/log/php-fpm.log //顺手看看fpm的日志存放位置
可以多个终端, 通过 tail -f 文件名 来实时查看最新的日志信息
考虑以下几种可能
- nginx 配置fastcgi出错 [X]
- 目录权限问题 调的时候将网站根目录权限暴力的设为__777__(偷懒, 不推荐, 注意安全) [X]
- fpm的问题 新建了一个虚拟网站, 发现能够正确执行php脚本 [X]
- php配置文件加载不正确 php -i | grep "Loaded Configuration File" 经排查没错 [X]
以上情况都排除后, 从nginx的错误日志里看到如下提示
FastCGI sent in stderr: "PHP message: PHP Warning: Unknown: open_basedir restriction in effect. File(xxx.php) is not within the allowed path(s): (xxxxx) in Unknown on line 0
这里的关键是**open_basedir ** 但是在php.ini里没有发现设置过相关内容
经过查找
除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。原文链接
在网站根目录下 ll -a 果然发现了一个隐藏文件**.user.ini**
发现以后首先就想到把它删除
rm -rf .user.ini //Operation not permitted 删 除 不 掉
正确的步骤是在删除之前先执行
chattr -i .user.ini
删除该文件以后问题成功解决.
下面再看看这个文件里是个什么玩意儿
open_basedir=/sdfasf/:/tmp/:/proc/
将 PHP 所能打开的文件限制在指定的目录树,包括文件本身。本指令不受安全模式打开或者关闭的影响。open_basedir 功能链接