Apache-Handshake bei Prefork-Konfiguration langsam, Konfigurationsoptimierung erforderlich

Apache-Handshake bei Prefork-Konfiguration langsam, Konfigurationsoptimierung erforderlich

Mein Server, auf dem Ubuntu 14/Apache2.4.7 läuft, verfügt über eine htaccess-Umleitung, um alle Anfragen zur Verwendung von HTTPS zu zwingen. Im Allgemeinen reagiert er schnell. Ich habe jedoch kürzlich meine SSL-Konfiguration geändert, um die verwendeten Chiffren auf modernere Einstellungen zu beschränken, um Heartbleed, Beast und andere Exploits zu verhindern und die Verwendung moderner Verschlüsselungsmethoden sicherzustellen.

Ich habe in letzter Zeit einige Beschwerden erhalten – die anscheinend nichts mit diesen Änderungen zu tun haben (siehe unten) –, dass mein Rechner manchmal langsam sein kann. Diese Beschwerden lassen darauf schließen, dass es mit dem Handshake oder dem Herstellen einer Verbindung zusammenhängen könnte:

Bei mir kam es zeitweise zu langsamem Laden der Seiten mit unterschiedlichen Browser-Statusmeldungen, je nach verwendetem Browser. Dies alles hatte zur Folge, dass ich auf die Herstellung einer sicheren Verbindung warten musste.

Ich habe tausendmal ein PHP-Skript geschrieben, das cURL verwendet, um eine Verbindung herzustellen. Ich habe es gestern spät in der Nacht ausgeführt und die Verlangsamung schien kein Problem zu sein. Ich habe versucht, eine Verbindung zu https und auch zu http herzustellen und der obigen Umleitung zu folgen. Alle Anfragen wurden in 3,5 Sekunden oder weniger abgeschlossen, wobei die überwiegende Mehrheit (96-98 %) in weniger als 1,5 Sekunden abgeschlossen wurde.

Ich habe das gleiche Skript heute Morgen um 10:30 Uhr kalifornischer Zeit ausgeführt und etwa 10 % der Anfragen dauerten länger als 1,5 Sekunden, viele sogar deutlich länger. Die längsten Zeiten lagen bei etwa 17 Sekunden.

Meine Recherchen und meine Intuition sagen mir, dass das https-Handshaking zwar komplexer ist als http-Verbindungen, dieses Problem aber wahrscheinlich durch eine Anpassung meiner Apache-Konfiguration behoben werden kann (z. B.MaxRequestWorker) Einstellungen. Der Server überschreitet fast nie eine durchschnittliche Auslastung von etwa 1,5 und es sieht so aus, als ob genügend Speicher verfügbar wäre.

Kann mir jemand einen Vorschlag machen, wie ich den Engpass hier eingrenzen und welche Schritte ich unternehmen könnte, um ihn zu beheben? Ich wäre für jede Hilfe sehr dankbar.

EDIT: Ich habe den #apache IRC-Kanal besucht und dort herumgefragt und die freundlichen Leute haben mich darauf aufmerksam gemacht, dass dieser Server inVorgabelModus und MinSpareServers, MaxSpareServers, StartServers und MaxRequestWorkers sind alle entweder Standard oder angepasst, aber immer noch ziemlich niedrig.

Sie bestanden darauf, dass ein Produktionsserver den Prefork-Modus nicht verwenden sollte, und verwiesen mich auf einige Links:

Meines Wissens nach besteht die Lösung für diese Leistungsprobleme wahrscheinlich darin, Apache im Event-Modus zu installieren, aber meine Website ist komplex und verwendet einige Prozessaufspaltungen und ähnliches. Ich hoffe, dass als Übergangslösung einige Optimierungen vorschlagen können, umminSpareServers,maxSpareServers,StartServers,maxRequestWorker

BEARBEITEN 2: Eine Aufschlüsselung einer typischen langsamen Anfrage, wie sie von der curl_getinfoFunktion in PHP gemeldet wird:

elapsed: 17.6722049713
ssl_verify_result: 0
total_time: 17.671187
namelookup_time: 0.000051
connect_time: 0.065855
pretransfer_time: 16.787012
starttransfer_time: 17.340403
redirect_time: 0.261569

Antwort1

Wie sich herausstellt, scheinen Ubuntus Pakete zur Installation von Apache und PHP7 nichts anderes anzubieten als Prefork, dasist echt beschissen.In diesem Fall musste ich mich mit Prefork begnügen, was überhaupt nicht die ideale Lösung ist, aber bis ich mehr Informationen darüber habe, wie ich eines derEmpfohlene Konfigurationenfunktioniert, es ist meine einzige Option.

Ich habe die Datei /etc/apache2/mods-available/mpm_prefork.conf bearbeitet:

sudo nano /etc/apache2/mods-available/mpm_prefork.conf

Und die MaxRequestWorkers-Einstellung auf 300 erhöht.NOTIZdass ich dazu auch eine ServerLimit-Einstellung von 300 hinzufügen muss, da MaxRequestWorkers sonst auf den Standardwert von ServerLimit beschränkt ist, der 256 beträgt:

StartServers        5
MinSpareServers     5
MaxSpareServers     10
# changed in response to slow connect/handshaking time complaints
ServerLimit     300
# note this value is constrained by ServerLimit, which defaults to 256
MaxRequestWorkers   300
MaxConnectionsPerChild  0

Diese Einstellungen scheinen die Langsamkeit gemildert zu haben. Ich habe mein PHP-Testskript während einer arbeitsreichen Tageszeit verwendet und alle Anfragen wurden in 3,5 Sekunden oder weniger abgeschlossen, die überwiegende Mehrheit in weniger als 1,5 Sekunden. Ich habe auch mit Apache Bench und einem hohen Parallelitätswert getestet und konnte sehen, wie der Server reagierte, indem er Worker erzeugte, aber ich hatte immer noch viel freien RAM:

ab -n 1000 -c 100 "https://example.com/"

Ich habe den RAM mit Folgendem überprüft:

free -h

Dies scheint im Moment zu funktionieren, obwohl es äußerst enttäuschend ist, dass ich Apache mit den Ubuntu-Installationsprogrammen nicht dazu bringen kann, FastCGI zu verwenden.

verwandte Informationen