Android

Configuration d'un proxy inverse Nginx

Mettre en place un serveur Web (21/28) : Nginx

Mettre en place un serveur Web (21/28) : Nginx

Table des matières:

Anonim

Un proxy inverse est un service qui prend une demande client, envoie la demande à un ou plusieurs serveurs proxy, récupère la réponse et fournit la réponse du serveur au client.

En raison de ses performances et de son évolutivité, NGINX est souvent utilisé comme proxy inverse pour les serveurs HTTP et non HTTP. Une configuration de proxy inverse typique consiste à placer Nginx devant les applications Node.js, Python ou Java.

L'utilisation de Nginx comme proxy inverse vous offre plusieurs avantages supplémentaires:

  • Équilibrage de charge - Nginx peut effectuer un équilibrage de charge pour distribuer les demandes des clients sur les serveurs mandataires, ce qui améliore les performances, l'évolutivité et la fiabilité. Mise en cache - Avec Nginx comme proxy inverse, vous pouvez mettre en cache les versions pré-rendues des pages pour accélérer les temps de chargement des pages. Il fonctionne en mettant en cache le contenu reçu des réponses des serveurs mandataires et en l'utilisant pour répondre aux clients sans avoir à contacter le serveur mandaté pour le même contenu à chaque fois. Terminaison SSL - Nginx peut agir comme un point de terminaison SSL pour les connexions avec les clients. Il gérera et déchiffrera les connexions SSL entrantes et chiffrera les réponses du serveur mandaté. Compression - Si le serveur mandaté n'envoie pas de réponses compressées, vous pouvez configurer Nginx pour compresser les réponses avant de les envoyer aux clients. Atténuation des attaques DDoS - Vous pouvez limiter les demandes entrantes et le nombre de connexions par adresse IP unique à une valeur typique pour les utilisateurs réguliers. Nginx vous permet également de bloquer ou de restreindre l'accès en fonction de l'emplacement du client et de la valeur des en-têtes de demande tels que «User-Agent» et «Referer».

Cet article décrit les étapes requises pour configurer Nginx en tant que proxy inverse.

Conditions préalables

Nous supposons que Nginx est installé sur votre serveur Ubuntu, CentOS ou Debian.

Utilisation de Nginx comme proxy inverse

Pour configurer Nginx en tant que proxy inverse sur un serveur HTTP, ouvrez le fichier de configuration de bloc de serveur du domaine et spécifiez un emplacement et un serveur proxy à l'intérieur de celui-ci:

server { listen 80; server_name www.example.com example.com; location /app { proxy_pass http://127.0.0.1:8080; } }

L'URL du serveur proxy_pass est définie à l'aide de la directive proxy_pass et peut utiliser HTTP ou HTTPS comme protocole, nom de domaine ou adresse IP, et un port facultatif et URI comme adresse.

La configuration ci-dessus indique à Nginx de transmettre toutes les demandes à l'emplacement /app au serveur mandaté à http://127.0.0.1:8080 .

Sur les distributions basées sur Ubuntu et Debian, les fichiers de blocage du serveur sont stockés dans le répertoire /etc/nginx/sites-available , tandis que sur CentOS dans le répertoire /etc/nginx/conf.d .

Pour mieux illustrer le fonctionnement des directives location et proxy_pass , prenons l'exemple suivant:

server { listen 80; server_name www.example.com example.com; location /blog { proxy_pass http://node1.com:8000/wordpress/; } }

Si un visiteur accède à http://example.com/blog/my-post , Nginx procurera cette demande à http://node1.com:8000/wordpress/my-post .

Lorsque l'adresse du serveur mandaté contient un URI ( /wordpress/ ), l'URI de demande transmis au serveur mandaté est remplacé par un URI spécifié dans la directive. Si l'adresse du serveur proxy est spécifiée sans URI, l'URI de demande complète est transmis au serveur proxy.

Passer les en-têtes de demande

Lorsque Nginx envoie une requête par proxy, il définit automatiquement deux champs d'en-tête dans une requête par proxy du client, Host et Connection , et supprime les en-têtes vides. Host est défini sur la variable $proxy_host et la Connection est définie sur close.

Pour ajuster ou définir des en-têtes pour les connexions proxy, utilisez la directive proxy_set_header , suivie de la valeur d'en-tête. Vous pouvez trouver une liste de tous les en-têtes de demande disponibles et leurs valeurs autorisées ici. Si vous souhaitez empêcher la transmission d'un en-tête au serveur mandaté, définissez-le sur une chaîne vide "" .

Dans l'exemple suivant, nous modifions la valeur du champ d'en-tête Host en $host et supprimons le champ d'en Accept-Encoding tête Accept-Encoding en définissant sa valeur sur une chaîne vide.

location / { proxy_set_header Host $host; proxy_set_header Accept-Encoding ""; proxy_pass http://localhost:3000; }

Chaque fois que vous modifiez le fichier de configuration, vous devez redémarrer le service Nginx pour que les modifications prennent effet.

Configuration de Nginx en tant que proxy inverse sur un serveur proxy non HTTP

Pour configurer Nginx en tant que proxy inverse sur un serveur proxy non HTTP, vous pouvez utiliser les directives suivantes:

  • fastcgi_pass - proxy inverse vers un serveur FastCGI. uwsgi_pass - proxy inverse vers un serveur uwsgi. scgi_pass - proxy inverse vers un serveur SCGI. memcached_pass - proxy inverse vers un serveur Memcached.

L'un des exemples les plus courants est d'utiliser Nginx comme proxy inverse de PHP-FPM:

server { #… other directives location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.2-fpm.sock; } }

Options de proxy inverse Nginx courantes

La diffusion de contenu via HTTPS est devenue une norme de nos jours. Dans cette section, nous vous donnerons un exemple de configuration de proxy inverse HTTPS Nginx, y compris les paramètres et en-têtes de proxy Nginx recommandés.

location/ { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_cache_bypass $http_upgrade; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; }

  • proxy_http_version 1.1 - Définit la version du protocole HTTP pour le proxy, par défaut, il est défini sur 1.0. Pour les connexions Web et les connexions keepalive , vous devez utiliser la version 1.1. proxy_cache_bypass $http_upgrade - Définit les conditions dans lesquelles la réponse ne sera pas prise dans un cache. Upgrade $http_upgrade et Connection "upgrade" - Ces champs d'en-tête sont obligatoires si votre application utilise Websockets. Host $host - La variable $host dans l'ordre de priorité suivant contient: nom d'hôte de la ligne de demande, ou nom d'hôte du champ d'en-tête de demande d' Host , ou le nom du serveur correspondant à une demande. X-Real-IP $remote_addr - X-Real-IP $remote_addr l'adresse IP distante du visiteur réel au serveur mandaté. X-Forwarded-For $proxy_add_x_forwarded_for - Une liste contenant les adresses IP de chaque serveur via lequel le client a été mandaté. X-Forwarded-Proto $scheme - Lorsqu'il est utilisé dans un bloc de serveur HTTPS, chaque réponse HTTP du serveur mandaté est réécrite en X-Forwarded-Host $host - Définit l'hôte d'origine demandé par le client. X-Forwarded-Port $server_port - Définit le port d'origine demandé par le client.

Conclusion

Vous avez appris à utiliser Nginx comme proxy inverse. Nous vous avons également montré comment transmettre des paramètres supplémentaires au serveur et modifier et définir différents champs d'en-tête dans les requêtes mandatées.

nginx