Il server proxy è da considerarsi come un step intermedio fra il client ed il server remoto, quando viene utilizzato non si ha il passaggio diretto delle informazioni fra server e client ma è il proxy a gestire la comunicazione fra i due.
Gli obiettivi che si vogliono perseguire con la funzionalità del proxy sono:
- Caching, ovvero le informazioni richieste del client vengono messe in una cache del proxy e restituite in un secondo momento se le stesse informazioni vengono richieste, senza scaricare di nuovo i dati dal server remoto. Quindi si ha il vantaggio di aumentare la velocità e ridurre la quantità di banda utilizzata.
- Sicurezza. Client e server sono logicamente isolati, quindi il proxy può fungere anche come barriera per il traffico indesiderato.
La funzionalità principale di un proxy è quella di effettuare relay e caching delle richieste provenienti dai vari client in entrambe le direzioni ovvero FORWARD e REVERSE.
Per FORWARD proxy si intende quel proxy che fa da relay per un client della LAN interna ed esegue il caching delle pagine richieste, limitando così la banda uscente ed aumentando la velocità di trasferimento.
Per REVERSE proxy si intende quel proxy che esegue il relay di un client esterno verso un server interno, riducendo cosi il carico sul server, soprattutto quando deve generare pagine dinamiche.
La funzionalità di Proxy su Apache è gestita dal modulo mod_proxy e viene attivata o disattivata tramite la direttiva ProxyRequests a livello di server configuration:
ProxyRequests on/off
Tale direttiva viene ereditata dai singoli VirtualHost se viene attivata a livello di server configuration, trasformando cosi tutti i VirtualHost in tanti proxy.
Curiosa, ma non funzionale, è la possibilità di configurare un proxy per collegarsi a siti erogati dallo stesso server web.
E' possibile definire cosa va proxato:
<Directory proxy:[protocol]:[URL] >
</Directory>
Controllo sugli accessi al proxy
<Directory proxy:*>
Order Deny,Allow
Deny from all
Allow from yournetwork.example.com
</Directory>
Oltre ad avere la possibilità di bloccare le richieste effettuate al proxy è possibile bloccare il relay delle richieste da parte del proxy per alcuni domini o ip, tramite la direttiva ProxyBlock:
ProxyBlock [dominio] [ip] [parola]
Da evidenziare che basta una parola per bloccare tutti i domini che contengono quella parola:
In questo caso non verrà eseguito alcun relay per il dominio www.dominio.it e per tutti i domini contenenti la parola pippo
ProxyBlock www.dominio.it pippo
Di seguito sono riportate alcune direttive utili per completare la configurazione del proxy server:
ProxyPass Sintassi: ProxyPass path url
Converte una richiesta al server locale ad un richiesta ad un proxy:
ProxyPass /images/ http://images.domain.com
Significa che se la URL richiesta è images/ viene convertita in una proxy request a http://images.domain.com
ProxyRemote Sintassi: ProxyRemote match remote-server
Questa direttiva permette di definire un proxy remoto, che verrà contattato ad ogni URL matching:
ProxyRemote * http://proxy.remoteserver.com:8080
In questo caso tutte le richieste vengono forwardate al proxy server remoto
NoProxy Sintassi: NoProxy Domain|SubNet|IpAddr|Hostname[Domain|SubNet|IpAddr|Hostname] ...
La direttiva permette di escludere le richieste da forwardare al proxy settato tramite la direttiva ProxyRemote provenienti da host, domini, ip e reti intere:
ProxyRemote * htpp://proxy.remoteserver.com:8080
NoProxy 10.0.0
In questo caso tutte le richieste vengono forwardate al proxy server remoto tranne le richieste provenienti dalla rete 10.0.0
Se con le direttive ProxyBlock e Nocache viene utilizzato il carattere "*" acquistano un valore determinante per la funzionalità del proxy server.
Esegue un blocco totale dei relay delle richieste:
ProxyBlock *
La funzionalità di caching non viene abilitata per alcun tipo di risorsa richiesta:
Nocache *
Tramite la direttiva ProxyReceiveBufferSize è possibile settare un Network buffer per i protocolli HTTP e FTP.
Se settato a zero Apache utilizza il valore settato dall'OS.
ProxyReceiveBufferSize 4096
La funzionalità di caching del proxy server di Apache non è abilitata di default ma occorre settare la direttiva CacheRoot, ovvero la direttiva che indica la directory dove fare lo store della cache.
CacheRoot /usr/local/apache/proxy
Altre direttive invece servono per definire i paramtri di mantenimento della cache:
CacheDirLevels - Direttiva che permette di settare il numero massimo di livelli per le subdir nella cache:
CacheDirLevels 7
CacheDirLenght - Indica il numero massimo di caratteri di una subdir della cache:
CacheDirLength 1
CacheSize - Indica lo spazio massimo su disco da riservare alla cache. Il valore è espresso in Kb:
CacheSize 1024
CachegcInterval - Indica l'intervallo in ore in cui il server Apache eseguirà un check per verificare che lo spazio su disco occopato sia minore da quello settato tramite la direttiva CacheSize:
CachegcInterval 1.5
[1.5 = 90 min]
CacheMaxExpires - Indica il valore massimo in ore della validità della cache:
CacheMaxExpires 24
CacheLastModifiedFactor - Direttiva che permette di stabilire expire date di un documento nel caso in cui il server HTTP originario non l'abbia formita, tramite la formula: expiry-period = time-since-last-modification * factor:
CacheLastModifiedFactor 0.1
In questo caso significa che se il documento è stato modificato 20 ore fa, l'expire date assegnatogli sarà di 2 ore: 20*0.1 = 2 ore.
CacheDefaultExpire - Se il documento richiesto è stato reperito tramite un protocollo che non supporta l'expire-date, gli verrà assegnato il valore (in ore) di default settato tramite questa direttiva:
CacheDefaultExpire 1
CacheForceCompletion - Valore che indica la soglia in percentuale per cui anche un risorsa non completamente "trasferita" verrà eseguito il caching:
CacheForceCompletion 75
Il valore deve essere compreso fra 0 e 100. (Tra 60 e 90 quello raccomandato)
0 è il valore di default, con 100 il documento verrà messo in cache solo se il transfer sarà completo.
NoCache - Direttiva che permette di elencare parole, domini e host (separati da uno spazio) per i quali non verrà attivata la funzione di cache:
NoCache local.dominio.it intranet.com dynamix.edu
Mod_bandwidth è un modulo non incluso nei sorgenti base di Apache che può essere scaricato dall'archivio dei moduli sviluppati da terze parti di apache.
Lo scopo primario di questo modulo è quello di poter controllare la banda in uscita al secondo, limitando il traffico secondo vari criteri come il client remoto, la dimensione del file richiesto o il container specificato (virtual host, directory ecc).
La direttiva per l'attivazione di questo modulo è BandWidthModule e le direttive per la configurazione dei limiti devono essere contenuti in un container.
- Attivazione del modulo
BandWidthModule on
- Limita la banda a seconda dell'IP del client
Syntassi: BandWidth [ip|host] [rate]
Esempio:
<Directory />
BandWidth localhost 0
BandWidth 138.195 4096
BandWidth all 1024
</Directory>
Le dimensioni espresse sono interpretate in Kb. Quando si specifica "0" si esclude qualsiasi tipo di limiti
- Limita la banda a seconda delle dimensioni dei file
Sintassi: LargeFileLimit [filesize] [rate]
Esempio per una configurazione che non limita la banda per file più piccoli di 512Kb, la limita a 4096kb per i file di dimensione compresa tra 512 e 1023 kb, e la limita a 2048Kb per invece per i file di dimensione 1024 o maggiore:
<Directory />
BandFileLimit 512 4096
BandFileLimit 1024 2048
</Directory>
Le dimensione espresse sono interpretate in Kb.
MinBandWidth
E' la diretiva che permette di settare la banda minima garantita per client.
Se si setta un limite di 4k per una risorsa, questa banda verrà shareata per tutti i client che richiederanno questa risorsa, con questa direttiva viene fissato il valore minimo.
MinBandWidht All 4096
BandWidthPulse
Abilita un modo alternativo dell'invio dei pacchetti, ovvero a seconda dell'intervallo fissato in microsecondi invia pacchetti con qualsiasi dimensione
BandWidthPulse 10000
Il protocollo HTTP/1.1 definisce l'header "via" che viene aggiunto dal proxy server in automatico a tutte le risorse richieste per indicare la route dalla destinazione della richiesta al client.
Ammettiamo che un client richieda una risorsa attraverso dei proxy server A, B ed infine C, quest'ultimo aggiungerà al pacchetto di ritorno al client l'header via che indica la strada da percorrere, in questo caso i proxy server C,B ed infine A.
Si può gestire questa funzionalità tramite la direttiva ProxyVia
Il proxy server non aggiunge l'header, ma permette il permette l'esistenza dell'header in pacchetti ricevuti da altri proxy. Settaggio di default:
ProxyVia off
Il proxy aggiunge l'header via a tutti pacchetti relayati da lui:
ProxyVia on
Il proxy aggiunge l'header via a tutti pacchetti relayati da lui ed aggiunge la versione di Apache:
ProxyVia full
Esegue uno "strip" di tutti gli header via esistenti, e non ne aggiunge di nuovi:
ProxyVia block
Quando un client riceve un messaggio di errore generato in modo dinamicamente, causato da una richiesta effettuata tramite un server proxy o una catena di proxy, si possono avere difficoltà a capire dove si è generato l'errore.
Tramite la direttiva ServerSignature è possibile aggiungere ad ogni pagina di errore un footer contenente informazioni sul server.
Questo footer viene aggiunto in modo automatico per tutti i documenti generati dal proxy server:
Il proxy server non fa nessun tipo di append
ServerSignature off
Il proxy server aggiunge un footer contenente il server name e la versione del server
ServerSignature on
Il proxy server aggiunge un footer come nel caso precedente aggiungendo l'indirizzo email settato tramite la direttiva ServerAdmin
ServerSignature email
Questa direttiva è valida per qualunque pagina di errore generata da Apache, anche quando funge regolarmente da web server e non come proxy.
Il modulo mod_proxy può accettare anche le richieste di connessione tramite il protocollo HTTP (HTTP Connect) per accedere o meglio connettersi un server remoto con protocolli differenti da FTP e HTTP.
Quando il proxy server riceve una richiesta di HTTP connect confronta le porte in uso con quelle disponibili, se la porta è disponibile allora il proxy server esegue la connessione sul server remoto alla porta specificata e mantiene la connessione tra il client e il server remoto facendo da relay per i pacchetti.
Di default Apache accetta tutte le richieste di Connect per le porte 443(HTTPS) e 563(SNEWS), ma tramite la direttiva AllowCONNECT è possibile customizzare la lista delle porte:
AllowCONNECT 443 563 23