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

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Instalación de Varnish y Apache
  • Paso 2: Configuración de Varnish para servir la página web estática de Apache
  • Paso 3: Prueba del barniz con wrk
  • Conclusión
  • 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:

    1. sudo apt-get update
    2. 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:

    1. 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:

    1. 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 Qtecla para salir del statuscomando.

    A continuación, verifique el estado de Varnish con este comando:

    1. 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.confen un nuevo directorio llamado varnish.service.den /etc/systemd/system/que cambiará los puertos predeterminados.

    Utilice el mkdircomando para crear el nuevo directorio:

    1. sudo mkdir /etc/systemd/system/varnish.service.d

    Utilice su editor de texto favorito para crear un nuevo archivo llamado customexec.conf:

    1. 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 Servicesección de configuración de Varnish. Primero se elimina el valor anterior de la ExecStartopció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 el unixmecanismo y el usuario vcachepara 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, porque systemdespera 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 en 8080.

    • -T:Esta bandera especifica la dirección IP y el puerto para la interfaz de administración, en este caso localhosty puerto 6082.

    • -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/secretvalor 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 valor malloc,256mes el predeterminado para Vanish. Significa almacenar varios objetos Varnish en la memoria usando la mallocllamada del sistema y un tamaño máximo de 256 megabytes. Otros valores posibles son default, que se usa umemcuando mallocno está disponible, o file, que almacena objetos en un archivo en el disco.

    Guarde y cierre el customexec.confarchivo. Luego ejecute este comando para volver a cargar el systemdarchivo de servicios desde el disco:

    1. sudo systemctl daemon-reload

    Luego reinicie Varnish para que los cambios surtan efecto.

    1. 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 netstatcomando para mostrar todos los sockets TCP que escuchan en el servidor.

    1. 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:

    1. sudo nano /etc/varnish/default.vcl

    Navegue hasta el backend defaultbloque y luego cambie .porta 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.vclarchivo, luego reinicie Varnish con este comando:

    1. 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:

    1. sudo apt-get install build-essential libssl-dev git unzip -y

    Luego clona el repositorio git para wrk en el wrkdirectorio:

    1. git clone https://github.com/wg/wrk.git wrk

    Cambiar a ese nuevo directorio:

    1. cd wrk

    Construya el ejecutable wrk con el makecomando:

    1. make

    Copia wrk al /usr/local/bindirectorio para que puedas acceder a él desde cualquier lugar de tu estructura de directorio:

    1. sudo cp wrk /usr/local/bin

    Ahora que tienes wrk instalado, úsalo para probar la capacidad de respuesta de Apache con este comando:

    1. 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:

    1. 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 .

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion