FastCGI:“與伺服器通信中斷:讀取失敗”僅針對一個特定文件
相關問題: FastCGI 和 Apache 500 間歇性錯誤
該解決方案對我不起作用。
問題:
我有一個 Laravel 5.1 應用程序(在其他伺服器上的生產中沒有任何問題)在帶有Apache 2.4.7和 PHP的全新Ubuntu 14.04 伺服器上通過****PHP-FPM執行。
只要應用程序中未呼叫某個文件,一切正常:
$compiledPath = __DIR__.'/cache/compiled.php'; if (file_exists($compiledPath)) { require $compiledPath; // this causes a "500 Internal Server Error" }
這是一個由框架本身自動創建的特定於 Laravel 的文件,以加快速度(所以這不是我的程式碼中的錯誤),它確實存在並且我擁有完全的訪問權限。它的大小約為 600kB。當我刪除它時,一切正常。但是當我告訴 Laravel 再次創建它,然後點擊應用程序的任何路由時,我得到一個“500 Internal Server Error”,並帶有以下日誌條目:
$$ fastcgi:error $$ $$ pid 14334 $$(104) 對等方重置連接:$$ client 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) 對等方重置連接:$$ client 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 文件。
我可以在具有相同配置的 2 台不同伺服器上重現該問題。它沒有發生在帶有 FastCGI 的 Apache 2.2 的 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
如果 PHP 僅在特定的源文件上失敗,最可能的原因是某些 PHP 程式碼加速器(操作碼記憶體)如 Xcache、APC 或 eAccelerator 存在文件問題。這可能是由於加速器或 PHP 本身中的錯誤。
您可以嘗試通過 PHP 命令行界面(
php-cli
命令)執行您的腳本,因為 PHP CLI 不使用任何加速器。