Wat is een omgekeerde proxy??
Een proxyserver is degene die namens jou met internet praat. Als het netwerk van uw hogeschool bijvoorbeeld https://www . heeft geblokkeerd.facebook.com/ maar het domein https://exampleproxy.com nog steeds toegankelijk is, dan kun je de laatste bezoeken en het zal al je verzoeken voor Facebook-servers doorsturen naar Facebook en de reacties van Facebook terugsturen naar je browser.
Om samen te vatten, een proxy verzendt verzoeken namens een of meer clients naar alle servers op internet. Een reverse proxy gedraagt zich op een vergelijkbare manier.
EEN omgekeerde proxy ontvangt verzoek van alle klanten namens een of meer servers. Dus als je een paar servers hebt die ww1 hosten.voorbeeld.com en ww2.voorbeeld.com een reverse proxy-server kan verzoeken accepteren namens de twee servers, deze verzoeken doorsturen naar hun respectieve eindpunten waar het antwoord wordt gegenereerd en teruggestuurd naar de reverse proxy om terug te worden doorgestuurd naar de clients.
De opzet
Voordat we Nginx-configuratiebestanden gaan aanpassen en een reverse proxy-server maken. Ik wil in steen zetten hoe mijn opstelling eruit ziet, dus als je je ontwerp probeert te implementeren, zou het minder verwarrend zijn.
Ik heb het platform van DigitalOcean gebruikt om drie VPS te laten draaien. Ze bevinden zich allemaal op hetzelfde netwerk, elk met een eigen privé-IP, en slechts één VPS heeft een statisch openbaar IP-adres (dit wordt onze reverse proxy-server.)
VM/hostnaam | Privé IP | Openbare IP | Rol |
Omgekeerde proxy | 10.135.123.187 | 159.89.108.14 | Omgekeerde proxy, met Nginx |
Knooppunt-1 | 10.135.123.183 | Nvt | Eerste website draaien |
Knooppunt-2 | 10.135.123.186 | Nvt | Tweede website draaien |
De twee verschillende websites die actief zijn, hebben domeinnamen ww1.ranvirslog.com en ww2.ranvirslog.com en hun beide A-records verwijzen naar het openbare IP-adres van de reverseproxy, i.e, 159.89.108.14
Het idee achter privé-IP is dat de drie VM's met elkaar kunnen praten via dit privé-IP, maar een externe gebruiker heeft alleen toegang tot de reverse proxy-VM op zijn openbare IP. Dit is belangrijk om in gedachten te houden. U kunt bijvoorbeeld niet ssh-en naar een van de VM's met behulp van zijn privé-IP.
Bovendien hebben zowel Node-1 als Node-2 een Apache-webserver die twee verschillende webpagina's bedient. Dit zal ons helpen om de een van de ander te onderscheiden.
De eerste website zegt "WEBSITE 1 WERKT"!!!”
Evenzo laat de tweede website dit zien:
Uw websites kunnen verschillen, maar als u deze setup als uitgangspunt wilt repliceren, voer dan apt install apache2 uit op Node-1 en Node-2. Bewerk vervolgens het bestand /var/www/html/index.html zodat de webserver zegt wat u maar wilt.
De reverseproxy-VM is nog steeds onaangeroerd. Alle VM's draaien Ubuntu 18.04 LTS, maar je bent vrij om elk ander besturingssysteem te gebruiken dat je wilt. Je kunt dit zelfs emuleren met Docker-containers. Door een door de gebruiker gedefinieerd Docker-brugnetwerk te maken en daarop containers te spawnen, kunt u elke container een privé-IP toewijzen en alle HTTP / HTTPS-proxy doorsturen naar één container, wat onze Nginx reverse proxy-container zou zijn.
Tot nu toe zo goed.
Nginx standaardconfiguratie
Laten we beginnen met het installeren van Nginx op de reverseproxy-server, ik gebruik Ubuntu, dus apt is mijn pakketbeheerder:
$ sudo apt install nginxStandaardconfiguratie verwijderen als u een op Debian gebaseerde distributie gebruikt
Voordat we verder gaan een kleine opmerking over de configuratie van Nginx. Alle verschillende configuratiebestanden worden opgeslagen in /etc/nginx inclusief de nginx.conf-bestand dat het hoofdconfiguratiebestand is. Als we naar de inhoud van dit bestand kijken (in het http-blok), ziet u de volgende twee regels:
…inclusief /etc/nginx/conf.d/*.conf;
inclusief /etc/nginx/sites-enabled/*;
…
De tweede regel bevat alle bestanden in de sites-enabled directory naar de Nginx-configuratie. Dit is de standaardpraktijk voor de meeste op Debian gebaseerde distributies. De standaard "Welkom bij Nginx"-webpagina heeft bijvoorbeeld een bijbehorend bestand met de naam default op de locatie /etc/nginx/sites-available/default met een symbolische link naar /etc/nginx/sites-enabled/, maar we hebben dit niet nodig standaard webpagina zodat we de symbolische link veilig kunnen verwijderen. Het origineel is nog steeds beschikbaar in de directory 'sites-available'.
$ rm /etc/nginx/sites ingeschakeld/standaardMaar wanneer we een omgekeerde proxyconfiguratie maken, doen we dit in conf.d directory (waarbij onze bestandsnaam a . heeft .conf extensie) dit is universeel, en werkt in alle distributies, niet alleen Debian of Ubuntu.
Standaardconfiguratie voor andere distributies verwijderen
Als u geen op Debian gebaseerde distro gebruikt, vindt u de standaard Welkomstpagina configuratie op /etc/nginx/conf.d/standaard.conf verplaats het bestand gewoon naar een veilige plaats als je het in de toekomst wilt gebruiken (aangezien dit geen symbolische link is)
$ mv /etc/nginx/conf.d/standaard.conf ~/default.confHet is soms te vinden in /etc/nginx/default.d omdat mensen het gewoon niet eens kunnen worden over een enkele eenvoudige standaard! Je zou dus wat moeten graven in de /etc/nginx directory om dit te achterhalen.
Reverse proxy-blokken toevoegen
Zoals eerder vermeld, zijn de twee verschillende domeinnamen die ik achter deze proxy host:
- ranvirslog.com (WEBSITE 1) met IP 10.135.123.183
- ranvirslog.com (WEBSITE 2) met IP 10.135.123.186
Laten we dus één bestand per website maken in /etc/nginx/conf.d/ map. Zo zijn we goed georganiseerd.
$ raak /etc/nginx/conf . aan.d/ww1.conf$ raak /etc/nginx/conf . aan.d/ww2.conf
U kunt de bestanden een naam geven die u maar wilt, zolang het maar een heeft .conf aan het einde van de naam.
In het eerste bestand ww1.conf voeg de volgende regels toe:
serverluister 80;
luister [::]:80;
servernaam ww1.ranvirslog.com;
plaats /
proxy_pass http://10.135.123.183/;
proxy_buffering uit;
proxy_set_header X-Real-IP $remote_addr;
De luisterinstructies vertellen Nginx om te luisteren op poort 80 voor zowel IPv4- als IPv6-gevallen. Vervolgens wordt gecontroleerd of de servernaam ww1 is.ranvirslog.com, dan wordt het locatieblok geactiveerd en wordt het verzoek doorgestuurd naar http://10.135.123.183/ met buffering uitgeschakeld. Bovendien zorgt de proxy_set_header... regel ervoor dat het oorspronkelijke IP-adres van de client wordt doorgestuurd naar de proxyserver. Dit is handig als u het aantal unieke bezoekers wilt berekenen, enz. Anders zou de proxyserver maar één bezoeker hebben - de Nginx-server.
De buffering-optie en set_header-opties zijn volledig optioneel en zijn alleen toegevoegd om de proxy zo transparant mogelijk te maken. voor de ww2.ranvirslog.com website, heb ik de volgende configuratie toegevoegd op /etc/nginx/conf.d/ww2.conf:
serverluister 80;
luister [::]:80;
servernaam ww2.ranvirslog.com;
plaats /
proxy_pass http://10.135.123.186/;
proxy_buffering uit;
proxy_set_header X-Real-IP $remote_addr;
Sla beide bestanden op en test of de algehele configuratie geldig is of niet:
$ sudo nginx -tAls er fouten zijn, zal de uitvoer van de bovenstaande opdracht u helpen deze te vinden en op te lossen. Start nu de server opnieuw op:
$ service nginx opnieuw opstartenEn je kunt testen of het werkte of niet door de verschillende domeinnamen in je browser te bezoeken en het resultaat te zien.
Conclusie
De use case van elk individu is anders. De hierboven genoemde configuratie heeft mogelijk wat aanpassingen nodig om voor uw scenario te werken. Misschien draait u meerdere servers op dezelfde host, maar op verschillende poorten, in dat geval heeft de proxy_pass... regel http://localhost:portNumber/ als waarde.
Deze details zijn sterk afhankelijk van uw gebruikssituatie. Zie de officiële Nginx-documenten voor meer informatie over andere opties en tuneables.