Come configurare un proxy inverso con Apache

0
267

 

Sharaf Maksumov/Shutterstock.com

Apache è un server Web versatile che offre una serie completa di funzioni di supporto, alcune delle quali tramite estensioni. In questo articolo, utilizzeremo il modulo mod_proxy per configurare Apache in un ruolo proxy inverso.

Anche se Apache potrebbe non essere la tua prima scelta come proxy inverso, con alternative più moderne come NGINX che tendono a rubare l'attenzione, mod_proxy è utile per i server che eseguono già Apache e ora devono instradare il traffico a un altro servizio. Puoi configurare un host virtuale Apache per trasmettere le richieste per un determinato dominio a un server web separato.

Stiamo usando Apache 2.4 con un sistema basato su Debian per gli scopi di questa guida. Assumiamo inoltre che i server a cui desideri inviare il traffico tramite proxy siano già accessibili in rete dal tuo host Apache. Questo articolo si concentra sull'abilitazione del proxy basato su un host virtuale univoco, ma mod_proxy è anche configurabile a livello globale, come parte della configurazione del server Apache, oa livello di directory tramite file .htaccess.

Abilitazione del modulo proxy

mod_proxy è incluso nell'installazione predefinita di Apache. Usa a2enmod per attivare il modulo e il suo componente HTTP indipendente ora:

sudo a2enmod proxy sudo a2enmod proxy_http

Questo configura Apache per supportare l'inoltro di connessioni HTTP ad altri host. Il modulo viene configurato utilizzando le istruzioni con prefisso proxy nei file di configurazione di Apache. Successivamente li configureremo.

Configurazione di un host virtuale proxy

Let’s configurare un host virtuale che inoltra example.com all'indirizzo IP interno 192.168.0.1. Dovresti aggiungere un record DNS per esempio.com che punti al tuo host Apache.

Pubblicità

Il proxy in questo scenario consente ai visitatori di accedere in modo trasparente al server Web interno tramite un indirizzo esterno. Apache agisce come il gatekeeper che instrada il traffico verso la sua destinazione finale. L'utente vedrà example.com, anche se Apache risolve effettivamente le richieste tramite un server separato.

Aggiungi un nuovo file host virtuale all'interno di /etc/apache2/sites-disponibile con il seguente contenuto:

<VirtualHost *:80> ServerName example.com ProxyPass/http://192.168.0.1/nocanon ProxyPassReverse/http://192.168.0.1/</VirtualHost>

Le direttive ProxyPass e ProxyPassReverse specificano che il traffico verso example.com deve essere inviato tramite proxy a 192.168.0.1. La parola chiave nocanon facoltativa indica ad Apache di passare l'URL non elaborato al server remoto. Senza questa parola chiave, Apache canonizzerà automaticamente l'URL, che può essere incompatibile con alcuni server e framework. L'utilizzo di nocanon garantisce la compatibilità ma può influire sulla tua posizione di sicurezza poiché disabilita la protezione integrata di Apache contro gli attacchi proxy basati su URL.

È necessario fornire ProxyPassReverse per distinguere la configurazione come configurazione del proxy inverso. Apache utilizzerà l'URL fornito per riscrivere le intestazioni di risposta Location, Content-Location e URI emesse dal tuo back-end. Ciò garantisce che le richieste successive continuino a raggiungere il proxy inverso, invece di tentare di raggiungere direttamente il server interno.

Questa configurazione eseguirà il proxy di tutte le richieste. Puoi limitare il proxy a un percorso specifico come /media modificando le istruzioni ProxyPass e ProxyPassReverse:

ProxyPass /media http://192.168.0.1/ProxyPassReverse /media http://192.168.0.1/Pubblicità

L'aggiunta di più regole ProxyPass consente di instradare le richieste tra più destinazioni utilizzando un host virtuale. Le regole sono abbinate nell'ordine in cui sono state scritte. Se hai bisogno di un comportamento di routing più complesso, usa invece la direttiva ProxyPassMatch. Equivale a ProxyPass ma confronta gli URL in entrata con un'espressione regolare:

ProxyPassMatch ^/client/(.*)/images$ http://192.168.0.1/

Salva il tuo file host virtuale e abilitalo usando il comando a2ensite. Questo prende il nome di base del tuo file, relativo alla directory dei siti disponibili:

sudo a2ensite example-proxy-vhost

Riavvia Apache per applicare le modifiche:

sudo service apache2 restart

Il tuo semplice il proxy dovrebbe ora essere operativo. Prova a visitare example.com – dovresti vedere il contenuto servito da 192.168.0.1. La richiesta termina al tuo host Apache che poi la invia tramite proxy al tuo server interno.

Utilizza SSL

L'esempio sopra omette SSL. In un carico di lavoro di produzione, vorresti configurarlo aggiungendo le impostazioni SSLCertificateFile e SSLCertificateKeyFile al tuo host virtuale. Specificano il certificato SSL e la chiave da utilizzare durante la convalida delle connessioni SSL. Puoi anche utilizzare Let’s Encrypt’s certbot per automatizzare la configurazione.

Configurare SSL in questo modo significa che la connessione sicura verrà interrotta al tuo host Apache. La connessione tra Apache e la tua destinazione proxy verrà effettuata tramite HTTP semplice.

Se è necessario che anche la connessione proxy sia protetta, è necessario utilizzare le opzioni SSLProxy fornite da mod_ssl. SSLProxyEngine = On funzionerà come configurazione di base, a condizione che sia Apache che il server di destinazione proxy abbiano accesso agli stessi certificati. Questa opzione indica che le informazioni SSL devono essere inviate tramite la connessione proxy.

Opzioni proxy

I proxy inversi Apache hanno diverse direttive opzionali che puoi utilizzare per regolare il comportamento di inoltro . Ecco alcune opzioni comunemente usate:

  • ProxyAddHeaders – Apache passa le intestazioni X-Forwarded-Host, XForwarded-For e X-Forwarded-Server al tuo server back-end per impostazione predefinita. Questi consentono al tuo back-end di identificare che una richiesta è stata inviata tramite proxy tramite Apache. L'impostazione di questa intestazione su Off impedisce ad Apache di aggiungere queste intestazioni.
  • ProxyErrorOverride– Apache non interferisce con le risposte inviate dal tuo server back-end a meno che non venga richiesto. Se il tuo back-end fornisce un codice di errore 400, 404, 500 o qualsiasi altro, l'utente riceverà quel contenuto così com'è. L'impostazione di ProxyErrorOverride cambia questo, lasciando che Apache sostituisca invece il contenuto delle pagine di errore con ErrorDocument configurato. Questo può essere auspicabile in situazioni in cui desideri che gli errori di tutti i tuoi backend siano gestiti in modo uniforme con la configurazione centralizzata sull'host proxy.
  • ProxyPassReverseCookieDomain– Funziona in modo simile alla direttiva ProxyPassReverse obbligatoria (per proxy inverso). Riscriverà il dominio nelle intestazioni di Set-Cookie per fare riferimento al nome dell'host virtuale, anziché al nome host del server back-end da cui provengono.
  • ProxyPreserveHost &# 8211; Apache di solito invia il proprio nome host ai server di backend come valore dell'intestazione Host. L'impostazione di questa direttiva significa che verrà inviata invece l'intestazione Host originale. Ciò potrebbe essere necessario quando il tuo software di back-end esegue il proprio routing basato sul nome host.
  • ProxyTimeout– Usa questa direttiva per regolare il tempo che Apache attenderà mentre il tuo server back-end elabora una richiesta proxy. Apache annullerà la richiesta e restituirà un codice di errore al client se il timeout viene superato. Il valore predefinito è il valore di Timeout a livello di server.

Pubblicità

Puoi impostare queste direttive come righe aggiuntive nel tuo file host virtuale. Ricordati di riavviare il servizio Apache ogni volta che applichi una modifica.

Bilanciamento del carico

L'implementazione del proxy inverso di Apache supporta anche il bilanciamento del carico tra più backend diversi. Ciò consente a una richiesta a example.com di raggiungere qualsiasi server nel pool di bilanciamento.

<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

Questo esempio instrada le richieste a uno dei due server nel pool del programma di bilanciamento dell'esempio. L'algoritmo di bilanciamento del carico è definito dall'impostazione lbmethod; il valore di bytraffic qui utilizzato cerca di garantire che ciascuno dei server gestisca una uguale quantità di traffico.

Il metodo di bilanciamento byrequests alternativo è una versione più semplice di bytraffic che assegna a ciascun back-end una quota uguale delle richieste in entrata. Il  bybusyness balancer tiene traccia del numero di richieste servite da ciascun back-end, quindi ne assegna di nuove a quelle meno “occupate” backend.

Riepilogo

Il modulo mod_proxy può trasformare Apache in un host proxy inverso che consente di utilizzare il routing basato sui nomi per accedere a più servizi indipendenti. Puoi anche aggiungere il bilanciamento del carico per garantire stabilità e tempo di attività distribuendo le richieste sul tuo parco server.

Pubblicità

Sono disponibili anche altre versioni proxy. Puoi proxy FTP, WebSocket e connessioni HTTP2, tra gli altri, installando componenti aggiuntivi insieme a mod_proxy. L'elenco completo dei moduli è disponibile nella documentazione di Apache.