Es gibt bereits 2 gute Antworten, aber das vielleicht wichtigste Problem im wirklichen Leben ist noch nicht erwähnt.
Zunächst möchte das OP vielleicht die beiden vorhergehenden Antworten und diesen kleinen Blog-Beitrag lesen, um zu verstehen, was Keepalives sind. (Der Autor geht nicht näher auf die Frage ein, ob TCPI / IP "schneller" wird, je länger die Verbindung geöffnet ist. Langlebige Verbindungen profitieren zwar von der Skalierung des IP-Fensters , der Effekt ist jedoch nur dann signifikant, wenn die Dateien geöffnet sind groß, oder das Bandbreitenverzögerungsprodukt ist ungewöhnlich groß.)
Das große Argument gegen HTTP Keepalive bei der Verwendung von Apache ist, dass es Apache-Prozesse blockiert. Das heißt, ein Client, der keepalives verwendet, verhindert, dass sein Apache-Prozess andere Clients bedient, bis der Client die Verbindung schließt oder das Timeout erreicht ist. Im gleichen Zeitraum hätte diese Apache-Instanz viele andere Verbindungen bedienen können.
Eine sehr verbreitete Apache-Konfiguration ist der Prefork MPM und ein PHP / Perl / Python-Interpreter sowie der Anwendungscode in der genannten Sprache. In diesem Fall ist jeder Apache-Prozess "schwer" in dem Sinne, dass er mehrere Megabyte RAM belegt (Apache, verbunden mit Interpreter und Anwendungscode). Dies ist zusammen mit dem Blockieren jeder Apache-Instanz mit Keepalive ineffizient.
Eine übliche Problemumgehung besteht darin, zwei Apache-Server (beide auf demselben physischen Server oder auf zwei Servern, je nach Bedarf) mit unterschiedlichen Konfigurationen zu verwenden:
ein "heavy" mit mod_php (oder welcher Programmiersprache auch immer) für dynamische Inhalte mit deaktivierten Keepalives .
Ein "leichtes" Modul mit einer minimalen Anzahl von Modulen für die Bereitstellung statischer Inhalte (Image, CSS, JS usw.) mit eingeschalteten Keepalives .
Sie können diese Trennung von dynamischen und statischen Inhalten dann bei Bedarf erweitern , beispielsweise durch:
Verwenden eines ereignisgesteuerten Servers für statische Inhalte, z. B. nginx .
Verwenden eines CDN für statische Inhalte (kann alle statischen Inhalte für Sie bereitstellen)
Zwischenspeichern von statischen und / oder dynamischen Inhalten
Ein weiterer Ansatz zur Vermeidung des Blockierens von Apache besteht in der Verwendung eines Lastenausgleichs mit einer intelligenteren Verbindungsbehandlung, z. B. Perlbal .
Sind diese Antworten auch 8 Jahre später noch relevant?
TheStoryCoder
Ja, immer noch relevant, wenn Sie das Prefork-MPM verwenden. Beachten Sie, dass Apache httpd 2.4 (z. B. in RHEL7) standardmäßig KeepAlive On verwendet (es wird jedoch nicht explizit in seiner Konfiguration aufgeführt - zumindest in RHEL7).
Cameron Kerr
5
Keepalives können in einigen Fällen gut sein, in anderen sehr schlecht. Sie reduzieren die Zeit und den Aufwand für das Einrichten einer neuen Verbindung, binden jedoch Serverressourcen für die Dauer des Keepalive-Timeouts. Beispiele:
Seiten mit vielen kleinen Objekten, Clients bei Einwahl - Keepalive sollte eingeschaltet sein.
Seiten mit ein paar großen Objekten - Keepalive ist kein Vorteil.
Server mit sehr vielen eindeutigen Besuchern - Keepalive sollte deaktiviert sein (andernfalls werden Sockets und Threads im Speicher gespeichert und warten auf das Keepalive-Timeout. Es werden keine neuen Clients bedient).
Wie Sie sehen, spielt KeepAliveTimeout auch eine wichtige Rolle bei der Optimierung der Serverleistung.
Schauen Sie sich Ihr Nutzungsmuster an und entscheiden Sie selbst.
Auf diese Weise wird eine einzelne TCP-Verbindung vom Browser zum Senden mehrerer Abfragen wiederverwendet. Normalerweise besteht eine Website aus vielen Komponenten (HTML-Seite, Javascript-Code, Bilder). Solange sich diese Ressourcen in derselben Domäne befinden und daher von demselben Server bedient werden können, erhöht eine KeepAlive-Verbindung die Leistung erheblich, da der Browser keine neue TCP-Verbindung herstellen muss.
Ein Browser öffnet normalerweise drei parallele Verbindungen zu einer Domain. Angenommen, Ihre Site enthält 18 Objekte. Der Browser öffnet 3 Verbindungen und lädt in jeder Verbindung 6 Objekte herunter - im KeepAlive-Modus. Ohne KeepAlive müsste es 18 TCP-Verbindungen öffnen, was sehr langsam ist.
Die meisten oder alle modernen Browser sind HTTP / 1.1-kompatibel, dies sollte also funktionieren.
Bestimmte HTTP-Proxys wie Squid sind nicht HTTP / 1.1-kompatibel, erfordern jedoch die Verwendung einer KeepAlive-Verbindung.
Dies ist nur von der Client-Seite aus zu berücksichtigen, während die Ressourcennutzung auf der Server-Seite ebenfalls wichtig ist.
Morgan Cheng
Serverseitige Ressourcennutzung ist wichtiger als vom Benutzer wahrgenommene Wartezeit?
Yves Junqueira
1
Ich glaube auch daran, KeepAlive einzuschalten, aber Apaches Standard-Timeout von 15 Sekunden ist viel zu großzügig, da es Prozesse zu lange blockiert. Normalerweise stelle ich das Zeitlimit auf ungefähr 2 Sekunden ein, was dazu führt, dass KeepAlive für ungefähr einen Seitenladevorgang verwendet wird.
Keepalives können in einigen Fällen gut sein, in anderen sehr schlecht. Sie reduzieren die Zeit und den Aufwand für das Einrichten einer neuen Verbindung, binden jedoch Serverressourcen für die Dauer des Keepalive-Timeouts. Beispiele:
Wie Sie sehen, spielt KeepAliveTimeout auch eine wichtige Rolle bei der Optimierung der Serverleistung.
Schauen Sie sich Ihr Nutzungsmuster an und entscheiden Sie selbst.
quelle
Sie sollten auf jeden Fall KeepAlive On verwenden.
Sehen:
http://httpd.apache.org/docs/2.0/mod/core.html#keepalive
Auf diese Weise wird eine einzelne TCP-Verbindung vom Browser zum Senden mehrerer Abfragen wiederverwendet. Normalerweise besteht eine Website aus vielen Komponenten (HTML-Seite, Javascript-Code, Bilder). Solange sich diese Ressourcen in derselben Domäne befinden und daher von demselben Server bedient werden können, erhöht eine KeepAlive-Verbindung die Leistung erheblich, da der Browser keine neue TCP-Verbindung herstellen muss.
Ein Browser öffnet normalerweise drei parallele Verbindungen zu einer Domain. Angenommen, Ihre Site enthält 18 Objekte. Der Browser öffnet 3 Verbindungen und lädt in jeder Verbindung 6 Objekte herunter - im KeepAlive-Modus. Ohne KeepAlive müsste es 18 TCP-Verbindungen öffnen, was sehr langsam ist.
Die meisten oder alle modernen Browser sind HTTP / 1.1-kompatibel, dies sollte also funktionieren.
Bestimmte HTTP-Proxys wie Squid sind nicht HTTP / 1.1-kompatibel, erfordern jedoch die Verwendung einer KeepAlive-Verbindung.
quelle