Instalar y configurar un proxy inverso con Nginx en Ubuntu 18.04

Aprendemos qué es y cómo se instala un proxy inverso con Nginx en una distribución Ubuntu 18.04. Este artículo es complementario al de la entrada sobre la instalación y configuración de Icecast

Proxy inverso con Nginx en Ubuntu 18.04

Simplificando podemos decir, que un proxy inverso es un tipo de servidor proxy, que recupera recursos en nombre de un cliente desde uno o más servidores. Esto es, en mi caso me va a servir para que los usuarios, al querer conectarse al servidor Icecast que utiliza el puerto 8000, no tengan que escribir el número del puerto y puedan utilizar una dirección web amigable.

Derechos CC 0 (https://es.wikipedia.org/wiki/Proxy_inverso#/media/Archivo:Reverse_proxy_h2g2bob.svg)

Pero es mucho más, podemos:

  • Balanceo de carga: permite distribuir el tráfico entrante en varios recursos del servidor para mejorar el rendimiento.
  • Acelera la web: comprime los datos entrantes y salientes, así como la caché de contenido comúnmente solicitada para acelerar el flujo de tráfico.
  • Seguridad: permite proteger las identidades de las máquinas de la parte de «back-end». Podemos configurar SSL para servir nuestra aplicación web a través de HTTPS

Un proxy inverso también es muy utilizado para trabajar con servidores Java o para contenedores con Docker. De hecho, tiene un gran número de usos.

Instalar un servidor web Nginx

Realizar la instalación del web Nginx es realmente en sencillo, solo hemos de actualizar los repositorios y utilizar APT para instalar el paquete:

  1. sudo apt update
  2. sudo apt install nginx

Para operar con el servidor, esto es, operaciones de inicio, parada y recarga, escribí la siguiente entrada:

Arranque y parada de un servidor web NGINX en Linux

Configuramos la ruta

Debemos añadir la configuración del host virtual, para ello creamos el siguiente fichero:

  1. sudo vi /etc/nginx/sites-available/radio.bitsandlinux.com

Con el contenido:

  1. server {
  2.     listen 80;
  3.     listen [::]:80;    
  4.     server_name radio.bitsandlinux.com;   
  5.     location / {
  6.         proxy_pass http://localhost:8000;
  7.         proxy_http_version 1.1;
  8.         proxy_set_header Upgrade $http_upgrade;
  9.         proxy_set_header Connection 'upgrade';
  10.         proxy_set_header Host $host;
  11.         proxy_cache_bypass $http_upgrade;
  12.     }
  13. }

¿Qué hemos hecho?

Indicamos que el el virtual host escucha por el puerto 80, tanto para IPv4 como IPv6. Después indicamos el nombre del servidor. Finalmente viene la parte importante. Indicamos la IP local, en mi caso localhost, ya que la instancia se encuentra en el mismo servidor y el puerto utilizado.

Una vez editado, guardamos y salimos.

Ahora debemos crear el enlace simbólico a la carpeta /etc/nginx/sites-available, y eliminar el enlace simbólico al fichero “default”, que se incluye con la configuración por defecto.

  1. cd /etc/nginx/sites-enabled/
  2. sudo ln -s /etc/nginx/sites-available/radio.bitsandlinux.com .
  3. sudo rm default

Una vez hecho esto ya podemos reiniciar Nginx:

  1. sudo systemctl restart nginx

Habilitar HTTPS con Lets Encrypt y Certbot

Por último, que no menos importante, habilitamos la conexión HTTPS con Let’s Encrypt utilizando la herramienta Certbot

  1. sudo apt-get install python-certbot-nginx

Una vez hecho esto, solo hemos de utilizar la herramienta:

  1. sudo certbot --nginx

Nos hará una serie de preguntas y al final listará los proyectos web que ha detectado y debemos seleccionar cuál de ellos será al que se le añadirán los certificados. Todo bastante fácil la verdad.

Los paquetes de Certbot vienen con un trabajo cron o un temporizador systemd que renovará los certificados automáticamente antes de que caduquen. No necesitararemos ejecutar Certbot nuevamente, a menos que cambiemos su configuración. Puede probar la renovación automática de los certificados ejecutando este comando:

  1. sudo certbot renew --dry-run

La herramienta añadira la tarea programada en algún de los siguientes lugares:

  1. /etc/crontab/
  2. /etc/cron.*/*
  3. systemctl list-timers

Podemos comprobar el certificado desde la siguiente URL: https://www.ssllabs.com/ssltest/

En mi caso:

Comprobación de certificado SSL

Y esto es todo. Espero que la entrada os pueda ser útil en algún momento.

Fuentes consultadas

Guide: Set up a reverse proxy using nginx on Linux
Certbot Instructions for Ubuntu and Nginx