Configuration de nginx pour réessayer un seul serveur en amont

12

J'utilise nginx en tant que proxy inverse et j'aimerais l'attendre quelques secondes, puis réessayer une demande si le serveur en amont ne répond pas. De cette façon, je peux redémarrer mon serveur en amont et au lieu que les utilisateurs voient 502 passerelles défectueuses, leurs navigateurs restent bloqués pendant quelques secondes (le processus de redémarrage prend 3 ou 4 secondes). J'ai essayé plusieurs choses, j'ai mis ceci dans mon bloc serveur:

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

mais cela ne semblait rien faire. J'ai aussi essayé d'ajouter ceci au bloc amont:

server 127.0.0.1:3001 fail_timeout=10s;

encore une fois, pas ce que je voulais.

Est-ce possible? Qu'est-ce que je rate?

John
la source

Réponses:

1

Les directives que vous avez essayées ont une signification différente de celle que vous souhaitez. Lisez leur documentation.

La upstreamdocumentation de la directive explique en détail le fonctionnement d’un bloc en amont:

Si une erreur se produit lors de la communication avec un serveur, la demande sera transmise au serveur suivant, et ainsi de suite jusqu'à ce que tous les serveurs en fonctionnement soient essayés. Si une réponse réussie ne peut être obtenue d'aucun des serveurs, le client recevra le résultat de la communication avec le dernier serveur.

Tout est dit là-bas.

Cependant, vous pourrez peut-être traiter le code d'erreur renvoyé depuis le backend en l'interceptant proxy_intercept_errorspuis en l'envoyant $request_urià un script spécial le traitant pour le compte du client d'origine.

La ligne de base est la suivante: vous avez besoin d’une logique de code / d’application pour réessayer côté client (ou côté client).

Bernard Rosset
la source
0

Comme indiqué dans une autre réponse, il n’existe aucun moyen intégré permettant à nginx de le faire. Une solution possible consiste à utiliser une configuration d'équilibrage de la charge comprenant votre serveur actuel et un serveur de sauvegarde effectuant les opérations suivantes pour toutes les demandes:

  • interroger votre serveur actuel jusqu'à ce qu'il soit de nouveau en ligne
  • puis répondez avec une redirection 302 ou autre afin que le navigateur essaie à nouveau

Ce serveur est marqué avec l'indicateur 'backup' afin qu'il ne soit essayé que lorsque tous les autres serveurs sont hors ligne ( équilibrage de la charge HTTP> Pondération du serveur ).

utilisateur987356
la source