2015-11-19 13 views
14

Dies wurde vor https://stackoverflow.com/a/12686252/219116 gefragt und beantwortet, aber die Lösung dort funktioniert nicht für mich.PHP und mod_fcgid: ap_pass_brigade fehlgeschlagen in handle_request_ipc Funktion

mod_fcgid Config

<IfModule mod_fcgid.c> 
    AddHandler fcgid-script .fcgi 
    FcgidIPCDir /var/run/mod_fcgid/ 
    FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm 

    FcgidIdleTimeout 60 
    FcgidProcessLifeTime 120 
    FcgidMaxRequestsPerProcess 500 
    FcgidMaxProcesses 150 
    FcgidMaxProcessesPerClass 144 
    FcgidMinProcessesPerClass 0 
    FcgidConnectTimeout 30 
    FcgidIOTimeout 600 
    FcgidIdleScanInterval 10 
    FcgidMaxRequestLen 269484032 

</IfModule> 

PHP-CGI-Skript

#!/bin/bassh 
export PHPRC=/var/www/vhosts/example.com/etc/ 
export PHP_FCGI_MAX_REQUESTS=5000 
exec /usr/bin/php-cgi 

System-Details

  • CentOS Linux-Version 1503.01.07 (Core)
  • httpd-2.4.6- 31.el7.centos.x86_64
  • mod_fcgid-2.3.9-4.el7.x86_64
  • php56u-cli-5.6.12-1.ius.centos7.x86_64

Also mein FcgidMaxRequestsPerProcess ist auf 500 und meine PHP_FCGI_MAX_REQUESTS ist auf 10x wie in den vorherigen Antworten und der Apache-Dokumentation vorgeschlagen. Und doch bekomme ich immer noch diese Fehler

[Thu Nov 19 18:16:48.197238 2015] [fcgid:warn] [pid 6468:tid 139726677858048] 
(32)Broken pipe: [client X.X.X.X:41098] mod_fcgid: ap_pass_brigade failed in handle_request_ipc function 
+1

Sie möchten den gelöschten Scheck aus @ Vineet1982 Antwort entfernen. Der wahre Grund kann auf dem Blog von Avian nachgelesen werden: https: // www.tablix.org/~avian/blog/archives/2016/05/on_ap_pass_brigade_failed/ – aefxx

Antwort

3

Die Warnung hat nichts mit einer der Optionen Fcgidxxx zu tun und wird einfach dadurch verursacht, dass der Client die Seite der Verbindung schließt, bevor der Server eine Antwortmöglichkeit erhält.

von der eigentlichen Quelle:

/* Now pass any remaining response body data to output filters */ 
if ((rv = ap_pass_brigade(r->output_filters, brigade_stdout)) != APR_SUCCESS) { 
    if (!APR_STATUS_IS_ECONNABORTED(rv)) { 
     ap_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r, 
         "mod_fcgid: ap_pass_brigade failed in " 
         "handle_request_ipc function"); 
    } 

    return HTTP_INTERNAL_SERVER_ERROR; 
} 

Kredit geht an Avian's Blog, die davon erfuhren.

13

ich auch das gleiche Problem über einem Jahr immer wieder dann habe ich viele Dinge ausprobiert, und in den letzten ich habe einen Teil der Hit and Run Dinge nach Dokumentation Lesen und mein Problem getan ist weg. Zunächst werden die wichtigen Dinge erforderlich eingestellt werden als:

FcgidBusyTimeout  300 [default] 
FcgidBusyScanInterval 120 [default] 

Der Zweck dieser Richtlinie ist gehangen Anwendungen beenden. Das Standardzeitlimit muss möglicherweise für Anwendungen erhöht werden, die länger dauern können, um die Anforderung zu verarbeiten. Da die Überprüfung in dem Intervall von FcgidBusyScanInterval, Anforderungshandhabungs definiert durchgeführt wird, kann für eine längere Zeitperiode

FcgidProcessLifeTime  3600 [default] 

Idle Anwendungsprozesse ablaufen lassen, die für mehr als diese Zeit wird beendet existiert haben, wenn die Zahl von Prozessen für die Klasse übersteigt FcgidMinProcessesPerClass.

Diese Prozesslebensdauerprüfung wird mit der Frequenz FcgidIdleScanInterval durchgeführt.

FcgidZombieScanInterval 3 [seconds default] 

Das Modul prüft in diesem Intervall auf beendete FastCGI-Anwendungen. Während dieser Zeit kann die Anwendung in der Prozesstabelle als Zombie (unter Unix) existieren.

Hinweis: Alle oben genannten Optionen Verringern oder erhöhen Sie entsprechend Ihrer Anwendung Prozesszeit oder Bedürfnisse oder gelten für bestimmte vhost.

aber mein Problem lösen, indem Sie diese Option:

Above Optionen haben meinen Server gezwickt, aber nach einiger Zeit die Fehler scheinen wieder comming aber der Fehler wirklich durch dieses Problem zu beheben:

FcgidOutputBufferSize 65536 [default] 

I zu ändern habe es

FcgidOutputBufferSize 0 

Dies ist die maximale Menge an Antwortdaten das Modul aus dem FastC lesen GI-Anwendung, bevor die Daten an den Client gesendet werden. Dadurch werden die Daten sofort gelöscht und warten nicht mehr auf 64 KB an Bytes, was mir hilft, den Prozess schneller zu spülen.

Andere Probleme habe ich

wenn 500 Fehler von Nginx Ablaufen kommt. Das Update:

/etc/nginx/nginx.conf

keepalive_timeout 125; 
proxy_read_timeout 125; 
proxy_connect_timeout 125; 
fastcgi_read_timeout 125; 

Intermittently würde ich die MySQL-Fehler "MySQL Server verschwunden ist" get, die eine mehr zwicken erforderlich: /etc/my.conf

wait_timeout = 120 

Dann, gerade für funsies, ich ging voran und mein PHP-Speicherlimit upped, nur für den Fall: /etc/php. ini

memory_limit = 256M 

Mit SuExec

mod_fastcgi gar nicht unter SuExec auf Apache 2.x arbeiten. Ich hatte nichts als Ärger (es hatte auch viele andere Probleme in unseren Tests). Die eigentliche Ursache für Ihr Problem ist SuExec

In meinem Fall war das ein Startup für mich, ich starte Apache, mod_fcgid spawns genau 5 Prozesse für jeden vhost. Wenn nun ein einfaches Upload-Skript verwendet wird und eine Datei größer als 4-8KB übergeben wird, werden alle diese untergeordneten Prozesse gleichzeitig für den spezifischen vhost beendet, auf dem das Skript ausgeführt wurde.

Es könnte möglich sein, Debug-Build oder Hochfahren Anmeldung mod_fcgid, die einen Hinweis geben könnte.

Ich habe mod_fastcgi in der Zwischenzeit seit 1 Jahr ausprobiert und auch ich kann mit vielen anderen sagen, dass SuExec nichts als störend ist und in jedem Fall gar nicht flüssig läuft.

+0

Leider hat das Setzen von FcgidOutputBufferSize 0 die ap_pass_brigade-Fehler nicht beseitigt. Wissen wir überhaupt, was dieser Fehler bedeutet? – Slashterix

+0

Für verschiedene eingehende Anfragen Verteilung an bestimmte CGI-Server, Load Balancing, mehrere Websites hosting etc ... – Vineet1982

+0

@Slashterix Bitte sagen Sie den Modus von PHP, wie es mit php-fpm ausgeführt werden muss, wenn nicht dann wechseln Sie es und Ihre Probleme wäre weg. Wenn nicht, lass es mich nochmal wissen – Vineet1982