我在 CentOS 6.6 x64 上使用 Nginx 1.5.12.1 和 PHP-FPM 来运行 PHP 5.6.5。当我访问任何页面时,都会出现 404 错误:
文件未找到。
我的 PHP-FPM 错误日志没有显示任何有用的信息,但是我的 Nginx 错误日志:
2015/04/02 10:25:44 [错误] 24689#0:*35 FastCGI 在从上游读取响应标头时在 stderr 中发送:“主要脚本未知”,客户端:172.31.42.64,服务器:_,请求:“GET /_index.php HTTP/1.1”,上游:“fastcgi://127.0.0.1:9000”,主机:“www.dev.example.com”
此时,您可能认为SCRIPT_FILENAME
配置不正确。事实并非如此,或者至少在我看来是正确的。如果我启动数据包嗅探器并深入研究 Nginx 和 PHP-FPM 之间的连接,我可以看到变量设置正确:
SCRIPT_FILENAME
是/opt/example/_index.php
SCRIPT_NAME
是/_index.php
DOCUMENT_ROOT
是/opt/example
REQUEST_URI
是/_index.php
DOCUMENT_URI
是/_index.php
脚本确实位于/opt/example/_index.php
,文档根目录为/opt/example
。传递给 PHP-FPM 的这些变量是否有问题?
假设他们是正确的,我猜想 PHP-FPM 没有权限访问这些文件。我将所有内容都设置为777
,包括整个example
目录。但这并没有解决问题。
PHP-FPM 返回“主要脚本未知”的其他原因有哪些?我该如何进一步调试这种情况?PHP-FPM 是否需要其他权限才能工作?
编辑: 我发现如果我以 root 身份运行 PHP-FPM,我的问题就解决了,所以这将是某种权限问题,但我不知道是什么,因为它们所在的脚本和目录是开放的。
答案1
SELinux 已启用,并阻止运行 PHP-FPM 的用户访问所有文件系统。更改此设置可解决问题。
/var/log/audit/audit.log
按照迈克尔·汉普顿 (Michael Hampton) 的评论建议检查一下就可以看出这一点。