Heim > Fragen und Antworten > Hauptteil
Liebe Meister, mein Nginx wird Tomcat über Proxy_Pass anpassen, aber Tomcat wird zeitweise zucken (fullgc), was zu einer Zeitüberschreitung von etwa 7-8 Sekunden führt
Ich habe mir eine Möglichkeit überlegt, bei der ersten Anfrage eine Zeitüberschreitung festzulegen, z. B. 1 Sekunde. Wenn die Zeit abgelaufen ist, fordern Sie sie einfach erneut an (eine Maschine wechseln)
Dann habe ich die folgende Nginx-Konfiguration (im Folgenden wird der Ruhezustand von Flask verwendet, um Tomcats FullGC zu simulieren)
upstream up {
server 127.0.0.1:8088;
server 127.0.0.1:8089;
}
server {
listen 8087;
server_name localhost;
access_log logs/host.access.log main;
location / {
proxy_connect_timeout 1s;
proxy_send_timeout 1s;
proxy_read_timeout 1s;
proxy_next_upstream_timeout 1s;
proxy_next_upstream_tries 1;
send_timeout 1s;
# proxy_next_upstream timeout error;
proxy_pass http://up;
}
}
Die Dienste 8088 und 8089 sind von mir geschriebene Scheindienste
8088 wird direkt für 2 Sekunden in den Ruhezustand versetzt, was zu einer Zeitüberschreitung von Nginx führt
8089 gibt direkt ein „Hallo Welt“ zurück, 200
Meine Erwartung ist
Wenn ich die Befehlszeile verwende, um wiederholt 8087 anzufordern, wird immer „Hallo Welt“ zurückgegeben, obwohl einige Anfragen schneller und andere langsamer sind (mehr als 1 Sekunde, da die Anfrage nach einer Timeout-Anfrage erneut angefordert wird)curl
Wenn die Anfrage länger als 1 Sekunde dauert, gibt 8087 direkt einen 504-Fehler zurück
Durch Anzeigen des Nginx-Hintergrundprotokolls:
Es wurden kontinuierlich 3 Timeout-Datensätze gedruckt:
Aber 8088 (der Schlafdienst) hat nur eine Anfrage erhalten (einige kleinere Ausnahmen, in Flaschen geschrieben)
Dann habe ich Wireshark zum Erfassen von Paketen verwendet und es herausgefunden
Kannst du mir helfen?
Stimmt etwas mit meiner Konfiguration nicht??
Wenn es eine andere gute Lösung für das Tomcat-FullGC-Timeout-Problem gibt, wäre ich auch sehr dankbar~
给我你的怀抱2017-05-16 17:25:48
You asked for one try, then nginx tries that once.
try 和 retry 是不同的。你 proxy_next_upstream_tries 2; 试试。另外你似乎也误解了 proxy_next_upstream_timeout 的意思。把它也去掉。