
Ich habe ein Setup auf Docker, wobei Nginx der Reverse-Proxy für Tomcat-Dienste ist. Bei hoher Auslastung (Test) treten Spitzen in der Antwortzeit auf.
Es stellt sich heraus, dass eine Instanz des Tomcat-Dienstes ohne Nginx besser funktioniert als mehrere Dienste mit Nginx davor, das Problem liegt also zwischen Nginx und Tomcats. Bei weiterer Untersuchung habe ich festgestellt, dass die Upstream-Verbindungszeit von Nginx bis zu 3 Sekunden, manchmal sogar 7 Sekunden beträgt.
Ich habe versucht, mit keepalive, keepalive_connections, proxy_connect_timeout, worker_processes und worker_connections auf Nginx herumzuspielen, aber nichts hilft. Als nächstes auf meiner Liste steht der Versuch höherer Werte für Tomcat max_connections.
Was könnte der Grund für die hohe Upstream_Connect_Time sein?
Antwort1
Ich habe dieses Problem gelöst, indem ich hinzugefügt habe
proxy_http_version 1.1;
proxy_set_header Connection "";
Ohne diese ist Keepalive bedeutungslos, daher hatte meine Änderung des Keepalive-Parameters keine Auswirkungen.
Wenn ich das richtig verstehe, ermöglicht http 1.1 die Verwendung derselben Verbindung für gleichzeitige Antworten und Anforderungen, und das Hinzufügen von „Connection" im Header dient dazu, die Verbindung offen zu halten.
Um es für Laien auszudrücken: Ich habe Nginx zuvor gesagt, dass die Verwendung von Keepalives im Upstream zulässig ist, habe es jedoch nicht so konfiguriert, dass es weiß, wie die Verbindung offen gehalten wird (da kommt der HTTP 1.1- und Header-Verbindungsteil), sodass keine Keepalives verwendet wurden.
Mit den richtig eingestellten beiden Parametern reichte Keepalive 500 am Ende für eine „normale“ Leistung aus, Keepalive 1000 wurde jedoch beibehalten, um Situationen mit hohem Datenverkehr Rechnung zu tragen.