Mathew Asked: 2012-07-10 11:19:07 +0800 CST2012-07-10 11:19:07 +0800 CST 2012-07-10 11:19:07 +0800 CST Nginx + php5-fpm = “找不到文件” 772 我在使用 nginx / fpm 设置站点时遇到了困难。该页面显示“找不到文件”,这出现在 nginx error.log 中: FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream 我是 nginx 和 fpm 的新手,该错误消息对我来说毫无意义(甚至谷歌机器也没有帮助!)。任何人都可以阐明可能发生的事情吗? nginx php-fpm socket 7 个回答 Voted Best Answer Michael Hampton 2012-07-10T12:00:15+08:002012-07-10T12:00:15+08:00 您应该有一个location部分来处理配置类似于此的 PHP 请求: location ~ \.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } (额外try_files解决了一个安全漏洞,该漏洞可能允许任意文件作为 PHP 执行。) 另外,yourroot应该定义在server配置文件的section中,而不是locationsection. 这是最常见的nginx 配置错误之一。 Kenneth 2013-04-11T03:49:23+08:002013-04-11T03:49:23+08:00 这是乘客安装的说明。 我刚刚通过 passenger 从源代码安装了 nginx,这导致了 php5-fpm 的问题。默认的 nginx.conf 使用了 Michael Hampton 描述的问题。解决方案是删除 root 和 index 指令周围的块,因此: location / { root html index index.html index.htm } 变成: root html index index.html index.htm 此外,php 块设置不正确。请参阅迈克尔汉普顿的答案以了解正确的方法。 额外注意事项可能是,如果 php5-fpm 设置为使用套接字,则将 nginx.conf 中 php 块中的 fastcgi_pass 参数指向 /etc/php5/fpm/pool.d/www.conf 中的套接字设置。 complistic 2014-05-06T22:24:39+08:002014-05-06T22:24:39+08:00 我刚刚在新版本的 nginx 中遇到了这个问题。(配置取自旧版本) 我所要做的就是将include fastcgi_params;我的习惯放在上面,SCRIPT_FILENAME如下所示: location @web { try_files $uri =404; include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root/index.php; } 因为SCRIPT_FILENAME被覆盖了。 radiumsoup 2016-03-25T08:16:38+08:002016-03-25T08:16:38+08:00 如果您在位置块中使用别名,未处理的 404 错误也可能表现出这种行为。如果浏览器中显示的页面是简单文本“未找到文件”而不是格式更漂亮(居中)的 nginx 404 页面,您可以看到这一点。本质上,它真的是在说找不到404页面。 要解决这个问题,请在您的位置块中添加try_files $uri =404一行并重新加载 nginx 配置。除了Michael Hampton所说的解决特定安全漏洞之外,这还允许 fastcgi 处理程序覆盖别名定义并在默认位置找到 404 脚本。 homeway 2017-01-13T17:55:23+08:002017-01-13T17:55:23+08:00 sudo vim /etc/php-fpm.conf 关于第 149 行,更改 php 用户 && 用户组 我现在测试成功了。 Ian Lewis 2013-04-27T14:56:33+08:002013-04-27T14:56:33+08:00 我见过 : FastCGI 在 stderr 中发送:“主脚本未知”,同时从上游读取响应标头 在压力测试时我置于高负载下的服务器中。我怀疑操作系统的可用文件句柄已用尽,但仍有待确认。在这种情况下,php-fpm 无法获得对该文件的引用。 我意识到这是推测性的,但它肯定符合我的情况,也可能对其他人有所帮助。 Love 2017-06-02T00:26:26+08:002017-06-02T00:26:26+08:00 谢谢@homeway,你的回答启发了我。非常感谢! 我遇到了同样的问题,但是其他方法并没有帮助我解决问题! 我解决了,我发现关键是: Linux 用户权限导致问题:FastCGI 在标准错误中发送:“主脚本未知” 因为 PHP-FPM 默认的 user:group 是 apache:apache,但是你的代码目录是 someBody:someBody。所以你应该更改用户权限! 我写了一篇博客来解决这个问题,你可以看看这篇博客: [标准错误中发送的 Nginx FastCGI:“未知主脚本”][1]`[1]: http: //geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html
您应该有一个
location
部分来处理配置类似于此的 PHP 请求:(额外
try_files
解决了一个安全漏洞,该漏洞可能允许任意文件作为 PHP 执行。)另外,your
root
应该定义在server
配置文件的section中,而不是location
section. 这是最常见的nginx 配置错误之一。这是乘客安装的说明。
我刚刚通过 passenger 从源代码安装了 nginx,这导致了 php5-fpm 的问题。默认的 nginx.conf 使用了 Michael Hampton 描述的问题。解决方案是删除 root 和 index 指令周围的块,因此:
变成:
此外,php 块设置不正确。请参阅迈克尔汉普顿的答案以了解正确的方法。
额外注意事项可能是,如果 php5-fpm 设置为使用套接字,则将 nginx.conf 中 php 块中的 fastcgi_pass 参数指向 /etc/php5/fpm/pool.d/www.conf 中的套接字设置。
我刚刚在新版本的 nginx 中遇到了这个问题。(配置取自旧版本)
我所要做的就是将
include fastcgi_params;
我的习惯放在上面,SCRIPT_FILENAME
如下所示:因为
SCRIPT_FILENAME
被覆盖了。如果您在位置块中使用别名,未处理的 404 错误也可能表现出这种行为。如果浏览器中显示的页面是简单文本“未找到文件”而不是格式更漂亮(居中)的 nginx 404 页面,您可以看到这一点。本质上,它真的是在说找不到404页面。
要解决这个问题,请在您的位置块中添加
try_files $uri =404
一行并重新加载 nginx 配置。除了Michael Hampton所说的解决特定安全漏洞之外,这还允许 fastcgi 处理程序覆盖别名定义并在默认位置找到 404 脚本。关于第 149 行,更改 php 用户 && 用户组
我现在测试成功了。
我见过 :
在压力测试时我置于高负载下的服务器中。我怀疑操作系统的可用文件句柄已用尽,但仍有待确认。在这种情况下,php-fpm 无法获得对该文件的引用。
我意识到这是推测性的,但它肯定符合我的情况,也可能对其他人有所帮助。