Un reverse proxy es un servidor que se pone delante de tu aplicación y recibe las peticiones de los usuarios en su lugar, reenviándoselas por dentro. Nginx es el más usado para este papel. La aplicación (Node, Python, PHP…) escucha en un puerto interno como 3000; Nginx escucha en los puertos públicos 80 (HTTP) y 443 (HTTPS) y le pasa el tráfico. Esto aporta cuatro cosas: un único punto de entrada, la posibilidad de servir varias aplicaciones desde un mismo servidor (por dominio o por ruta), HTTPS centralizado (Nginx cifra; la app no se ocupa) y funciones extra como compresión, caché y límites. La configuración mínima es un bloque server con proxy_pass http://localhost:3000; dentro de un location /. Para el HTTPS, la vía estándar y gratuita es Let’s Encrypt con la herramienta Certbot: un comando (certbot --nginx) obtiene el certificado, modifica la configuración de Nginx para servir en 443 y deja una renovación automática (los certificados de Let’s Encrypt duran 90 días y se renuevan solos por una tarea programada). Se completa redirigiendo todo el HTTP a HTTPS para que nadie navegue sin cifrar. El resultado: los usuarios entran por https://tudominio, Nginx termina el cifrado y reenvía en claro a la app en el mismo servidor. Es la forma estándar de publicar una aplicación web con tráfico cifrado sin tocar el código de la aplicación.
Ver índice de contenidos
Qué es un reverse proxy
Un proxy normal (directo) actúa en nombre del cliente. Un reverse proxy actúa en nombre del servidor: se pone delante de una o varias aplicaciones y es a él a quien llegan las peticiones, que él reenvía por dentro a la app correspondiente. El usuario nunca habla directamente con la aplicación; habla con Nginx.
Qué te da poner Nginx delante
Cuatro beneficios que justifican el patrón. Punto de entrada único: un solo lugar donde gestionar dominios, cifrado y reglas. Varios servicios, un servidor: Nginx enruta api.tudominio a un servicio y app.tudominio a otro, o /api a uno y / a otro. HTTPS centralizado: el cifrado se termina en Nginx, así ninguna de tus apps tiene que implementarlo. Y funciones de servidor web: compresión, caché de estáticos, límites de tamaño y de tasa, cabeceras de seguridad. Todo eso, sin tocar el código de la aplicación.
Configurar proxy_pass
La configuración base es un bloque server. Se guarda en /etc/nginx/sites-available/ y se habilita con un enlace en sites-enabled/:
# /etc/nginx/sites-available/tudominio — reverse proxy básico
server {
listen 80;
server_name tudominio.com;
location / {
proxy_pass http://localhost:3000; # la app escucha aquí
proxy_set_header Host $host;
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 $scheme; # la app sabe si vino por HTTPS
}
}
# Probar la sintaxis y recargar sin cortar el servicio:
# sudo nginx -t && sudo systemctl reload nginxproxy_set_header no son opcionalesSin ellas, la aplicación ve todas las peticiones como si vinieran de localhost y por HTTP, porque quien la llama es Nginx desde el propio servidor. X-Real-IP y X-Forwarded-For le pasan la IP real del usuario (clave para logs, límites y geolocalización) y X-Forwarded-Proto le dice que la conexión original fue HTTPS (clave para que la app genere URLs y cookies correctas). Omitirlas causa bugs sutiles: enlaces en http://, bucles de redirección, todos los usuarios con la misma IP. Siempre nginx -t antes de recargar.
Añadir HTTPS con Let’s Encrypt
El cifrado hace falta siempre en producción: sin él, contraseñas y datos viajan en claro. Let’s Encrypt es una autoridad de certificación gratuita, y Certbot automatiza todo el proceso sobre Nginx.
- Requisito previo. Un dominio apuntando (registro DNS) a la IP del servidor, y el puerto 80 accesible.
- Instalar Certbot con el plugin de Nginx (
certbotypython3-certbot-nginx). - Obtener el certificado.
sudo certbot --nginx -d tudominio.com: valida el dominio, obtiene el certificado y edita la config. - Redirigir HTTP a HTTPS. Certbot ofrece hacerlo; acéptalo para que el puerto 80 mande a 443.
- Verificar la renovación.
certbot renew --dry-run: comprueba que la renovación automática funcionará.
A diferencia de un certificado comercial de un año, los de Let’s Encrypt caducan en 90 días por diseño (favorece la automatización y limita el daño de una clave filtrada). Confiar en renovarlo a mano es garantía de que un día el sitio amanecerá con «certificado caducado». Certbot instala automáticamente una tarea programada (systemd timer o cron) que renueva los certificados próximos a vencer; por eso el --dry-run del paso final importa: confirma que esa renovación silenciosa funcionará sola durante años. Para la elección de protocolos y cifrados TLS, conviene partir del generador de configuración de Mozilla.
Errores frecuentes
- Olvidar las cabeceras
proxy_set_header. La app pierde la IP real y el protocolo original; aparecen bugs sutiles. - Recargar sin
nginx -t. Un error de sintaxis puede tumbar el servicio; probar siempre antes. - No redirigir HTTP a HTTPS. Los usuarios pueden seguir navegando sin cifrar por el puerto 80.
- Confiar en renovar el certificado a mano. Dura 90 días; sin renovación automática, caduca y el sitio deja de cargar.
- Exponer el puerto de la app al exterior. La app solo debe escuchar en local; solo Nginx se expone.
- Pedir el certificado sin DNS apuntando. La validación falla si el dominio no resuelve a la IP del servidor.
- Dejar cifrados y protocolos obsoletos. Usar una configuración TLS moderna (por ejemplo, la de Mozilla).
Preguntas frecuentes
¿Qué es un reverse proxy y para qué sirve?
Un reverse proxy es un servidor que se sitúa delante de una o varias aplicaciones y recibe en su nombre las peticiones de los usuarios, para luego reenviarlas internamente a la aplicación que corresponda y devolver la respuesta al usuario. La diferencia con un proxy directo o convencional es importante: un proxy directo actúa en representación del cliente, por ejemplo para que un conjunto de usuarios salga a internet a través de él, mientras que un reverse proxy actúa en representación del servidor, de modo que es él quien recibe el tráfico entrante y las aplicaciones quedan detrás, sin comunicarse directamente con el usuario. Este patrón, del que Nginx es el exponente más usado, aporta varias ventajas muy valiosas. En primer lugar, proporciona un punto de entrada único al sistema, un solo lugar donde gestionar los dominios, el cifrado y las reglas de acceso, lo que simplifica enormemente la administración. En segundo lugar, permite servir varias aplicaciones desde un mismo servidor, enrutando el tráfico según el dominio o la ruta solicitada, de manera que un mismo servidor puede atender por ejemplo una web principal, una interfaz de administración y una interfaz de programación, cada una gestionada por una aplicación distinta por detrás. En tercer lugar, centraliza el cifrado, ya que el reverse proxy puede encargarse de terminar las conexiones seguras y hablar por dentro con las aplicaciones sin que estas tengan que implementar el cifrado por sí mismas, lo que simplifica su desarrollo. Y en cuarto lugar, añade funciones propias de un servidor web maduro, como la compresión de las respuestas, la caché de contenidos estáticos, los límites de tamaño de las peticiones, la limitación de la tasa de peticiones o la adición de cabeceras de seguridad, todo ello sin necesidad de modificar el código de las aplicaciones. Por estas razones, poner un reverse proxy como Nginx delante de las aplicaciones es una práctica estándar en el despliegue de servicios web, ya que aporta orden, seguridad y flexibilidad.
¿Cómo funciona proxy_pass en Nginx?
La directiva de reenvío de Nginx, conocida como proxy pass, es el elemento central que convierte a Nginx en un reverse proxy, ya que indica hacia dónde debe reenviar Nginx las peticiones que recibe. Su funcionamiento es conceptualmente sencillo: dentro de un bloque de configuración que define cómo se atiende un determinado dominio y una determinada ruta, la directiva de reenvío especifica la dirección interna del servidor de aplicación al que hay que pasar la petición, típicamente la dirección local del propio servidor junto con el puerto en el que la aplicación está escuchando, por ejemplo un puerto interno no expuesto al exterior. De este modo, cuando un usuario accede al sitio, Nginx recibe la petición en el puerto público y, según las reglas de ubicación configuradas, la reenvía a la aplicación correspondiente en su puerto interno, recoge la respuesta de esa aplicación y se la devuelve al usuario, actuando como intermediario. Un aspecto fundamental para que esto funcione correctamente es acompañar la directiva de reenvío de una serie de cabeceras que Nginx debe establecer al reenviar la petición, ya que de lo contrario la aplicación recibiría información incompleta o engañosa sobre el origen de la petición. Entre esas cabeceras están la que transmite el nombre de dominio solicitado, las que transmiten la dirección real del usuario, dado que sin ellas la aplicación vería todas las peticiones como procedentes del propio servidor, y la que informa de si la conexión original del usuario fue cifrada, lo cual es clave para que la aplicación genere correctamente sus enlaces y gestione adecuadamente sus cookies. Omitir estas cabeceras es una fuente habitual de errores sutiles, como que la aplicación registre siempre la misma dirección de origen, genere enlaces sin cifrar o entre en bucles de redirección. Además, es una buena práctica imprescindible comprobar la sintaxis de la configuración antes de aplicarla, mediante el comando de prueba de Nginx, y recargar el servicio de forma que no se interrumpa, de modo que un error de configuración no deje el servidor sin servicio. Con la directiva de reenvío y las cabeceras adecuadas se consigue que la aplicación funcione correctamente detrás del reverse proxy.
¿Cómo consigo un certificado HTTPS gratis?
La forma estándar y gratuita de conseguir un certificado para habilitar conexiones seguras en un sitio web es utilizar Let’s Encrypt, que es una autoridad de certificación sin ánimo de lucro que emite certificados de validación de dominio de forma gratuita y automatizada, junto con una herramienta cliente que gestiona todo el proceso, siendo la más popular la llamada Certbot. El procedimiento habitual sobre un servidor con Nginx es el siguiente. En primer lugar, es imprescindible cumplir un requisito previo: disponer de un nombre de dominio cuyo registro apunte a la dirección del servidor, y que el servidor sea accesible desde internet para que la autoridad pueda verificar que efectivamente controlas ese dominio. A continuación se instala la herramienta cliente junto con su complemento específico para Nginx. Después se ejecuta el comando de obtención del certificado indicando el dominio o dominios que se quieren proteger; la herramienta se comunica con la autoridad, demuestra automáticamente el control del dominio mediante un desafío, obtiene el certificado y, gracias al complemento de Nginx, modifica la configuración del servidor para servir el sitio de forma cifrada en el puerto correspondiente. Durante el proceso, la herramienta suele ofrecer configurar automáticamente la redirección del tráfico sin cifrar hacia la versión cifrada, opción que conviene aceptar para que ningún usuario navegue sin protección. Un punto crucial es que los certificados de Let’s Encrypt tienen una validez corta, de noventa días, por lo que la renovación automática no es opcional sino necesaria; afortunadamente, la herramienta cliente instala automáticamente una tarea programada que se encarga de renovar los certificados próximos a caducar sin intervención manual, y es muy recomendable verificar que esa renovación funcionará correctamente ejecutando una simulación de renovación. De este modo, con unos pocos pasos se obtiene un certificado válido y reconocido por los navegadores, sin coste, y con la garantía de que se renovará solo mientras el servidor y el dominio sigan operativos. Existen otras autoridades y métodos, pero Let’s Encrypt con su herramienta cliente es hoy la opción más sencilla y extendida para cifrar un sitio sin gastar dinero.
¿Por qué los certificados de Let’s Encrypt caducan tan rápido?
Los certificados de Let’s Encrypt tienen una validez de noventa días, mucho más corta que la de los certificados comerciales tradicionales, que solían durar uno o más años, y esta corta duración es una decisión de diseño deliberada que responde a razones de seguridad y de fomento de la automatización. Por el lado de la seguridad, un periodo de validez corto limita el tiempo durante el cual un certificado comprometido, por ejemplo si su clave privada fuera robada o filtrada, podría ser utilizado de forma maliciosa, ya que expiraría pronto; además, reduce la dependencia de los mecanismos de revocación, que históricamente han funcionado de manera imperfecta, porque un certificado que caduca rápido deja de ser un problema en poco tiempo aunque no se revoque explícitamente. Por el lado de la automatización, una validez corta obliga en la práctica a automatizar la renovación, y esa automatización es precisamente lo que hace sostenible y fiable el modelo, ya que elimina el riesgo de olvidos humanos y convierte la gestión de certificados en un proceso desatendido y robusto. La consecuencia práctica de esta corta duración es que la renovación automática deja de ser una comodidad para convertirse en una necesidad: confiar en renovar el certificado manualmente cada noventa días es una receta para que, tarde o temprano, alguien lo olvide y el sitio amanezca un día mostrando un error de certificado caducado, con la consiguiente pérdida de servicio y de confianza de los usuarios. Por fortuna, la herramienta cliente habitual instala automáticamente una tarea programada que revisa periódicamente los certificados y renueva los que están próximos a expirar, de modo que, una vez configurado correctamente, el sistema se mantiene solo durante años sin intervención. Por eso es tan importante, tras obtener el certificado, verificar que la renovación automática funcionará correctamente mediante una simulación, ya que así se confirma que el proceso desatendido operará sin problemas. En resumen, la corta duración de noventa días no es un inconveniente sino una característica pensada para mejorar la seguridad y forzar buenas prácticas de automatización, siempre que se configure adecuadamente la renovación automática.
¿Puedo servir varias aplicaciones con un solo Nginx?
Sí, una de las grandes ventajas de usar Nginx como reverse proxy es precisamente la capacidad de servir varias aplicaciones distintas desde un único servidor y una única instancia de Nginx, enrutando cada petición hacia la aplicación adecuada. Existen dos formas principales de organizar ese enrutamiento, que pueden combinarse. La primera y más habitual es el enrutamiento por dominio o subdominio, en el que Nginx decide a qué aplicación reenviar según el nombre de dominio solicitado por el usuario; por ejemplo, un dominio o subdominio puede dirigirse a la aplicación principal, otro subdominio a una interfaz de administración y otro a una interfaz de programación, cada uno atendido por una aplicación diferente escuchando en su propio puerto interno. Esto se configura definiendo un bloque de servidor por cada nombre de dominio, cada uno con su directiva de reenvío apuntando al puerto interno de la aplicación correspondiente. La segunda forma es el enrutamiento por ruta dentro de un mismo dominio, en el que distintas rutas de la misma dirección se reenvían a aplicaciones distintas; por ejemplo, las peticiones a una ruta que empieza por un determinado prefijo pueden ir a una aplicación de interfaz de programación, mientras que el resto de las peticiones van a la aplicación web principal, todo bajo el mismo dominio. Esto se configura con varios bloques de ubicación dentro de un mismo bloque de servidor, cada uno con su propio destino de reenvío. En ambos casos, el cifrado seguro puede gestionarse de forma centralizada en Nginx para todos los dominios y aplicaciones, obteniendo certificados para cada dominio, lo que simplifica mucho la administración frente a que cada aplicación tuviera que ocuparse de su propio cifrado. Esta capacidad de consolidar múltiples servicios detrás de un único punto de entrada es una de las razones por las que el patrón de reverse proxy resulta tan práctico, ya que permite aprovechar un solo servidor y una sola configuración de cifrado para alojar y publicar de forma ordenada varias aplicaciones, con la flexibilidad de enrutar por dominio, por ruta o por una combinación de ambos según convenga.
¿La aplicación necesita saber que está detrás de Nginx?
En general, una aplicación puede funcionar detrás de Nginx como reverse proxy sin grandes cambios, pero sí conviene que esté configurada para tener en cuenta que hay un intermediario delante, porque de lo contrario pueden aparecer comportamientos incorrectos, especialmente en lo relativo a la dirección real del usuario y al protocolo de la conexión. El motivo es que, cuando Nginx reenvía las peticiones a la aplicación, quien contacta directamente con la aplicación es el propio Nginx desde el mismo servidor, de modo que, si no se toman medidas, la aplicación creería que todas las peticiones provienen de la dirección local y que llegan por una conexión sin cifrar, ya que la comunicación interna entre Nginx y la aplicación suele ser en texto plano dentro del servidor. Para evitarlo, Nginx debe configurarse para añadir ciertas cabeceras al reenviar, que transmiten a la aplicación la dirección real del usuario y el protocolo original de la conexión, es decir, si el usuario accedió de forma cifrada. Pero además, la aplicación o el marco de trabajo sobre el que está construida deben estar configurados para confiar en esas cabeceras y utilizarlas, algo que muchos marcos ofrecen mediante una opción de confianza en el proxy; sin activar esa confianza, la aplicación podría ignorar las cabeceras o, peor aún, aceptarlas de fuentes no fiables, lo que tiene implicaciones de seguridad. Las consecuencias de no configurar bien este aspecto son problemas concretos y a veces desconcertantes, como que todos los registros muestren la misma dirección de origen en lugar de la real de cada usuario, que la limitación por dirección no funcione, que la aplicación genere enlaces o redirecciones sin cifrar aunque el usuario esté navegando de forma segura, o que se produzcan bucles de redirección. Por tanto, aunque la aplicación no necesita ser reescrita para funcionar tras un reverse proxy, sí es recomendable, y a menudo necesario, configurarla para reconocer que opera detrás de un proxy de confianza y para interpretar correctamente las cabeceras que este le envía, de modo que perciba la dirección real del usuario y el protocolo original y se comporte en consecuencia.
Fuentes
Documentación oficial y material de la comunidad consultados para esta guía. Fecha de consulta: 28 de julio de 2026.
Aportes de la comunidad Underc0de
- Underc0de, foro. Sección GNU/Linux. Servidores web y despliegue.
- Underc0de, foro. Sección Desarrollo web. Publicar aplicaciones.
Documentación oficial
- Nginx. NGINX Reverse Proxy. Guía oficial del reverse proxy.
- Let’s Encrypt. Documentation. Certificados TLS gratuitos.
- EFF. Certbot. Cliente que obtiene y renueva certificados.
- Mozilla. SSL Configuration Generator. Configuración TLS recomendada.