Varnish es un acelerador de servidores web, también conocido como caché de proxy HTTP inversa. Se instala delante de cualquier servidor HTTP (apache, Ngnix, etc.) y se configura para almacenar en el caché del servidor una copia del recurso solicitado. Está pensado para aumentar el rendimiento de aplicaciones web con contenidos pesados y APIs de gran consumo.
En esta guía, veremos el uso de Apache2 con SSL y servidor de web con Varnish como servidor de almacenamiento en caché.
Además, exploraremos dos configuraciones de sitios web:
- HTTP y HTTPS.
- Solo HTTPS.
Operaciones Comunes
Antes de que podamos comenzar a configurar Apache y Varnish para cualquiera de las configuraciones, es necesario instalarlos y habilitar algunos módulos de Apache.
En primer lugar, instale Apache y Varnish:
apt-get update
apt-get upgrade
apt-get install varnish apache2
A continuación, cargue todos los módulos necesarios de Apache:
a2enmod ssl
a2enmod proxy
a2enmod proxy_balancer
a2enmod proxy_http
Y reiniciar:
systemctl restart apache2.service
HTTPS y HTTP
Esta configuración tendrá un Apache VirtualHost escuchando en la IP externa para conexiones HTTPS y otro VirtualHost escuchando en localhost para las solicitudes de contenido de Varnish.
Además, Varnish aceptará las solicitudes HTTP en las direcciones IP externas e internas y, por lo tanto, se encargará del lado HTTP.
La estructura será más fácil de entender con el siguiente diagrama:
como se verá en la imagen, toda solicitud al servidor pasa por Varnish, en el caso del apache(443) funciona como una caja de paso temporal y luego llegará a Varnish (caché) luego a apache core (8080)
Primero configuraremos Apache para que escuche las solicitudes HTTPS externas y las solicitudes HTTP internas mediante la creación de dos archivos VirtualHost.
El primer archivo que crearemos aceptará las conexiones HTTPS externas y luego entregará las solicitudes a Varnish. Llamaremos a este archivo VirtualHost external-https.conf
y se verá así:
<VirtualHost *:443>
ServerName example.com
ErrorLog /var/log/apache2/external-https_error.log
CustomLog /var/log/apache2/external-https_access.log combined
SSLCertificateFile /etc/ssl/example.com.crt
SSLCertificateKeyFile /etc/ssl/example.com.key
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:80/
ProxyPassReverse / http://127.0.0.1:80/
</VirtualHost>
La primera parte del archivo VirtualHost es absolutamente normal, excepto que no aparece en la DocumentRoot
lista. Esto se debe al segundo bloque que establece las directivas de Proxy . Estas directivas indican a Apache que dirija las solicitudes de página entrantes a 127.0.0.1:8080
(Varnish) y también acepte las respuestas desde la misma ubicación en lugar de servir el contenido directamente.
El próximo archivo VirtualHost será el que configure Apache para aceptar solicitudes HTTP y para entregar el contenido del sitio a Varnish. Este archivo lo llamaremos internal-http.conf
y se parece a:
<VirtualHost 127.0.0.1:8080>
ServerName example.com
DocumentRoot /var/www/html
ErrorLog /var/log/apache2/internal-http_error.log
CustomLog /var/log/apache2/internal-http_access.log combined
</VirtualHost>
La configuración final de Apache es detener la escucha de Apache en el puerto 80 y habilitar el puerto 8080. Esto se hace editando /etc/apache2/ports.conf
. Edite la siguiente línea:
Listen 80
Comentar y escribir:
# Listen 80
Listen 127.0.0.1:8080
Finalmente, los dos nuevos archivos VirtualHost necesitan habilitarse. Esto se hace usando el a2ensite
comando con el nombre del archivo VirtualHost sin la extensión .conf
. El comando para habilitar los dos archivos enumerados anteriormente se ve así:
a2ensite external-https
a2ensite internal-http
Eso completa la configuración de Apache. Ahora necesitamos configurar Varnish.
El primer archivo que debe editarse es el archivo de la systemd
unidad, ya que este archivo establece el puerto en el que escuchará Varnish. El archivo se puede encontrar en /lib/systemd/system/varnish.service
. Necesitas editar la siguiente línea:
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80-T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
Tenga en cuenta que la parte final malloc,256m
establece la cantidad máxima de memoria que Varnish puede usar. Si está en un servidor pequeño, debe reducir esta cantidad.
Cuando haya realizado este cambio, systemd necesita actualizarse con el siguiente comando:
systemctl daemon-reload
El valor predeterminado de Varnish es dirigir las solicitudes de contenido a 127.0.0.1:8080
las que ya hemos configurado Apache para escuchar, por lo que no es necesaria una configuración adicional de Varnish.
Apache y Varnish se (re)inician con los siguientes comandos:
systemctl restart apache2
systemctl restart varnish
Ahora todo debería estar funcionando. La sección final de esta guía cubre la prueba de la configuración para comprobar que todo funciona correctamente.
Pruebas y resolución de problemas
En primer lugar, abra varios terminales nuevos al servidor. Los usaremos para monitorear los archivos de registro de Varnish y Apache y ejecutar comandos.
En la primera terminal, ejecute el comando ‘varnishlog’ para imprimir la información de registro de Varnish en la terminal
varnishlog
No se imprimirá nada hasta que Varnish procese una solicitud.
En otro terminal, cambie al directorio de registro de Apache y siga los registros de acceso de VirtualHost interno y externo:
cd /var/log/apache2
tail -f external-https_access.log -f internal-http_access.log
Ahora necesitamos hacer algunas solicitudes por HTTP y HTTPS. Un navegador no es la mejor herramienta para este trabajo, ya que tienden a preferir HTTPS y, a menudo, realizarán una solicitud HTTPS incluso cuando ingrese la URL HTTP. También intentarán almacenar en caché el contenido y, en general, tratarán de ser inteligentes con las cosas que no es lo que necesitamos aquí.
En cambio, vamos a usar curl
which solo hará exactamente lo que le digamos. Curl tiene la ventaja adicional de imprimir información útil adicional cuando -v
se usa la bandera.
En primer lugar, probaremos el servidor configurado con HTTP y HTTPS realizando una solicitud HTTP. Desde otra terminal usa el siguiente comando para solicitar la versión HTTP del sitio:
curl -v http://example.com
curl -v https://example.com
Finalmente, intente visitar el sitio en su navegador, usando HTTPS y HTTP y monitoreando todos los archivos de registro para asegurarse de que todo funcione correctamente.