Cómo acelerar páginas web estáticas con Varnish Cache Server en Ubuntu 20.04

El autor seleccionó el Fondo de Ayuda COVID-19 para recibir una donación como parte del programa Write for DOnations .
Introducción
Varnish es un proxy HTTP inverso versátil que almacena en caché las respuestas de los servidores backend en la memoria para que se puedan enviar rápidamente cuando se las solicite nuevamente. Utiliza encabezados HTTP para determinar si se deben almacenar en caché las respuestas a una solicitud en particular. De manera predeterminada, no almacena en caché las respuestas con cookies porque se consideran solicitudes específicas del cliente; sin embargo, puede cambiar esta configuración en el archivo de configuración.
Además de actuar como servidor de almacenamiento en caché, Varnish se puede utilizar como:
- Cortafuegos de aplicaciones web
- Defensor de ataques DDoS
- Balanceador de carga
- Solución rápida para backends inestables
- Enrutador HTTP
Hay tres ubicaciones donde se puede guardar la caché HTTP:
- Navegador: esta memoria caché se guarda en los navegadores de los usuarios. Es específica del usuario y se puede utilizar para ofrecer contenido en lugar de enviar solicitudes a sitios web.
- Proxy: un proxy es un servidor intermedio que se ubica entre los usuarios y los servidores. Generalmente, lo implementan los ISP y se puede utilizar para almacenar en caché las respuestas que solicitarán varios usuarios.
- Proxy inverso: este tipo de proxy lo crea el administrador del sitio web y se puede utilizar para ofrecer contenido desde el borde de la red en lugar de enviar solicitudes a servidores back-end. Este es el tipo de caché que creará en este tutorial.
Nota: Para obtener más información sobre el almacenamiento en caché HTTP, consulte este tutorial sobre encabezados HTTP y estrategias de almacenamiento en caché .
En este tutorial, configurará Varnish como un servidor proxy inverso de almacenamiento en caché. Luego, probará la configuración con Varnish frente a una configuración sin almacenamiento en caché mediante wrk .
Prerrequisitos
Para completar este tutorial, necesitarás:
- Un servidor Ubuntu 20.04 con al menos 2 GB de RAM
- Un usuario no root con privilegios sudo como se describe en esta guía de configuración inicial del servidor Ubuntu 20.04
Paso 1: Instalación de Varnish y Apache
Para comenzar, deberá instalar Apache y Varnish. Primero apt-get
, actualice y luego instale Apache con estos comandos:
- sudo apt-get update
- sudo apt-get install apache2 -y
Verá un resultado que indica que se está instalando Apache.
Una vez completado el proceso de instalación de Apache, instale Varnish con este comando:
- sudo apt-get install varnish -y
Verá un resultado que indica que se está instalando Varnish.
A continuación, asegúrese de que ambos paquetes se hayan instalado correctamente. En primer lugar, utilice este comando para comprobar el estado de Apache:
- sudo systemctl status apache2
El resultado será similar a esto:
Outputroot@ubuntu-s-1vcpu-2gb-fra1-01:~# sudo systemctl status apache2● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-08-04 18:58:39 UTC; 4min 10s ago Docs: https://httpd.apache.org/docs/2.4/ Main PID: 2279 (apache2) Tasks: 55 (limit: 2344) Memory: 5.0M CGroup: /system.slice/apache2.service ├─2279 /usr/sbin/apache2 -k start ├─2281 /usr/sbin/apache2 -k start └─2282 /usr/sbin/apache2 -k startAug 04 18:58:39 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Starting The Apache HTTP Server...Aug 04 18:58:39 ubuntu-s-1vcpu-2gb-fra1-01 apachectl[2278]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' diAug 04 18:58:39 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Started The Apache HTTP Server.
Pulse la Q
tecla para salir del status
comando.
A continuación, verifique el estado de Varnish con este comando:
- sudo systemctl status varnish
El resultado será similar a esto:
Outputroot@ubuntu-s-1vcpu-2gb-fra1-01:~# sudo systemctl status varnish● varnish.service - Varnish HTTP accelerator Loaded: loaded (/lib/systemd/system/varnish.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-08-04 18:59:09 UTC; 4min 41s ago Docs: https://www.varnish-cache.org/docs/6.1/ man:varnishd Main PID: 3423 (varnishd) Tasks: 217 (limit: 2344) Memory: 10.7M CGroup: /system.slice/varnish.service ├─3423 /usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m └─3447 /usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256mAug 04 18:59:09 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Started Varnish HTTP accelerator.Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Debug: Version: varnish-6.2.1 revision 9f8588e4ab785244e06c3446fe09bf9db5dd8753Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Version: varnish-6.2.1 revision 9f8588e4ab785244e06c3446fe09bf9db5dd8753Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Debug: Platform: Linux,5.4.0-73-generic,x86_64,-junix,-smalloc,-sdefault,-hcritbitAug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Platform: Linux,5.4.0-73-generic,x86_64,-junix,-smalloc,-sdefault,-hcritbitAug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Debug: Child (3447) StartedAug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Child (3447) StartedAug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Info: Child (3447) said Child startsAug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Child (3447) said Child starts
Si no ve ambos servicios en funcionamiento, espere unos minutos hasta que estén completamente cargados y manténgalos en funcionamiento.
Ahora que tiene Apache2 Varnish instalado, le dará a Varnish algo para servir, en este caso la página web estática de Apache.
Paso 2: Configuración de Varnish para servir la página web estática de Apache
En el paso anterior, instalaste Varnish y, a continuación, tendrás que configurarlo. De forma predeterminada, Varnish escucha en el puerto 6081 y se conecta a un servidor web local en el puerto 8080. Cambiarás eso para servir el sitio estático Apache desde el servidor Apache.
Primero, cambiará el puerto de escucha de Varnish a 8080. Por lo general, querrá que el puerto de escucha sea 80, pero como está ejecutando Apache y Varnish en el mismo servidor, usará el puerto 8080 para Varnish y el puerto 80 para Apache.
No existe una opción de configuración para cambiar el puerto de escucha de Varnish, por lo que lo harás mediante la línea de comandos. Crearás un archivo llamado customexec.conf
en un nuevo directorio llamado varnish.service.d
en /etc/systemd/system/
que cambiará los puertos predeterminados.
Utilice el mkdir
comando para crear el nuevo directorio:
- sudo mkdir /etc/systemd/system/varnish.service.d
Utilice su editor de texto favorito para crear un nuevo archivo llamado customexec.conf
:
- sudo nano /etc/systemd/system/varnish.service.d/customexec.conf
En customexec.conf
, agregue el siguiente contenido:
/etc/systemd/system/varnish.service.d/customexec.conf file[Service]ExecStart=ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :8080 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
En este archivo, se modifica la Service
sección de configuración de Varnish. Primero se elimina el valor anterior de la ExecStart
opción y luego se le asigna un valor nuevo.
El nuevo valor especifica el archivo binario utilizado para ejecutar Varnish con las siguientes opciones:
-
-j
: Especifica el mecanismo de encarcelamiento que se utilizará. Los encarcelamientos de Varnish se utilizan para reducir los permisos del proceso de Varnish en varios métodos específicos de la plataforma. Aquí se utiliza elunix
mecanismo y el usuariovcache
para limitar los permisos. Esta es la opción predeterminada para Varnish en los sistemas Ubuntu. -
-F
:Indica que el servidor debe ejecutarse en primer plano, porquesystemd
espera que el proceso principal siga ejecutándose para poder rastrearlo y no bifurcar un nuevo proceso y morir. -
-a
: Esta bandera se utiliza para especificar la dirección IP y el puerto para aceptar conexiones de clientes. La IP en este caso está vacía, lo que significa que el servidor aceptará todas las IP. El puerto está configurado en8080
. -
-T
:Esta bandera especifica la dirección IP y el puerto para la interfaz de administración, en este casolocalhost
y puerto6082
. -
-f
: Esta bandera especifica el archivo VCL predeterminado para la configuración de Varnish. Editarás este archivo más adelante en este tutorial para configurar Varnish para que se conecte al servidor Apache. -
-S
: Esta bandera especifica un archivo secreto compartido para autorizar el acceso a la interfaz de administración. El/etc/varnish/secret
valor es el predeterminado para Varnish en Ubuntu. No utilizará el archivo secreto en este tutorial. -
-s
: Esta bandera indica dónde y cómo almacenar objetos. El valormalloc,256m
es el predeterminado para Vanish. Significa almacenar varios objetos Varnish en la memoria usando lamalloc
llamada del sistema y un tamaño máximo de 256 megabytes. Otros valores posibles sondefault
, que se usaumem
cuandomalloc
no está disponible, ofile
, que almacena objetos en un archivo en el disco.
Guarde y cierre el customexec.conf
archivo. Luego ejecute este comando para volver a cargar el systemd
archivo de servicios desde el disco:
- sudo systemctl daemon-reload
Luego reinicie Varnish para que los cambios surtan efecto.
- sudo systemctl restart varnish
No verá ningún resultado de estos dos últimos comandos. Para asegurarse de que Varnish esté escuchando en el puerto 8080, use el netstat
comando para mostrar todos los sockets TCP que escuchan en el servidor.
- sudo netstat -ltnp | grep 8080
Verá un resultado parecido a esto:
Outputtcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 18689/varnishdtcp6 0 0 :::8080 :::* LISTEN 18689/varnishd
Ahora que Varnish se está ejecutando y escuchando en el puerto 8080, debe editar el archivo de configuración predeterminado ubicado en /etc/varnish/default.vcl
:
- sudo nano /etc/varnish/default.vcl
Navegue hasta el backend default
bloque y luego cambie .port
a 80
, como se muestra aquí:
default.vcl file# Default backend definition. Set this to point to your content server.backend default { .host = "127.0.0.1"; .port = "80";}
Guarde y cierre el default.vcl
archivo, luego reinicie Varnish con este comando:
- sudo systemctl restart varnish
Si todo está bien, no habrá ningún resultado. Ábrelo en tu navegador y verás el sitio estático de Apache, abierto con Varnish.http://your_server_ip:8080
Ahora tienes Apache y Varnish ejecutándose juntos en el mismo Droplet, con Apache escuchando el puerto 80 y Varnish el puerto 8080. A continuación, compararás los tiempos de respuesta de ambos servidores utilizando la herramienta wrk.
Paso 3: Prueba del barniz con wrk
wrk es una herramienta de evaluación comparativa HTTP moderna. Está escrita en C y se puede utilizar para realizar pruebas de carga en servidores web con muchas solicitudes por segundo. En este paso, utilizará wrk para ejecutar pruebas con Apache y Varnish y luego comparar los resultados.
Primero, deberá instalar wrk compilándolo desde el código fuente. Comience instalando algunas herramientas de compilación para C y Git, que son necesarias para compilar wrk desde el código fuente:
- sudo apt-get install build-essential libssl-dev git unzip -y
Luego clona el repositorio git para wrk en el wrk
directorio:
- git clone https://github.com/wg/wrk.git wrk
Cambiar a ese nuevo directorio:
- cd wrk
Construya el ejecutable wrk con el make
comando:
- make
Copia wrk al /usr/local/bin
directorio para que puedas acceder a él desde cualquier lugar de tu estructura de directorio:
- sudo cp wrk /usr/local/bin
Ahora que tienes wrk instalado, úsalo para probar la capacidad de respuesta de Apache con este comando:
- wrk -t2 -c1000 -d30s --latency http://server_ip/
Este comando utiliza los siguientes argumentos:
-t2
:Esto significa ejecutar dos hilos.-c1000
:Mantenga abiertas 1000 conexiones HTTP.-d30s
:Ejecute la prueba durante 30 segundos.--latency
:Estadísticas de latencia de impresión.
Espere 30 segundos hasta que finalice la prueba y verá un resultado similar a este:
outputRunning 30s test @ http://68.183.115.151/ 2 threads and 1000 connections Thread Stats Avg Stdev Max +/- Stdev Latency 44.45ms 104.50ms 1.74s 91.20% Req/Sec 8.29k 1.07k 12.40k 71.00% Latency Distribution 50% 11.59ms 75% 22.73ms 90% 116.16ms 99% 494.90ms 494677 requests in 30.04s, 5.15GB read Socket errors: connect 0, read 8369, write 0, timeout 69Requests/sec: 16465.85Transfer/sec: 175.45MB
En esta prueba, la latencia promedio es de 44,45 ms, hubo 494 677 solicitudes en total, 8369 errores de lectura y 69 errores de tiempo de espera. Las cifras exactas variarán en su instalación.
Ahora ejecute la misma prueba nuevamente para el servidor Varnish usando este comando:
- wrk -t2 -c1000 -d30s --latency http://server_ip:8080/
Espere 30 segundos hasta que finalice la prueba y verá un resultado similar a este:
outputRunning 30s test @ http://68.183.115.151:8080/ 2 threads and 1000 connections Thread Stats Avg Stdev Max +/- Stdev Latency 14.41ms 13.70ms 602.49ms 90.05% Req/Sec 6.67k 401.10 8.74k 83.33% Latency Distribution 50% 13.03ms 75% 17.69ms 90% 24.72ms 99% 58.22ms 398346 requests in 30.06s, 4.18GB read Socket errors: connect 0, read 19, write 0, timeout 0Requests/sec: 13253.60Transfer/sec: 142.48MB
El resultado que verá probablemente sea algo diferente, pero la latencia será menor para Varnish que para Apache. En este caso, la latencia promedio es de 14,41 ms, hubo 398 346 solicitudes en total y ningún error.
En estas pruebas, con Apache el tiempo de respuesta promedio fue de 44,45ms con 8.438 errores, mientras que Varnish logró un aumento de velocidad a 14,41ms, y tampoco tuvo errores. Esto se debe a que Varnish almacenó la respuesta en memoria caché y la sirvió para solicitudes posteriores, a diferencia de Apache, que necesita leer del disco casi cada vez que se solicita el recurso.
Conclusión
En este tutorial, configuraste Varnish como un servidor de almacenamiento en caché de proxy inverso para un sitio web estático. Viste cómo usar el almacenamiento en caché HTTP básico para mejorar el rendimiento y usaste wrk para ejecutar pruebas de carga para los servidores Apache y Varnish a fin de comparar los resultados.
Has visto que el servidor de caché de Varnish acelera tu sitio estático al ofrecer contenido desde la memoria principal y no solicitarlo al servidor Apache de back-end cada vez que llega una nueva solicitud. Para obtener más información sobre otros usos de Varnish, consulta la documentación oficial .
Deja una respuesta