Reverse proxy’s kun je ook gebruiken om de belasting over meerdere backend-servers te verdelen, of om caching te bieden voor een tragere backend-server. Daarnaast kun je er meerdere servers mee samenbrengen in dezelfde URL-ruimte.

De proxy-module inschakelen

Voor ondersteuning van reverse proxy heb je een aantal modules nodig:

LoadModule proxy_module mod_proxy.so
LoadModule proxy_http_module mod_proxy_http.so

Vergeet mod_proxy_http niet te laden: laad je die niet, dan krijg je geen enkele foutmelding.

Proxy uitschakelen

Omdat mod_proxy van Apache ook een (open) proxyserver maakt, voorkom je met ProxyRequests op Off dat Apache als forward proxy gaat werken.

ProxyRequests Off
<Proxy \*>
Order deny,allow
Deny from all
</Proxy>

In een normale reverse proxy- of gateway-configuratie hoort deze optie altijd op Off te staan.
Dit schakelt het gebruik van de ProxyPass-directive niet uit.

Gateway-configuratie toevoegen

Het volgende voorbeeld laat een front-endmachine een virtual host doorsturen naar een server op een andere machine.

<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://OriginServer/
ProxyPassReverse / http://OriginServer/
ServerName www.host.com
</VirtualHost>

De directive ProxyPreserveHost On geeft de Host:-regel uit het inkomende verzoek door aan de host achter de proxy, in plaats van de hostnaam uit de ProxyPass-regel. Dat is nodig wanneer we meerdere hostnamen naar één machine proxyen.

De onderstaande afbeelding laat zien hoe het werkt:

  1. Een browser stuurt een HTTP-verzoek naar een host met de naam www.host.com op poort 80. De gateway (front-end) ontvangt het verzoek omdat hij optreedt als de oorspronkelijke server (de gepubliceerde hostnaam van die server verwijst naar de gateway).
  2. De gateway vindt een regel in de configuratie en stuurt het verzoek door naar de opgegeven oorspronkelijke server (realhost.com).
  3. De gateway opent een HTTP-verbinding naar de oorspronkelijke server. (Als het verzoek niet uit de cache beantwoord kan worden.)
  4. Zit het verzoek in de cache en is de inhoud nog vers, dan stuurt de gateway het gevraagde object vanuit de cache naar de client. Anders haalt de gateway het object op bij de oorspronkelijke server, stuurt het naar de client en bewaart een kopie in de cache als caching aanstaat.

Caching

Door veelgevraagde informatie aan de rand van het netwerk te cachen, verbeter je de efficiëntie en prestaties van het netwerk. De inhoud komt fysiek dichter bij de eindgebruiker, wat zorgt voor snellere levering en minder bandbreedtegebruik.

# Sample Cache Configuration
LoadModule cache_module modules/mod_cache.so

<IfModule mod_cache.c>
#LoadModule disk_cache_module modules/mod_disk_cache.so
# If you want to use mod_disk_cache instead of mod_mem_cache,
# uncomment the line above and comment out the LoadModule line below.
<IfModule mod_disk_cache.c>
CacheRoot c:/cacheroot
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 3
</IfModule>
LoadModule mem_cache_module modules/mod_mem_cache.so
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
</IfModule>

# When acting as a proxy, don’t cache the list of security updates
CacheDisable http://security.update.server/update-list/
</IfModule>

SSL-reverse proxy

De mogelijkheid om externe servers via het SSL/TLS-protocol te benaderen, biedt de directive SSLProxyEngine van mod_ssl.

LoadModule ssl_module modules/mod_ssl.so
<VirtualHost *:443>
# Path to Server Certificate:
SSLCertificateFile /etc/pki/tls/certs/server.cer
# Path to Server Private Key:
SSLCertificateKeyFile /etc/pki/tls/certs/private.key

SSLEngine on
ServerName ssl.domain.com
SSLProxyEngine On
ProxyPreserveHost On
ProxyPass / https://172.168.10.51/
ProxyPassReverse / https://172.168.10.51/

# To offload SSL (The request is forwarded by http)
#ProxyPass / http://172.168.10.51/
#ProxyPassReverse / http://172.168.10.51/
</VirtualHost>

Requestheaders van de reverse proxy

In reverse proxy-modus voegt mod_proxy_http verschillende requestheaders toe om informatie aan de oorspronkelijke server door te geven. Dat zijn deze headers:

X-Forwarded-For — het IP-adres van de client.

X-Forwarded-Host — de oorspronkelijke host die de client in de Host-HTTP-requestheader opvroeg.

X-Forwarded-Server — de hostnaam van de proxyserver.

Wees voorzichtig met het gebruik van deze headers op de oorspronkelijke server: ze bevatten meer dan één (door komma’s gescheiden) waarde als het oorspronkelijke verzoek al zo’n header bevatte. Je kunt bijvoorbeeld %{X-Forwarded-For}i in de logopmaak van de oorspronkelijke server gebruiken om het IP-adres van de originele client te loggen, maar je krijgt mogelijk meerdere adressen als het verzoek via meerdere proxy’s liep.

Een eigen 503-foutpagina

Is de backend-server niet bereikbaar, dan genereert Apache de melding 503 Service Unavailable. Dat betekent dat de server op dit moment niet beschikbaar is (door overbelasting of onderhoud). Vervang die lelijke pagina door een vriendelijke variant die bezoekers laat weten dat de site snel weer online is, door een eigen foutpagina te maken. Neem ook links op naar plekken waar ze hulp of meer informatie kunnen krijgen, zodat de ervaring ook bij problemen persoonlijk blijft.

Stel Apache vervolgens zo in dat die eigen foutpagina bij deze fout wordt gebruikt, door onderstaande directive aan je VirtualHost toe te voegen.

ErrorDocument 503 /error-documents/503.html