Maintenir la connexion SSL active entre le proxy inverse et le serveur backend

Aug 19 2020

J'ai un serveur back-end (Apache) qui est trop éloigné de la plupart de nos utilisateurs, donc notre idée est d'implémenter un proxy inverse plus proche qui fera office de cache.

À première vue, cela fonctionnait comme un charme. Les fichiers statiques mis en cache sont servis extrêmement rapidement, mais pour toute autre chose, le proxy inverse (NGINX) doit se connecter au serveur principal, ce qui prend un certain temps pour la négociation SSL, ce qui ralentit ces premières requêtes.

Je cherchais des informations à ce sujet mais je n'ai pas trouvé de moyen de maintenir cette connexion. Y a-t-il un moyen de le faire?

J'ai même essayé d'en savoir plus sur les websockets, mais toutes les implémentations que j'ai pu trouver étaient pour répondre à une demande spécifique, et non pour garder la connexion intermédiaire entre les deux serveurs Web (NGINX au proxy inverse et Apache au back-end).

L'un de vous a-t-il une idée ou un conseil sur ce qu'il faut étudier / utiliser / rechercher pour y parvenir?

Merci d'avance!

Réponses

MichaelHampton Aug 19 2020 at 07:54

Dans nginx, vous ne pouvez spécifier keepalivepour une connexion en amont que si la connexion est définie dans un upstreambloc. Par exemple:

upstream backend {
    server private-api.example.com:443;

    keepalive 32;
}

Ici, keepalivespécifie le nombre maximum de connexions ouvertes simultanées au (x) serveur (s) en amont par processus de travail .

Pour utiliser l'amont, vous spécifiez son nom dans votre proxy_passadresse au lieu de celle du backend.

Par exemple, si vous avez déjà utilisé:

     proxy_pass https://private-api.example.com:443;

Vous le changeriez en:

     proxy_pass https://backend;

Remplacez littéralement le nom de l'amont par le défini server.

Vous devez également définir la version HTTP sur 1.1 (car la valeur par défaut est plutôt absurde à 1.0) et effacer l'en-tête Connection:

    proxy_http_version 1.1;
    proxy_set_header Connection "";

Gardez à l'esprit qu'il existe également un keepalive_timeoutparamètre que vous pouvez définir dans upstreamlequel vous devrez peut-être régler. Par défaut, il est de 60 secondes, donc si une connexion est inactive pendant ce temps, elle sera fermée, même s'il y a moins de keepaliveconnexions ouvertes. Le serveur principal aura son propre délai d'expiration de keepalive que vous devrez également régler séparément.