FastCGI:“与服务器通信中止:读取失败”仅针对一个特定文件

FastCGI:“与服务器通信中止:读取失败”仅针对一个特定文件

相关问题: FastCGI 和 Apache 间歇性出现 500 错误

该解决方案对我来说不起作用。


问题:

我有一个 Laravel 5.1 应用程序(在其他服务器上生产时没有任何问题)在一个新的Ubuntu 14.04 服务器Apache 2.4.7和 PHP 通过PHP-FPM

只要应用程序中没有调用某个文件,一切都可以正常工作:

$compiledPath = __DIR__.'/cache/compiled.php';

if (file_exists($compiledPath)) {
    require $compiledPath; // this causes a "500 Internal Server Error"
}

这是一个 Laravel 特定的文件自动创建框架本身可以加快速度(所以这不是我的代码中的错误),它确实存在,而且我有完全访问权限。约600kB大小。当我删除它时,一切都正常。但是当我告诉 Laravel 再次创建它,然后点击应用程序的任何路由时,我收到“500 内部服务器错误”,其中包含以下日志条目:

[fastcgi:error] [pid 14334](104)对等方重置连接:[客户端 xxx.xxx.xxx.xxx:41395] FastCGI:与服务器“/var/www/clients/client1/web1/cgi-bin/php5-fcgi-yyy.yyy.yyy.yyy-80-domain.com”通信中止:读取失败

[fastcgi:error] [pid 14334] [client xxx.xxx.xxx.xxx:41395] FastCGI:从服务器“/var/www/clients/client1/web1/cgi-bin/php5-fcgi-yyy.yyy.yyy.yyy-80-domain.com”接收到不完整的标头(0 字节)

[fastcgi:error] [pid 14334](104)对等方重置连接:[客户端 xxx.xxx.xxx.xxx:41395] FastCGI:与服务器“/var/www/clients/client1/web1/cgi-bin/php5-fcgi-yyy.yyy.yyy.yyy-80-domain.com”通信中止:读取失败

[fastcgi:error] [pid 14334] [client xxx.xxx.xxx.xxx:41395] FastCGI:从服务器“/var/www/clients/client1/web1/cgi-bin/php5-fcgi-yyy.yyy.yyy.yyy-80-domain.com”接收到不完整的标头(0 字节)

我尝试过的:

我尝试了上述相关问题中的解决方案,这也代表了我能找到的有关此问题的大多数其他建议:尝试使用常见的 PHP-FPM 设置以分配更多资源。接受的答案还提到了完全放弃 FastCGI 的选项,但我不想这样做。所以我尝试了各种值,但没有成功。

由于只有我一个人在使用,所以服务器上没有任何负载,所以我真的怀疑这是一个可用资源的问题(它是一个具有 12GB RAM 的 VPS)。这可能与文件大小有关吗?这是唯一一个这么大的 PHP 文件。

我可以在两台配置相同的服务器上重现这个问题。不是发生在装有 Apache 2.2 和 FastCGI 的 Ubuntu 12.04 服务器上。

我当前的配置:

PHP-FPM:

pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5
pm.max_requests = 0

<IfModule mod_fastcgi.c>
    ...
    Alias /php5-fcgi /var/www/....
    FastCgiExternalServer /var/www/.... -idle-timeout 300 -socket /var/lib/php5-fpm/web1.sock -pass-header Authorization
</IfModule>

php.ini

memory_limit = 512M
output_buffering = on

答案1

如果 PHP 仅在特定源文件上失败,最可能的原因是某些 PHP 代码加速器(操作码缓存)如 Xcache、APC 或 eAccelerator 存在文件问题。这可能是由于加速器或 PHP 本身存在错误。

您可以尝试通过 PHP 命令行界面(php-cli命令)运行脚本,因为 PHP CLI 不使用任何加速器。

相关内容