我在 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 在标准错误中发送:“主要脚本未知”同时从上游读取响应标头,客户端: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,我的问题就解决了,所以这将是某种权限问题,但我不知道是什么,因为它们所在的脚本和目录是开放的.
SELinux 已启用并阻止运行 PHP-FPM 的用户访问所有文件系统。改变这个解决了这个问题。
/var/log/audit/audit.log
正如迈克尔·汉普顿(Michael Hampton)的评论中所建议的那样,通过检查可以看到这一点。