Varnish es un acelerador web, que puede ser utilizado tanto para cachear contenido estático de nuestro servidor, para balancear la carga o para incrementar la seguridad, por ejemplo, bloqueando cierto tipo de peticiones u ocultando cierto tipo de información.
Se instala directamente de los repositorios:
$ sudo aptitude install varnish
Ahora lo configuraremos para utilizarlo como capa intermedia, delante de
nuestro Apache. Editamos el fichero /etc/default/varnish
y cambiamos:
DAEMON_OPTS="-a :6081
-T localhost:6082
-f /etc/varnish/default.vcl
-S /etc/varnish/secret
-s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"
por:
DAEMON_OPTS="-a :80
-T localhost:6082
-f /etc/varnish/000-default.vcl
-S /etc/varnish/secret
-s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"
En el fichero /etc/varnish/000-default.vcl
específicamos las reglas
que queremos aplicar a las peticiones que le van a llegar a Apache.
Podemos eliminar cabeceras o modificarlas, por ejemplo,
cambiando el nombre y la versión de Apache. Conviene recordar que
cambiar el nombre del servidor, no lo hace más seguro.
También podemos descartar peticiones que cumplan algún criterio, por ejemplo que contenga la cadena "w00tw00t".
## Redirect requests to Apache, running on port 8000 on localhost
backend apache {
.host = "127.0.0.1";
.port = "8080";
}
## Fetch
sub vcl_fetch {
## Change server signature
unset obj.http.Server;
set obj.http.Server = "Unknown";
## Remove the X-Forwarded-For header if it exists.
remove req.http.X-Forwarded-For;
## insert the client IP address as X-Forwarded-For. This is the normal IP address of the user.
set req.http.X-Forwarded-For = req.http.rlnclientipaddr;
## Added security, the "w00tw00t" attacks are pretty annoying so lets block it before it reaches our webserver
if (req.url ~ "^/w00tw00t") {
error 403 "Not permitted";
}
## Deliver the content
return(deliver);
}
## Deliver
sub vcl_deliver {
## We'll be hiding some headers added by Varnish. We want to make sure people are not seeing we're using Varnish.
## Since we're not caching (yet), why bother telling people we use it?
remove resp.http.X-Varnish;
remove resp.http.Via;
remove resp.http.Age;
## We'd like to hide the X-Powered-By headers. Nobody has to know we can run PHP and have version xyz of it.
remove resp.http.X-Powered-By;
}
Ahora, cambiamos el puerto en el que escucha Apache, editando el fichero
/etc/apache2/ports.conf
:
NameVirtualHost *:8080
Listen 127.0.0.1:8080
También debemos editar nuestros hosts virtuales, por ejemplo,
/etc/apache2/sites-enabled/default
, y cambiamos:
<VirtualHost 127.0.0.1>
por:
<VirtualHost 127.0.0.1:8080>
Tras hacer este cambio, el único que «hablará» con Apache será Varnish,
por lo que la única IP que veremos será la 127.0.0.1
. Instalaremos un
módulo extra de Apache para asegurarnos de que la IP es la correcta:
$ sudo aptitude install libapache2-mod-rpaf
$ sudo a2enmod rpaf
RPAF (Reverse Proxy Add Forward) reemplazará la IP por la que Varnish
habrá puesto en la cabecera X-Forwarded-For
.
Reiniciamos los servicios:
$ sudo service apache2 restart
$ sudo service varnish restart
Si todo ha ido bien, Varnish deberá estar escuchando en el puerto 80 y Apache en el 8080:
$ sudo netstat -lp | grep apache2
tcp 0 0 localhost:http-alt _:_ ESCUCHAR 2587/apache2
$ sudo netstat -lp | grep varnishd
tcp 0 0 _:www *:_ ESCUCHAR 9452/varnishd
tcp 0 0 localhost:6082 _:_ ESCUCHAR 9451/varnishd
tcp6 0 0 [::]:www [::]:* ESCUCHAR 9452/varnishd
Previously
» Cabeceras HTTP » Ocultando cabeceras » Cabeceras HTTPS personalizadas en Apache2 » w00tw00t en los logs de Apache