Proxy inversé nginx

Proxy inversé nginx

Qu'est-ce qu'un proxy inversé?

Un serveur proxy est celui qui parle à Internet en votre nom. Par exemple, si le réseau de votre collège a bloqué https: // www.Facebook.com / mais le domaine https: // exampleproxy.com est toujours accessible, alors vous pouvez visiter ce dernier et il transmettra toutes vos demandes de serveurs Facebook sur Facebook, et envoyer par les réponses de Facebook à votre navigateur.

Pour récapituler, un proxy envoie des demandes au nom de l'un des autres clients à tous les serveurs sur Internet. Un proxy inversé se comporte de la même manière.

UN proxy inversé reçoit la demande de tous les clients au nom d'un ou plusieurs les serveurs. Donc, si vous avez quelques serveurs hébergeant la WW1.exemple.com et ww2.exemple.com un serveur proxy inversé peut accepter les demandes au nom des deux serveurs, transférer ces demandes à leurs critères d'évaluation respectifs où la réponse est générée et renvoyée au proxy inverse pour être transmis aux clients.

La mise en place

Avant de commencer à peaufiner les fichiers de configuration de Nginx et de faire un serveur proxy inversé. Je veux mettre dans la pierre à quoi ressemble ma configuration, donc quand vous essayez de vous mettre en œuvre votre conception, ce serait moins déroutant.

J'ai utilisé la plate-forme de DigitalOcean pour faire tourner trois VP. Ils sont tous sur le même réseau chacun avec sa propre propriété intellectuelle privée, et un seul VPS a une IP publique statique (ce sera notre serveur proxy inversé.)

VM / Nom d'hôte IP privé IP publique Rôle
Reverser dix.135.123.187 159.89.108.14 Proxy inversé, exécutant nginx
Nœud-1 dix.135.123.183 N / A Exécution du premier site Web
Nœud-2 dix.135.123.186 N / A Exécution du deuxième site Web

Les deux sites Web différents qui s'exécutent ont des noms de domaine WW1.ranvirslog.com et WW2.ranvirslog.com Et leurs deux dossiers indiquent la propriété publique de Reverseproxy, je.E, 159.89.108.14

L'idée derrière la propriété intellectuelle privée est que les trois machines virtuelles peuvent se parler via cette IP privée, mais un utilisateur distant ne peut accéder qu'à la machine virtuelle proxy inverse à son ip public. C'est important pour garder à l'esprit. Par exemple, vous ne pouvez pas SSH dans aucune des machines virtuelles en utilisant sa propriété intellectuelle privée.

De plus, le Node-1 et le Node-2 ont un serveur Web Apache desservant deux pages Web distinctes. Cela nous aidera à distinguer l'un des autres.

Le premier site Web indique que «le site Web 1 fonctionne!!!"

De même, le deuxième site Web montre ceci:

Vos sites Web peuvent différer, mais si vous souhaitez reproduire cette configuration en tant que point de départ, exécutez APT Installez Apache2 sur Node-1 et Node-2. Puis modifiez le fichier / var / www / html / index.HTML pour que le serveur Web dit ce que vous voulez qu'il dise.

La machine virtuelle ReverseProxy est toujours intacte. Tous les machines virtuelles exécutent Ubuntu 18.04 LTS, mais vous êtes libre d'utiliser tout autre système d'exploitation que vous souhaitez. Vous pouvez même imiter cela à l'aide de conteneurs Docker. En créant un réseau Docker Bridge défini par l'utilisateur et en reprenant des conteneurs, vous pouvez attribuer à chaque conteneur une IP privée et transmettre tout le proxy HTTP / HTTPS à un conteneur, qui serait notre conteneur proxy inversé Nginx.

Jusqu'ici, tout va bien.

Configuration par défaut de Nginx

Commençons par installer nginx sur le serveur ReverseProxy, j'utilise ubuntu donc apt est mon gestionnaire de packages:

$ sudo apt install nginx

Suppression de la configuration par défaut si vous utilisez la distribution basée sur Debian

Avant d'aller plus loin une petite note sur la configuration de Nginx. Tous les différents fichiers de configuration sont stockés dans / etc / nginx, y compris le nginx.Fichier Conf qui est le fichier de configuration principal. Si nous regardons le contenu de ce fichier (dans le bloc HTTP), vous remarquerez les deux lignes suivantes:


inclure / etc / nginx / confre.d/*.conf;
include / etc / nginx / sites compatible / *;

La deuxième ligne comprend tous les fichiers du répertoire compatible des sites à la configuration de Nginx. C'est la pratique standard sur la plupart des distributions basées sur Debian. Par exemple, la page Web par défaut «Bienvenue à Nginx» a un fichier correspondant nommé par défaut sur l'emplacement / etc / nginx / sites-disponible / par défaut avec un SymLink to / etc / nginx / sites-compatible /, mais nous n'en avons pas besoin page Web par défaut afin que nous puissions supprimer en toute sécurité le lien symbolique. L'original est toujours disponible dans le répertoire disponible des sites.

$ rm / etc / nginx / sites compatible / par défaut

Mais quand nous créerons une configuration proxy inverse, nous le ferons dans confr.D Directory (avec notre nom de fichier ayant un .extension confr) C'est universel, et fonctionne dans toutes les distributions non seulement Debian ou Ubuntu.

Suppression de la configuration par défaut pour les autres distros

Si vous n'utilisez pas la distribution basée à Debian, vous trouverez la valeur par défaut Page d'accueil configuration à / etc / nginx / confr.d / par défaut.conf, déplacez simplement le fichier vers un endroit sûr si vous voulez l'utiliser à l'avenir (car ce n'est pas un lien de symbolique)

$ mv / etc / nginx / confr.d / par défaut.conf ~ / par défaut.confli

Il peut parfois être trouvé dans / etc / nginx / par défaut.D parce que les gens ne peuvent tout simplement pas s'entendre sur une seule norme simple! Vous devriez donc faire un peu de creuser dans le répertoire / etc / nginx, pour comprendre cela.

Ajout de blocs proxy inverses

Comme indiqué précédemment, les deux noms de domaine différents que j'hébergent derrière ce proxy sont

  1. ranvirslog.com (site Web 1) avec IP 10.135.123.183
  2. ranvirslog.com (site Web 2) avec IP 10.135.123.186

Créons donc un fichier par site Web dans / etc / nginx / confr.D / dossier. Nous sommes donc bien organisés.

$ touch / etc / nginx / confr.d / ww1.confli
$ touch / etc / nginx / confr.d / ww2.confli

Vous pouvez nommer les fichiers tout ce que vous souhaitez, tant qu'il a un .confue à la fin de son nom.

Dans le premier fichier WW1.Conf Ajouter les lignes suivantes:

serveur
Écoutez 80;
Écoutez [::]: 80;
server_name ww1.ranvirslog.com;
emplacement /
proxy_pass http: // 10.135.123.183 /;
proxy_buffering off;
proxy_set_header x-real-ip $ Remote_addr;

Les instructions d'écoute indiquent à Nginx d'écouter sur le port 80 pour les cas IPv4 et IPv6. Il vérifie alors si le serveur_nom est WW1.ranvirslog.com puis le bloc d'emplacement entre en jeu et procure la demande à http: // 10.135.123.183 / avec tampon éteint. De plus, la ligne proxy_set_header… garantit que l'IP d'origine du client est transmise au serveur proxie. Ceci est utile au cas où vous souhaitez calculer le nombre de visiteurs uniques, etc. Sinon, le serveur proxyé n'aurait qu'un seul visiteur - le serveur Nginx.

L'option de mise en mémoire tampon et les options SET_HEADER sont complètement facultatives et sont simplement ajoutées pour rendre le proxyage aussi transparent que possible. Pour la Seconde Guerre mondiale.ranvirslog.site Web, j'ai ajouté la configuration suivante à / etc / nginx / confr.d / ww2.conf:

serveur
Écoutez 80;
Écoutez [::]: 80;
server_name ww2.ranvirslog.com;
emplacement /
proxy_pass http: // 10.135.123.186 /;
proxy_buffering off;
proxy_set_header x-real-ip $ Remote_addr;

Enregistrez les deux fichiers et testez si la configuration globale est valide ou non:

$ sudo nginx -t

S'il y a des erreurs, la sortie de la commande ci-dessus vous aidera à les trouver et à les réparer. Redémarrez maintenant le serveur:

$ service nginx redémarrer

Et vous pouvez tester si cela a fonctionné ou non en visitant les différents noms de domaine de votre navigateur et en voyant le résultat.

Conclusion

Le cas d'utilisation de chaque individu est différent. La configuration mentionnée ci-dessus peut nécessiter un peu de peaufinage pour fonctionner pour votre scénario. Peut-être que vous exécutez plusieurs serveurs sur le même hôte, mais dans différents ports, dans ce cas, la ligne proxy_pass… aura http: // localhost: portnumber / comme valeur.

Ces détails dépendent beaucoup de votre cas d'utilisation. Pour plus de détails sur les autres options et tuauxables, consultez les documents officiels Nginx.