
Apache is een veelzijdige webserver die een volledige reeks ondersteunende functies biedt, waarvan sommige via extensies. In dit artikel zullen we de mod_proxy-module gebruiken om Apache in een omgekeerde proxyrol te configureren.
Hoewel Apache misschien niet je eerste keuze is als reverse proxy, met modernere alternatieven zoals NGINX die de aandacht trekken, is mod_proxy handig voor servers die al Apache draaien en nu verkeer naar een andere service moeten omleiden. U kunt een virtuele Apache-host instellen om verzoeken voor een bepaald domein door te geven aan een afzonderlijke webserver.
We gebruiken Apache 2.4 met een op Debian gebaseerd systeem voor de doeleinden van deze handleiding. We gaan er ook van uit dat de servers waarnaar u het verkeer wilt proxyen, al toegankelijk zijn voor het netwerk vanaf uw Apache-host. Dit artikel richt zich op het inschakelen van proxying op basis van een unieke virtuele host, maar mod_proxy kan ook globaal worden geconfigureerd, als onderdeel van uw Apache-serverconfiguratie, of op directoryniveau via .htaccess-bestanden.
De proxy-module inschakelen
mod_proxy is inbegrepen bij de standaard Apache-installatie. Gebruik a2enmod om de module en zijn onafhankelijke HTTP-component nu te activeren:
sudo a2enmod proxy sudo a2enmod proxy_http
Dit stelt Apache in om proxy-HTTP-verbindingen met andere hosts te ondersteunen. De module wordt geconfigureerd met behulp van instructies met Proxy-prefix in uw Apache-configuratiebestanden. We zullen deze hierna instellen.
Een virtuele proxy met proxy instellen
Laten we stel een virtuele host in die example.com doorstuurt naar het interne IP-adres 192.168.0.1. U moet een DNS-record toevoegen, bijvoorbeeld.com dat verwijst naar uw Apache-host.
Advertentie
Proxying geeft in dit scenario bezoekers op transparante wijze toegang tot uw interne webserver via een extern adres. Apache treedt op als de poortwachter die het verkeer naar zijn eindbestemming leidt. De gebruiker zal example.com zien, ook al lost Apache de verzoeken op via de afzonderlijke server.
Voeg een nieuw virtueel hostbestand toe in /etc/apache2/sites-available met de volgende inhoud:
<VirtualHost *:80> Servernaam voorbeeld.com ProxyPass/http://192.168.0.1/nocanon ProxyPassReverse/http://192.168.0.1/</VirtualHost>
De ProxyPass- en ProxyPassReverse-richtlijnen specificeren dat verkeer naar example.com moet worden geproxy naar 192.168.0.1. Het optionele nocanon-sleutelwoord instrueert Apache om de onbewerkte URL door te geven aan de externe server. Zonder dit sleutelwoord zal Apache de URL automatisch canonicaliseren, wat incompatibel kan zijn met sommige servers en frameworks. Het gebruik van nocanon garandeert compatibiliteit, maar kan van invloed zijn op uw beveiligingshouding omdat het de ingebouwde bescherming van Apache tegen URL-gebaseerde proxy-aanvallen uitschakelt.
ProxyPassReverse moet worden opgegeven om uw configuratie te onderscheiden van een omgekeerde proxyconfiguratie. Apache gebruikt de verstrekte URL om locatie-, inhoudslocatie- en URI-antwoordheaders te herschrijven die zijn uitgegeven door uw backend. Dit zorgt ervoor dat volgende verzoeken de omgekeerde proxy blijven bereiken, in plaats van te proberen de interne server rechtstreeks te bereiken.
Deze configuratie zal alle verzoeken proxyen. U kunt proxying beperken tot een specifiek pad zoals /media door de instructies voor ProxyPass en ProxyPassReverse aan te passen:
ProxyPass /media http://192.168.0.1/ProxyPassReverse /media http://192.168.0.1/Advertentie
Door meerdere ProxyPass-regels toe te voegen, kunt u verzoeken tussen verschillende doelen routeren met behulp van één virtuele host. Regels komen overeen in de volgorde waarin ze zijn geschreven. Als u meer complex routeringsgedrag nodig hebt, gebruikt u in plaats daarvan de ProxyPassMatch-instructie. Dit is gelijk aan ProxyPass maar vergelijkt inkomende URL's met een reguliere expressie:
ProxyPassMatch ^/client/(.*)/images$ http://192.168.0.1/
Sla uw virtuele hostbestand op en schakel het in met de opdracht a2ensite. Dit neemt de basisnaam van uw bestand, relatief aan de directory sites-available:
sudo a2ensite example-proxy-vhost
Herstart Apache om uw wijzigingen toe te passen:
sudo service apache2 restart
Uw eenvoudige proxy zou nu operationeel moeten zijn. Ga naar voorbeeld.com – je zou de inhoud moeten zien die wordt geserveerd door 192.168.0.1. Het verzoek eindigt bij uw Apache-host die het vervolgens naar uw interne server stuurt.
SSL gebruiken
In het bovenstaande voorbeeld wordt SSL weggelaten. In een productieworkload zou u dit willen instellen door SSLCertificateFile- en SSLCertificateKeyFile-instellingen toe te voegen aan uw virtuele host. Deze specificeren het SSL-certificaat en de sleutel die moeten worden gebruikt bij het valideren van SSL-verbindingen. U kunt ook Let's Encrypt's certbot gebruiken om de installatie te automatiseren.
SSL op deze manier configureren betekent dat de beveiligde verbinding wordt beëindigd bij uw Apache-host. De verbinding tussen Apache en uw proxydoel wordt gemaakt via gewone HTTP.
Als u de proxyverbinding ook wilt beveiligen, moet u de SSLProxy-opties van mod_ssl gebruiken. SSLProxyEngine = Aan werkt als de meest elementaire configuratie, op voorwaarde dat zowel Apache als uw proxy-doelserver toegang hebben tot dezelfde certificaten. Deze optie geeft opdracht om SSL-informatie via de proxyverbinding te voeren.
Proxy-opties
Apache reverse proxy's hebben verschillende optionele instructies die u kunt gebruiken om het doorstuurgedrag aan te passen . Hier zijn enkele veelgebruikte opties:
- ProxyAddHeaders – Apache geeft standaard X-Forwarded-Host-, XForwarded-For- en X-Forwarded-Server-headers door aan uw backend-server. Hiermee kan uw backend identificeren dat een verzoek via Apache is verzonden. Als u deze koptekst op Uit zet, kan Apache deze kopteksten niet toevoegen.
- ProxyErrorOverride– Apache zal de reacties die door uw backend-server worden verzonden niet verstoren, tenzij u hierom wordt gevraagd. Als uw backend een 400-, 404-, 500- of een andere foutcode weergeeft, ontvangt de gebruiker die inhoud zoals hij is. Door ProxyErrorOverride in te stellen verandert dit, waardoor Apache in plaats daarvan de inhoud van foutpagina's kan vervangen door het geconfigureerde ErrorDocument. Dit kan wenselijk zijn in situaties waarin u wilt dat fouten van al uw backends uniform worden afgehandeld, waarbij de configuratie gecentraliseerd is op de proxyhost.
- ProxyPassReverseCookieDomain– Dit werkt op dezelfde manier als de verplichte (voor reverse proxying) ProxyPassReverse-richtlijn. Het zal het domein in Set-Cookie-headers herschrijven om te verwijzen naar de naam van de virtuele host, in plaats van naar de hostnaam van de backend-server waarvan ze afkomstig zijn.
- ProxyPreserveHost ’ 8211; Apache stuurt meestal zijn eigen hostnaam naar uw backend-servers als de waarde van de Host-header. Als u deze instructie instelt, wordt in plaats daarvan de oorspronkelijke Host-header verzonden. Dit kan nodig zijn wanneer uw backend-software zijn eigen op hostnaam gebaseerde routering uitvoert.
- ProxyTimeout– Gebruik deze richtlijn om de tijd aan te passen die Apache wacht terwijl uw backend-server een proxyverzoek verwerkt. Apache zal het verzoek afbreken en een foutcode terugsturen naar de client als de time-out wordt overschreden. Het is standaard ingesteld op de time-outwaarde op serverniveau.
Advertentie
U kunt deze richtlijnen instellen als extra regels in uw virtuele hostbestand. Vergeet niet om de Apache-service elke keer dat u een wijziging toepast opnieuw te starten.
Load Balancing
Apache's reverse proxy-implementatie ondersteunt ook load balancing tussen meerdere verschillende backends. Hierdoor kan een verzoek aan example.com een van de servers in uw balanceringspool raken.
<Proxy balancer://example-balancer> BalancerMember http://192.168.0.1 BalancerMember http://192.168.0.2 ProxySet lbmethod=bytraffic </Proxy> ProxyPass/balancer://example-balancer ProxyPassReverse/balancer://example-balancer
In dit voorbeeld worden aanvragen doorgestuurd naar een van de twee servers in de voorbeeld-balancer-pool. Het algoritme voor taakverdeling wordt gedefinieerd door de instelling lbmethod; de waarde voor bytraffic die hier wordt gebruikt, probeert ervoor te zorgen dat elk van de servers een gelijke hoeveelheid verkeer afhandelt.
De alternatieve methode voor het balanceren van byrequests is een eenvoudigere versie van bytraffic waarbij elke backend een gelijk deel van de inkomende verzoeken krijgt. De bybusyness-balancer houdt bij hoeveel verzoeken elke backend bedient en wijst vervolgens nieuwe toe aan de minst “busy” backend.
Samenvatting
De mod_proxy-module kan Apache veranderen in een reverse proxy-host waarmee je op naam gebaseerde routering kunt gebruiken om toegang te krijgen tot meerdere onafhankelijke services. U kunt ook load balancing toevoegen om stabiliteit en uptime te garanderen door verzoeken over uw serverpark te verdelen.
Advertentie
Er zijn ook andere proxy-varianten beschikbaar. U kunt onder andere FTP-, WebSocket- en HTTP2-verbindingen proxyen door extra add-ons naast mod_proxy te installeren. De volledige lijst met modules is beschikbaar in de Apache-documenten.