Cómo instalar Nginx en Linux y configurar un proxy inverso
¿Qué es Nginx y por qué necesitas un proxy inverso?
Antes de ensuciarnos las manos con la terminal, vamos a poner los conceptos claros. Nginx (se pronuncia "engine-x") es un servidor web de alto rendimiento que, además de servir páginas estáticas, es famoso por su capacidad para funcionar como proxy inverso.
Un proxy inverso es un intermediario entre los clientes (los navegadores de tus usuarios) y tus servidores backend (como Node.js, Python, o incluso otros servidores web). En lugar de que el usuario haga la petición directamente a tu aplicación, la hace al proxy, y este decide a qué servidor interno enviarla.
¿Por qué es esto útil? Porque te permite:
- Ocultar la arquitectura interna: Los usuarios solo ven la IP de Nginx.
- Balancear la carga: Repartir el tráfico entre varios servidores para evitar caídas.
- Terminar SSL/TLS: Manejar los certificados HTTPS en un solo punto.
- Servir contenido estático: Nginx es rapidísimo con imágenes, CSS y JavaScript, liberando a tu aplicación de ese trabajo.
En esta guía, vamos a instalar Nginx en Linux (usaremos Ubuntu/Debian, pero los comandos son muy similares en otras distros) y a configurar un proxy inverso paso a paso. Al final, tendrás un servidor proxy funcionando para redirigir peticiones a una aplicación local.
Requisitos previos
Para seguir este tutorial, necesitas:
- Un servidor o máquina virtual con Linux (Ubuntu 22.04 o 24.04 recomendado).
- Acceso a una terminal con permisos de superusuario (
sudo). - Una aplicación web corriendo en un puerto local (por ejemplo,
http://localhost:3000). Si no tienes una, puedes usar un servicio simple de prueba comopython3 -m http.server 3000.
[INFO] Si estás usando un panel de control como Syspanel (antes conocido como HestiaCP), recuerda que el acceso a su interfaz web es a través del puerto 2106. Sin embargo, para esta guía, trabajaremos directamente con la terminal, ya que es la forma más flexible de configurar Nginx.
Paso 1: Instalar Nginx en Linux
El primer paso es sencillo. Vamos a actualizar los repositorios de paquetes e instalar Nginx.
Abre tu terminal y ejecuta:
sudo apt update
sudo apt install nginx -y
Una vez terminada la instalación, el servicio debería arrancar automáticamente. Verifícalo con:
sudo systemctl status nginx
Deberías ver un mensaje que dice active (running). Si no está activo, inícialo con:
sudo systemctl start nginx
Para que se inicie automáticamente al arrancar el sistema:
sudo systemctl enable nginx
Ahora, abre tu navegador y escribe la IP de tu servidor (o localhost si estás en tu máquina local). Deberías ver la página de bienvenida por defecto de Nginx. ¡Ya tienes Nginx funcionando!
[TIP] Si tienes un firewall (como UFW), necesitas permitir el tráfico HTTP y HTTPS. Ejecuta:
sudo ufw allow 'Nginx Full'
Paso 2: Entender la estructura de archivos de Nginx
Antes de configurar nginx, es crucial entender dónde están los archivos. En Ubuntu/Debian, la estructura es la siguiente:
/etc/nginx/nginx.conf: El archivo de configuración principal./etc/nginx/sites-available/: Aquí se guardan las configuraciones de los sitios o "server blocks". Están desactivadas por defecto./etc/nginx/sites-enabled/: Contiene enlaces simbólicos a los archivos desites-availableque están activos./var/www/html/: El directorio web por defecto.
La lógica es simple: creas un archivo en sites-available, y luego creas un enlace simbólico en sites-enabled para activarlo. Esto te permite tener muchos sitios configurados pero solo activar los que necesites.
Paso 3: Crear un server block (o virtual host)
Un server block es la directiva de Nginx que define cómo responder a las peticiones de un dominio o puerto específico. Vamos a crear uno para nuestro proxy inverso.
Imagina que tienes una aplicación corriendo en el puerto 3000 (por ejemplo, un servidor Node.js). Queremos que cuando alguien visite http://midominio.com, Nginx redirija el tráfico a http://localhost:3000.
Primero, creamos el archivo de configuración:
sudo nano /etc/nginx/sites-available/mi-app
Dentro del archivo, pega lo siguiente:
server {
listen 80;
server_name midominio.com www.midominio.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Vamos a desglosar esto:
- listen 80;: Le dice a Nginx que escuche en el puerto 80 (HTTP).
- server_name: Define el dominio que usará este bloque. Puedes usar
_para capturar cualquier dominio, pero es mejor ser específico. - location /: Esta directiva aplica a todas las peticiones que lleguen a la raíz del sitio.
- proxy_pass: La clave. Aquí le decimos a Nginx a dónde debe enviar las peticiones. En este caso, a
http://localhost:3000. - proxy_set_header: Estas líneas son importantes para que la aplicación backend sepa la IP real del usuario y mantenga conexiones WebSocket si las usa.
[WARNING] Si tu aplicación no usa WebSockets, puedes omitir las líneas de
UpgradeyConnection, pero no hacen daño tenerlas.
Ahora, guardamos el archivo (en nano: Ctrl+O, Enter, Ctrl+X).
Paso 4: Activar el server block
Como mencionamos, debemos crear un enlace simbólico en sites-enabled:
sudo ln -s /etc/nginx/sites-available/mi-app /etc/nginx/sites-enabled/
Para evitar conflictos, es recomendable eliminar el enlace simbólico del sitio por defecto:
sudo rm /etc/nginx/sites-enabled/default
Ahora, probemos la configuración para asegurarnos de que no hay errores de sintaxis:
sudo nginx -t
Si todo está bien, verás un mensaje como syntax is ok y test is successful.
Finalmente, recargamos Nginx para aplicar los cambios:
sudo systemctl reload nginx
Paso 5: Probar el proxy inverso
Para probar, asegúrate de que tu aplicación backend esté corriendo en el puerto 3000. Si no tienes una, puedes usar un simple servidor Python:
python3 -m http.server 3000
Ahora, en tu navegador, visita http://midominio.com (o la IP de tu servidor si estás probando localmente). Deberías ver el contenido de tu aplicación.
Si estás probando desde la misma máquina, puedes usar curl para verificar:
curl -I http://localhost
Deberías obtener una respuesta HTTP/1.1 200 OK o similar.
¡Felicidades, ya tienes un proxy inverso nginx funcionando!
Paso 6: Configuraciones avanzadas (opcional)
Balanceo de carga
Si tienes varias instancias de tu aplicación, puedes usar el bloque upstream para definir un grupo de servidores y repartir la carga.
upstream backend {
server localhost:3000;
server localhost:3001;
server localhost:3002;
}
server {
listen 80;
server_name midominio.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
Nginx repartirá las peticiones entre los tres puertos de forma automática.
Añadir SSL/HTTPS
Para esto, necesitas un certificado. La forma más fácil es con certbot.
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d midominio.com
Certbot modificará automáticamente tu configuración de Nginx para añadir SSL y redirigir el tráfico HTTP a HTTPS.
Paso 7: Solución de problemas comunes
- Error 502 Bad Gateway: Suele significar que Nginx no puede conectarse al backend. Verifica que tu aplicación esté corriendo y que el puerto en
proxy_passsea el correcto. - Error 404 Not Found: Si ves esto, puede ser que el
server_nameno coincida con la URL que escribes. Revisa que el dominio apunte a tu servidor. - Permiso denegado: Asegúrate de que los archivos de configuración tengan permisos de lectura. Ejecuta
sudo chmod 644 /etc/nginx/sites-available/mi-app.
Preguntas frecuentes (FAQ)
¿Cómo desinstalo Nginx si ya no lo necesito?
Puedes eliminarlo con:
sudo apt remove nginx nginx-common
Y si quieres limpiar los archivos de configuración:
sudo apt purge nginx nginx-common
¿Puedo usar Nginx en Windows?
Sí, existe una versión para Windows, pero es menos estable y no recomendada para producción. Esta guía está enfocada en Linux.
¿Qué pasa si tengo otro servidor web como Apache?
Debes detener Apache antes de iniciar Nginx, ya que ambos intentarán usar el puerto 80. Puedes desactivar Apache con sudo systemctl stop apache2 y sudo systemctl disable apache2.
¿Cómo hago que Nginx sirva archivos estáticos directamente?
Puedes añadir una ubicación específica para archivos estáticos en tu server block:
location /static/ {
alias /var/www/mi-app/static/;
}
Esto hará que Nginx sirva los archivos de /static/ directamente, sin pasar por el proxy.
¿Necesito reiniciar Nginx cada vez que cambio la configuración?
No, con sudo systemctl reload nginx es suficiente. Esto recarga la configuración sin cortar las conexiones activas.
Conclusión
Has aprendido a instalar nginx en Linux y a configurar un proxy inverso de principio a fin. Esto es una habilidad fundamental para cualquier administrador de sistemas, ya que te permite gestionar el tráfico de manera eficiente, mejorar la seguridad y escalar tus aplicaciones.
Recuerda que la práctica es clave. Juega con diferentes configuraciones, prueba el balanceo de carga y no tengas miedo de romper algo: siempre puedes volver a cargar la configuración original.
Si usas Syspanel para gestionar tus servidores, recuerda que su interfaz está en el puerto 2106, pero para tareas avanzadas como esta, la terminal te dará mucho más control.
¡Ahora ve y configura tu propio proxy inverso! Tu futuro yo (y tus usuarios) te lo agradecerán.
