Chers maîtres, mon nginx ajustera Tomcat via proxy_pass, mais Tomcat convulsera par intermittence (fullgc), provoquant un délai d'attente d'environ 7 à 8 secondes
J'ai pensé à un moyen de définir un délai d'attente lors de la première demande, par exemple 1 s, s'il expire, il suffit de le demander à nouveau (changer de machine)
.Ensuite, j'ai la configuration nginx suivante (ce qui suit utilise le sommeil de flask pour simuler le fullgc de Tomcat)
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;
}
}
Les services du 8088 et du 8089 sont des services simulés écrits par moi
8088 va directement dormir pendant 2 secondes, provoquant l'expiration de nginx
8089 renverra directement un "hello world", 200
Mon attente est
Lorsque j'utilise la ligne de commande pour demander à plusieurs reprises 8087, "hello world" sera toujours renvoyé bien que certaines requêtes soient plus rapides et d'autres plus lentes (plus de 1 s, car la requête est redemandée après une demande de délai d'attente)curl
Lorsque la requête dépasse 1 seconde, 8087 renverra directement une erreur 504
En consultant le journal d'arrière-plan nginx :
3 enregistrements de timeout ont été imprimés en continu :
Mais le 8088 (le service sommeil) n'a reçu qu'une seule demande (quelques exceptions mineures, écrites en flacon)
Ensuite, j'ai utilisé WireShark pour capturer des paquets et j'ai découvert
Pouvez-vous m'aider ?
Y a-t-il un problème avec ma configuration ??
S'il existe une autre bonne solution au problème de délai d'attente de Tomcat Fullgc, je serais également très reconnaissant ~
Vous avez demandé un essai, puis nginx l'essaie une fois.
essayer et réessayer sont différents. Vous essayez proxy_next_upstream_tries 2 ;. De plus, vous semblez avoir mal compris la signification de proxy_next_upstream_timeout. Supprimez-le également.