PHP-FPM 主要脚本未知,但 SCRIPT_FILENAME 设置正确

PHP-FPM 主要脚本未知,但 SCRIPT_FILENAME 设置正确

我在 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) 的评论建议检查一下就可以看出这一点。

相关内容