Cómo configurar la terminación SSL de Varnish con el servidor web Nginx en Rocky Linux 8

El software de caché Varnish no admite SSL/TLS por defecto. Necesitas software adicional para habilitar el soporte SSL/TLS en Varnish.

La TerminaciónSSL es un método para habilitar SSL/TLS en Varnish. Puedes utilizar Hitch, Nginx o Apache para habilitar la terminación SSL para el acelerador HTTP de Varnish.

El software de terminación SSL se ejecutará en el puerto HTTPS‘443‘ y gestionará todas las peticiones HTTPS de los clientes. Después, todas las peticiones se reenviarán al software de caché de Varnish y, a continuación, se reenviarán al servidor backend de origen.

Requisitos previos

En este artículo, aprenderás a configurar la Terminación SSL de Varnish con el servidor web Nginx.

Antes de empezar, asegúrate de que dispones de los siguientes requisitos:

  • Un servidor Linux con Varnish instalado.
  • Privilegios de root
  • Un nombre de dominio

Para este ejemplo, utilizaremos el servidor Linux Rocky con Varnish instalado encima. Y utilizaremos el nombre de dominio‘ejemplo.io‘.

Ahora vamos a empezar.

Instalación del servidor web Nginx

Si estás utilizando Nginx como backend de Varnish, sáltate este primer paso.

En este primer paso, instalarás Nginx en el sistema Linux.

1. Para una distribución basada en Debian/Ubuntu, ejecuta el comando apt que aparece a continuación para instalar el servidor web Nginx.

sudo apt install nginx -y

2. Para el sistema operativo CentOS/RockyLinux/AlmaLinux, ejecuta el comando DNF de abajo para instalar el servidor web Nginx.

sudo dnf install nginx -y

3. Una vez finalizada la instalación de Nginx, inicia y habilita el servidor web Nginx mediante el siguiente comando.

sudo systemctl enable --now nginx

Si aparece un error, déjalo. Configurarás Nginx en el siguiente paso.

Generar SSL con Certbot

En este paso, instalarás la herramienta cerbot y generarás certificados SSL de Letsencrypt para el dominio«ejemplo.io«.

1. En primer lugar, añade los puertos HTTP y HTTPS al cortafuegos del sistema.

Para sistemas Debian/Ubuntu, ejecuta el siguiente comando ufw para abrir los puertos HTTP y HTTPS.

sudo ufw allow http
sudo ufw allow https
sudo ufw reload

Para sistemas CentOS/RockyLinux/AlmaLinux, ejecuta el comando firewall-cmd que aparece a continuación.

sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

2. A continuación, instala la herramienta certbot utilizando el siguiente comando.

Instala la herramienta certbot en los sistemas Debian/Ubuntu utilizando el siguiente comando apt.

sudo apt install certbot -y

Instala la herramienta certbot en los sistemas CentOS/RockyLinux/AlmaLinux utilizando el comando DNF que aparece a continuación.

sudo dnf install certbot -y

3. Antes de generar el SSL Letsencrypt, detén el servicio Varnish que se ejecuta en el puerto HTTP por defecto.

sudo systemctl stop varnish
sudo systemctl stop nginx

4. Ahora ejecuta el comando certbot que aparece a continuación para generar el SSL Letsencrypt. Y asegúrate de cambiar el nombre de dominio y la dirección de correo electrónico.

sudo certbot certonly --agree-tos --email [email protected] --standalone --preferred-challenges http -d example.io

Una vez finalizado el proceso certbot, tu certificado estará disponible en el directorio‘/etc/letsencrypt/live/DOMAIN.COM/‘.

El certificado‘fullchain.pem’ es tu clave pública SSL, y el‘privkey.pem‘ es tu clave privada SSL.

Configurar el puerto Nginx por defecto

Omite este paso si utilizas el servidor web Nginx como backend para tu acelerador HTTP Varnish.

Si estás utilizando otro servidor web backend, debes configurar el puerto por defecto para Nginx.

1. Edita la configuración por defecto de nginx utilizando el editor nano.

sudo nano /etc/nginx/nginx.conf

En la sección‘servidor {}‘, cambia la opción‘listen‘ al puerto‘8081‘ como se indica a continuación.

....

server {
listen       8081 default_server;
listen       [::]:8081 default_server;

…trim…
}

….

Guarda la configuración y sal.

2. Ahora reinicia el servicio Nginx para aplicar la nueva configuración.

sudo systemctl restart nginx

El servicio Nginx por defecto se ejecuta ahora en el puerto ‘8081‘.

Configurar la terminación SSL con el servidor web Nginx

Para configurar la terminación SSL con Nginx, tienes que crear una nueva configuración de bloques de host/servidor virtual que se ejecutará en el puerto HTTPS ‘443’.

Este host virtual gestiona todas las peticiones HTTPS de los clientes y reenvía todas las peticiones al acelerador HTTP Varnish.

1. Crea una nueva configuración de bloque de servidor Nginx utilizando el siguiente comando.

Si utilizas un sistema basado en Debian/Ubuntu, crea una nueva configuración‘/etc/nginx/sites-available/example.io‘.

sudo nano /etc/nginx/sites-available/example.io

Para el sistema CentOS/RockyLinux/AlmaLinux, crea una nueva configuración ‘/etc/nginx/conf.d/example.conf‘.

sudo nano /etc/nginx/conf.d/example.conf

Copia y pega la siguiente configuración. Y asegúrate de cambiar el nombre de dominio y la ruta de los certificados SSL.

server {
listen 443 ssl http2;
server_name example.io;
ssl_certificate           /etc/letsencrypt/live/exmaple.io/fullchain.pem;
ssl_certificate_key       /etc/letsencrypt/live/example.io/privkey.pem;

ssl_session_cache  builtin:1000  shared:SSL:10m;
ssl_protocols TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;

access_log            /var/log/nginx/example.io_access.log;
error_log             /var/log/nginx/example.io_error.log;

location / {
proxy_pass http://127.0.0.1:80;
proxy_set_header X-Real-IP  $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $host;
}

}

Guarda la configuración y sal.

2. A continuación, para el sistema Debian/Ubuntu, activa la configuración del bloque del servidor utilizando el siguiente comando.

sudo ln -s /etc/nginx/sites-available/example.io /etc/nginx/sites-enabled/

3. Ejecuta ahora el siguiente comando para verificar la configuración de Nginx y, a continuación, reinicia el servicio Nginx para aplicar la nueva configuración.

sudo nginx -t
sudo systemctl restart nginx

4. Ahora verifica el servicio Nginx y el puerto HTTPS‘443‘ utilizando el siguiente comando.

Verifica el estado del servicio Nginx utilizando el siguiente comando systemctl.

sudo systemctl status nginx

Asegúrate de que el servicio Nginx está activo y en ejecución.

Configurar la terminación SSL de Nginx para la caché web de Varnish

Verifica el puerto HTTPS ‘443‘ de tu sistema utilizando el siguiente comando ss.

ss -antpl | grep 443

Asegúrate de que el puerto HTTPS ‘443‘ está en estado‘LISTEN‘.

LISTEN 0      128          0.0.0.0:443        0.0.0.0:*    users:(("nginx",pid=4787,fd=8),("nginx",pid=4786,fd=8),("nginx",pid=4785,fd=8))

Ahora ya has completado la configuración básica de la terminación SSL con el servidor web Nginx.

Automático HTTP a HTTPS con Varnish

En este paso, configurarás Varnish para que redirija automáticamente el protocolo HTTP a HTTPS. Para ello, crea una nueva regla Varnish en la configuración‘default.vcl‘.

1. Edita la configuración de Varnish‘/etc/varnish/default.vcl ‘ utilizando el editor nano.

nano /etc/varnish/default.vcl

2. Copia y pega la siguiente configuración dentro de la opción‘sub vcl_recv { …}‘. Y asegúrate de cambiar el nombre de dominio por tu dominio.

sub vcl_recv {
...trim...

if (client.ip != "127.0.0.1" && req.http.host ~ "example.io") {
set req.http.x-redir = "https://example.io" + req.url;
return(synth(850, ""));
}

...trim...
{

A continuación, añade la siguiente configuración al final de la línea. Esto determinará el método de redirección a HTTP ‘301’.

sub vcl_synth {
    if (resp.status == 850) {
       set resp.http.Location = req.http.x-redir;
       set resp.status = 301;
       return (deliver);
    }
}

Guarda la configuración de varnish y sal.

2. A continuación, reinicia el servicio Varnish para aplicar la nueva configuración mediante el siguiente comando.

sudo systemctl restart varnish

Y habrás completado la redirección automática HTTP y HTTPS mediante la regla Varnish.

Verificar la terminación SSL de Varnish

Para comprobar la terminación SSL de Varnish, puedes utilizar el navegador web o el comando curl.

1. Abre tu navegador web y escribe el nombre de tu dominio en la barra de direcciones. Para este ejemplo, utilizaremos el navegador web Firefox.

http://example.io

Se te redirigirá automáticamente al protocolo HTTPS.

Haz clic con el botón derecho del ratón en la página web y haz clic en el menú«Inspeccionar«.

Desplázate a la pestaña«Red» y haz clic en el botón«Recargar«.

Haz clic en la solicitud de la URL raíz y verás un resultado similar al siguiente.

Verificar barniz SSL/TLS

La petición a http://example.io se redirige automáticamente al protocolo HTTPS https://example.io con el código de estado‘301‘.

El servidor Varnish gestiona todas las peticiones de los clientes.

2. Para verificar la terminación SSL de Varnish con curl, utiliza el siguiente comando.

curl -I http://example.io

Verás un encabezado HTTP detallado como el que se muestra a continuación.

Verificar varnish SSL TLS

La solicitud se redirige al protocolo HTTPS ‘https://example.io’ con el código de estado HTTP‘301‘. El servidor varnish gestiona todas las peticiones de los clientes.

Conclusión

¡Enhorabuena! Has aprendido la configuración de Varnish SSL Termination con el servidor web Nginx.

Además, has aprendido el comando básico certbot para generar SSL gratuito Letsencrypt y la regla básica varnish para redirigir automáticamente de HTTP a HTTPS.

Scroll al inicio