Apache 2.4 Event MPM + php-fpm + php-opcache führt zu „Verbindung vom Peer zurückgesetzt“-Fehlern

Apache 2.4 Event MPM + php-fpm + php-opcache führt zu „Verbindung vom Peer zurückgesetzt“-Fehlern

Ich habe einen CentOS 7-Server, auf dem Apache 2.4.6 mit Event MPM und php-fpm Version 5.6.10 (aus dem REMI-Repo) läuft. Hier ist die relevante Apache-Konfiguration zum Senden von Anfragen an php-fpm innerhalb des virtuellen Hosts (es ist die einzige Site auf diesem Server):

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>

Hier ist die relevante PHP-FPM-Pool-Konfiguration:

listen = /var/run/php-fpm/www.sock
listen.owner = apache
listen.group = apache
pm = static
pm.max_children = 50
pm.max_requests = 0

Hier ist die php-opcache-Konfiguration (die Standardinstallationskonfiguration):

zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist

Mein Problem:Immer wenn ich php-opcache installiere und aktiviere, werden die folgenden Fehler in meinem Fehlerprotokoll angezeigt:

[Thu Jun 18 08:10:58.499871 2015] [mpm_event:debug] [pid 16546:tid 139798115227392] event.c(986): (104)Connection reset by peer: [client 157.55.39.233:15962] AH00470: network write failure in core output filter
[Thu Jun 18 08:10:58.527424 2015] [mpm_event:debug] [pid 16546:tid 139797922195200] event.c(986): (103)Software caused connection abort: [client 157.55.39.233:15990] AH00470: network write failure in core output filter

Wenn ich php-opcache entferne, hören die Fehler auf. Benutzer melden immer dann einen 502 Service Unavailable-Fehler im Frontend.

Ich habe buchstäblich mindestens 6 Stunden damit verbracht, bei Google nach Lösungen zu suchen. Jemand sagte, dass die fastshutdownOption von opcache ein Problem sei, aber diese ist in der Standardkonfiguration deaktiviert. Ich habe die Prozessverwaltungsmethode von php-fpm auf statisch ohne Wiederverwendung geändert (max_requests=0), aber das hat auch nichts geändert. Ich habe auch versucht, die TCP-Proxy-Methode mit Apache zu verwenden (anstelle von Sockets), und das hatte auch keine Auswirkungen.

Ich bin nicht sicher, ob dies relevant ist oder nicht, aber unabhängig davon, ob php-opcache installiert ist oder nicht, werden mir im Fehlerprotokoll die folgenden Fehler gemeldet (allerdings in einer viel geringeren Häufigkeit, <0,5 % des gesamten Datenverkehrs, was ein separates Problem sein kann):

[Thu Jun 18 08:32:37.223430 2015] [proxy_fcgi:error] [pid 19187:tid 140598765840128] [client 37.46.115.238:55624] AH01068: Got bogus version 10, referer: ...
[Thu Jun 18 08:32:37.223462 2015] [proxy_fcgi:error] [pid 19187:tid 140598765840128] (22)Invalid argument: [client 37.46.115.238:55624] AH01075: Error dispatching request to :, referer: ...

Dieses Problem ist sehr ähnlichDieses hier, obwohl diese Person ProxyPassMatch mit der TCP-Methode verwendet, was ich nicht tue (weil es .htaccess umgeht).

Hat jemand Ideen, die ich noch nicht erwähnt habe?

Antwort1

Wenn ich in unseren Umgebungen ähnliche Probleme gesehen habe, lag das anscheinend an der Art und Weise, wie OpCache (standardmäßig) einen einzigen Cache für alle Benutzer in einer gemeinsam genutzten Hosting-Umgebung freigibt.Fehler wurde gemeldet(und Sie können und sollten abstimmen, um den Betreuern mitzuteilen, wie wichtig dies für Ihren Anwendungsfall sein könnte), obwohl keine Verpflichtung zur Bereitstellung einer Lösung eingegangen wurde.

TL;DR: Wenn OpCache aktiviert ist, wird der Cache, der zum Speichern des kompilierten Bytecodes verwendet wird, standardmäßig von allen Benutzern gemeinsam genutzt. In einer Umgebung, in der das Hosting von mehreren Websites/Benutzern gemeinsam genutzt wird,Dies kann dazu führen, dass eine Site die zwischengespeicherte Ausgabe von PHP-Skripten von einer anderen Site abruft oder, wenn bestimmte Sicherheitseinstellungen aktiviert sind, sogar Fehler generiert.

Wenn Sie PHP-FPM mit dem integrierten Opcache von PHP 5.5+ verwenden möchten, lesen Sie bitte den folgenden Blog-Beitrag, bevor Sie dies tatsächlich tun. Es stellt sich heraus, dass der Opcode-Cache von jedem Benutzer auf dem Server gelesen werden kann. Dies bedeutet, dass, wenn es beispielsweise 10 separate Benutzer mit ihren eigenen virtuellen Hosts und Verzeichnissen gibt und Sie einen PHP-FPM-Pool pro Benutzer konfigurieren, jeder Benutzer weiterhin sehen kann, welche Skripts zwischengespeichert sind und wo sie sich befinden. Da sie Lesezugriff auf den Cache haben, könnten sie möglicherweise alle diese Daten anzeigen.

Dies stellt offensichtlich ein massives Sicherheitsrisiko dar und selbst wenn dies niemand ausnutzt, besteht immer noch die Möglichkeit, dass Skripte beim Generieren einer Seite vom falschen Benutzer gelesen werden. Daher könnten Websites möglicherweise die falschen Daten/Informationen anzeigen, wenn sich mehrere index.php-Skripte im Cache befinden.

Obwohl kein Fix offiziell veröffentlicht wurde, wenn Sie cPanel verwenden,In diesem Wiki ist eine Methode dokumentiert, mit der die Erstellung und Sicherung von PHP-FPM-Pools für jeden einzelnen Benutzer konfiguriert werden kann.und wenn Sie die nachstehenden Anweisungen sowie dieWICHTIGE NOTIZENam Ende dieser Antwort sollten Sie in der Lage sein, die gewünschte Funktionalität ohne Fehler zu erhalten

In diesem Beitrag wird auch beschrieben, wie Sie dies manuell für jede Site/jeden Benutzer konfigurieren können (obwohl ich wetten würde, dass dies mühsam werden könnte, wenn Sie viele Sites hosten). Wenn Sie cPanel nicht verwenden, müssen Sie möglicherweise die Skripte ändern, um Ihre individuellen Pfade und Benutzernamen anzugeben, anstatt die Variablen, die von der Konfigurations-Engine von cPanel verwendet werden.


WICHTIGE NOTIZEN

Beim Testen und weiteren Nachforschungen stieß ich aufdieser Artikel, der einige Klarstellungen liefertdie für Ihre spezielle Situation relevant sein könnten:

  1. Sie müssen sicherstellen, dass der opcache.use_cwdParameter truefür die OpCache-Konfiguration Ihrer Anwendung auf eingestellt ist. falseStandardmäßig ist er auf eingestellt. Wenn Sie ihn auf der Standardeinstellung belassen, kommt es wahrscheinlich zu Kollisionen, wenn Sie mehr als eine PHP-Anwendung auf Ihrem System hosten:

Zunächst müssen Sie wahrscheinlich in jedem typischen Projekt sicherstellen, dass die Option opcache.use_cwd auf „true“ gesetzt ist. Wenn diese Einstellung aktiviert ist, überprüft die OpCache-Engine die vollständigen Dateipfade, um zwischen Dateien mit demselben Namen zu unterscheiden. Wenn Sie die Option auf „false“ setzen, kommt es zu Kollisionen zwischen Dateien mit demselben Basisnamen.

  1. Wenn Sie eine Anwendung ausführen, die auf Zend Framework oder einem anderen ähnlichen Framework basiert, das Annotationen verwendet, müssen Sie AUCH sicherstellen, dass die Anweisungen opcache.load_commentsund opcache.save_commentsauf gesetzt sind true. Sie sollten diesen Vorschlag anhand der Dokumentation Ihrer Anwendung/Ihres Frameworks noch einmal überprüfen, da die meisten ihre Dokumentationen inzwischen mit spezifischen Anweisungen aktualisiert haben, wie die Verwendung von OpCache für ihre Systeme richtig aktiviert wird:

Es gibt auch eine Einstellung, die in Tools und Frameworks wichtig ist, die Annotationen verwenden. Wenn Sie Doctrine, Zend Framework 2 oder PHP Unit verwenden, denken Sie daran, die Einstellungen opcache.load_comments und opcache.save_comments auf true zu setzen. Dadurch werden die Dokumentationskommentare aus Ihren Dateien auch in den von OpCache generierten vorkompilierten Code aufgenommen. Mit dieser Einstellung können Sie ohne Unterbrechungen mit Annotationen arbeiten.

Wenn Ihr Projekt auf einem bestimmten Framework oder einer Webanwendung basiert, ist es immer eine gute Idee, die Dokumentation auf Richtlinien zur OpCache-Konfiguration zu überprüfen.

WICHTIGE NOTIZEN


Hoffentlich hat dies geholfen – und wenn Sie cPanel verwenden, hinterlassen Sie einen Kommentar, um uns mitzuteilen, wie Sie diesen Teil der Konfiguration bewältigt haben! Siehe auch diese Frage und die zugehörigen Kommentare.

verwandte Informationen