Apr 302012
 

Varnish è un “Web Accelerator” open source che può essere utilizzato per accelerare il vostro sito web.

E’ possibile memorizzare nella cache alcuni elementi statici, come immagini o JavaScript, ma si può anche usarlo per altri scopi come il bilanciamento del carico o aggiungere un po di sicurezza, in generale, la maggior parte delle persone vogliono provare e testare il loro sito web per vedere se è davvero così incredibile (IMO sì, ma provate voi stessi).

Le guide tradizionali che si trovano in rete vi diranno di spostare il webserver su un’altra porta, forse 81,8080 o far ascoltare solo su localhost, configurare Varnish in ascolto sulla porta 80 e utilizzare il web server come back-end, ovvero il server a cui Varnish inoltrerà le richieste non trovate nella propria cache.

Questa è la configurazione “normale” e funziona benissimo, ma a volte si vuole solo fare un test rapido o forse si sta utilizzando un pannello di controllo, come ad esempio Cpanel, Kloxo o ISPConfig e nella mia esperienza cambiare le porte standard in ascolto di Apache non è una decisione da prendere a cuor leggero usando questi strumenti.

Quindi, in una VPS (con Kloxo) ho usato un approccio diverso: iptables.




Nel mio approccio ho lasciato il webserver (Apache per me) sulla porta 80, quindi nessun cambiamento su questo lato.
Ho configurato Varnish per l’ascolto sulla porta 8080 e impostato come backend Apache sulla porta 80.
Ho fatto partire Varnish e, come previsto, andando sulla porta 8080 ho visto che il sito funziona correttamente (fornito da Apache).

E ora un po’ di “magie” con iptables, tutte le richieste che vanno alla porta 80 del server sono silenziosamente reindirizzate alla porta 8080 , e così Varnish diventa il nostro server di front-end senza alcun cambiamento sulla configurazione di Apache.

Come farlo

Come avrete probabilmente intuito l’unico “trucco” è quello di utilizzare una delle molte caratteristiche di iptables, iptables è uno programma che gira in user-sapce che permette di configurare le tabelle fornite dal firewall del kernel Linux, e in questo caso particolare ho usato la tabella nat con la catena PREROUTING tramite l’azione di redirect.

Dalla pagina man di iptables:

nat :
Questa tabella viene consultata quando un pacchetto creato da una nuova connessione viene rilevato. Si compone di tre catene
incluse: PREROUTING (per alterare i pacchetti non appena entrano), OUTPUT (per alterare i pacchetti generati localmente
prima dell’instradamento), e POSTROUTING (per alterare i pacchetti quando sono in procinto di uscire).

Così non appena un pacchetto entra il “firewall”, iptables, verifica se ha una porta di destinazione pari ad 80 in tal caso si applica l’azione, nel mio caso redirect e quindi il pacchetto viene reindirizzato alla porta 8080 dove Varnish è in ascolto.

Regole di Iptables ed Alias

Per mettere le regole che dirigono tutto il traffico dalla porta 80 alla 8080 aprite un terminale come root ed usate il comando:

#iptables -t nat  -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080

Se volete togliere Varnish come server di Front End potete semplicemente togliere questa regola con il comando:

#iptables -t nat  -D PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080

E per verificare se il redirect è attvio, chiedetelo ad iptables con:

#iptables -L -t nat

Se vedete una linea come quella seguente significa che il redirect è attivo, se non c’e’ nulla nell’output significa che è inattivo.

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080



Ma c’è un modo più semplice di utilizzare questi comandi come root è sufficiente aggiungere nel vostro file ~/.bashrc questi 3 alias:

alias varnishon='iptables -t nat  -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080'
alias varnishoff='iptables -t nat  -D PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080'
alias varnishstatus='iptables -L -t nat |grep -q 8080; if [ "test$?" = "test0" ]; then echo "Varnish On"; else echo "Varnish Off"; fi'

Ed ora potete attivare e disattivare Varnish con 1 solo comando.

Note Finali

Non ho provato con un benchmark quanto peggiorano le performance di questa configurazione a confronto di una soluzione tradizionale, probabilmente non tanto in quanto iptables è un servizio del kernel ed è molto leggero, in ogni caso se avete un sito con un sacco di traffico utilizzate questa configurazione solo per un test di Varnish, e se vi piace fate una configurazione “tradizionale”.

Popular Posts:

flattr this!

  12 Responses to “Come mettere Varnish davanti al proprio Webserver senza fare alcun cambio.”

  1. It is even easier on FreeBSD (I have never tried it on Linux). We have Apache listening on *:80 (localhost and all interfaces). When we started up varnish we set it up to listen on the external interface only (eg 20.30.40.50:80) and to use localhost:80 as the backend. Since its listening was more specific than Apache, Varnish did the right thing for us, it took over listening on the external interface and did backend requests to localhost:80 which was being served by Apache. It also did the right thing when we shut down varnish, the external interface was served directly by Apache.

    • On Linux this don’t work, when you try to start Varnish you get a “cannot bind to XXX port already in use”, i don’t know that freebsd has this behavior, nice to know.

      Thanks Ryan

  2. Excellent Ricardo.

    I usually like to make less changes to defaults, as if you have to move your server to another hosting later (months or years later) you do not have to remember all tweaks done.

  3. Thank you this tutorial looks intriguing. What is needed to make it work on cPanel?

    • As long as you can connect as root via ssh you should no problems at all, you’ll continue to manage your webserver with apache and varnish Manually.

  4. i, it doesn’t work for me when i view the page in varnish defualt port, it leads to the apache test page for Kloxo panel.

  5. Here’s my config for editing /etc/varnish/default.vcl

    backend default {
    .host = “127.0.0.1″;
    .port = “80″;
    }
    I also tried editing the host to my actually IP but then i see kloxo default page…..
    then i edited /etc/sysconfig/varnish and changed
    VARNISH_LISTEN_PORT=6081

    to
    VARNISH_LISTEN_PORT=8080
    then i stopped since i could only see the test page and not the actually webpage displaying.

    • Hi,
      I have the same problem with kloxo it seems you have to change:
      .host = “127.0.0.1″;
      to your external IP valid,
      .host = “x.x.x.x″;

  6. how i can do this With tow Different IP Addresses : varnich_ip : v.v.v.v and webser_ip : w.w.w.w

  7. Ciao ragazzi, ho un server centos vorrei aggiungere ad apache, ngix (reverse proxy) e varnish tutto insieme modificando il meno possibile il mio server utilizzando una soluzione simile a quella da voi proposta. Grazie mille
    Davide

    • Ciao
      Se metti Varnish probabilmente non ti servirà anche Nginx (come reverse proxy).
      A meno che tu non voglia usarlo al posto di Apache.

 Leave a Reply

(required)

(required)


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>