Cómo instalar y configurar Nginx en VPS Windows Server

Guía práctica para instalar, configurar como servicio y usar Nginx como reverse proxy o servidor estático en una VPS Windows Server paso a paso.

Nginx se asocia más con entornos Linux, pero existe un binario oficial para Windows que cubre escenarios en los que el servidor debe ejecutarse en ese sistema operativo — normalmente cuando hay un stack mixto con aplicaciones .NET legacy, IIS y servicios modernos coexistiendo en la misma VPS. Funciona bien como reverse proxy para apps Node.js, .NET Core o Java corriendo en puertos internos, y como servidor de archivos estáticos rápido.

Esta guía está dirigida a desarrolladores y administradores que ya hayan aprovisionado una VPS Windows Server (2019, 2022 o 2025) y necesiten poner Nginx en producción como servicio de Windows, con firewall configurado, virtual hosts definidos y reverse proxy funcional. El tiempo medio de ejecución es de 25 a 40 minutos, dependiendo de cuánto personalices los virtual hosts.

La versión Windows de Nginx tiene limitaciones de rendimiento en comparación con la de Linux (no utiliza IOCP de forma optimizada y queda restringida al modelo select), pero para la mayoría de los escenarios de proxy interno o hosting de paneles es más que suficiente.

Prerrequisitos

Prerrequisitos

VPS con Windows Server 2019 o superior, acceso vía RDP con cuenta de administrador, conexión a internet activa y al menos 200 MB libres en C:. Necesitarás abrir PowerShell como administrador en varios momentos.

Sistema Windows Server 2019+
Versión Nginx 1.27.x mainline
Directorio C:\nginx
Puertos por defecto 80, 443

Confirma que tienes acceso administrativo abriendo PowerShell y ejecutando whoami /groups | findstr Administrators. Si la salida lista el grupo, estás listo.

Descargar y extraer Nginx

Esta sección toma el binario oficial y lo organiza en un directorio estable que será referenciado por el servicio.

01

Abre PowerShell como administrador y crea el directorio de instalación:

New-Item -ItemType Directory -Path "C:\nginx" -Force
Set-Location "C:\nginx"

Este directorio albergará el binario, los archivos de configuración y los logs. Mantener todo en C:\nginx simplifica las rutas en nginx.conf y evita problemas con espacios (no uses C:\Program Files\).

02

Descarga la versión estable más reciente de Nginx para Windows:

Invoke-WebRequest -Uri "https://nginx.org/download/nginx-1.27.3.zip" -OutFile "nginx.zip"

Verifica la versión actual en nginx.org/en/download.html antes de ejecutar — la línea mainline (1.27.x) recibe correcciones con más frecuencia. La línea stable (1.26.x) es una alternativa más conservadora para producción.

03

Extrae el archivo y organiza el contenido en la raíz de C:\nginx:

Expand-Archive -Path "nginx.zip" -DestinationPath "C:\nginx-temp"
Move-Item -Path "C:\nginx-temp\nginx-1.27.3\*" -Destination "C:\nginx" -Force
Remove-Item -Path "C:\nginx-temp", "C:\nginx\nginx.zip" -Recurse -Force

Después de esto, C:\nginx debe contener nginx.exe y las carpetas conf, html, logs y temp.

Iniciar Nginx manualmente para validar

Antes de convertirlo en servicio, confirma que el binario se ejecuta correctamente.

04

Inicia Nginx en primer plano:

Set-Location "C:\nginx"
.\nginx.exe

El comando retorna inmediatamente — Nginx queda corriendo en background. Abre el navegador en la propia VPS y accede a http://localhost. La página por defecto “Welcome to nginx!” debe aparecer.

05

Detén el proceso manualmente antes de continuar:

.\nginx.exe -s stop

Usa -s quit para finalizar de forma elegante (espera a que terminen las conexiones activas) o -s stop para terminar inmediatamente.

Conflicto en el puerto 80

Si Nginx falla con “bind() to 0.0.0.0:80 failed”, IIS o el servicio World Wide Web Publishing (W3SVC) está usando el puerto. Detenlo con Stop-Service W3SVC -Force y desactívalo con Set-Service W3SVC -StartupType Disabled si no vas a usar IIS.

Abrir puertos en el firewall de Windows

Windows Defender Firewall bloquea conexiones externas por defecto. Sin este paso, Nginx solo responderá dentro de la VPS.

06

Crea reglas para HTTP y HTTPS:

New-NetFirewallRule -DisplayName "Nginx HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
New-NetFirewallRule -DisplayName "Nginx HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow

Por defecto, esto aplica a todos los perfiles (Dominio, Privado, Público). Si tu VPS está en una red mixta, valida con Get-NetFirewallRule -DisplayName "Nginx*" | Format-List.

Registrar como servicio de Windows con NSSM

nginx.exe no tiene soporte nativo para servicios. NSSM resuelve esto envolviendo el binario en un servicio gestionado.

07

Descarga y extrae NSSM:

Invoke-WebRequest -Uri "https://nssm.cc/release/nssm-2.24.zip" -OutFile "C:\nssm.zip"
Expand-Archive -Path "C:\nssm.zip" -DestinationPath "C:\nssm-temp"
Move-Item -Path "C:\nssm-temp\nssm-2.24\win64\nssm.exe" -Destination "C:\nginx\nssm.exe"
Remove-Item -Path "C:\nssm-temp", "C:\nssm.zip" -Recurse -Force

La carpeta win64 contiene el binario de 64 bits. Si tu VPS es de 32 bits (raro hoy en día), usa win32.

08

Registra el servicio apuntando a nginx.exe:

C:\nginx\nssm.exe install Nginx "C:\nginx\nginx.exe"
C:\nginx\nssm.exe set Nginx AppDirectory "C:\nginx"
C:\nginx\nssm.exe set Nginx Start SERVICE_AUTO_START
C:\nginx\nssm.exe set Nginx AppStdout "C:\nginx\logs\service-stdout.log"
C:\nginx\nssm.exe set Nginx AppStderr "C:\nginx\logs\service-stderr.log"

El parámetro AppDirectory es crítico — sin él, Nginx busca conf/nginx.conf en el directorio equivocado y falla silenciosamente.

09

Inicia el servicio y habilita el autoarranque:

Start-Service Nginx
Get-Service Nginx

La columna Status debe mostrar Running. A partir de aquí, Nginx se levanta automáticamente al reiniciar el servidor.

Reinicio automático ante fallo

Configura NSSM para reiniciar el servicio si cae: C:\nginx\nssm.exe set Nginx AppExit Default Restart y C:\nginx\nssm.exe set Nginx AppRestartDelay 5000. Cinco segundos de retraso evitan un loop de reinicios cuando el error es estructural (configuración rota).

Configurar virtual host y reverse proxy

Aquí defines cómo Nginx sirve tu sitio o hace de proxy a una aplicación corriendo en otro puerto.

10

Edita el archivo principal de configuración:

notepad C:\nginx\conf\nginx.conf

Dentro del bloque http { ... }, agrega un bloque server para hacer reverse proxy a una aplicación corriendo en localhost:3000 (típico para Node.js):

server {
    listen 80;
    server_name app.tudominio.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        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;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Los headers X-Real-IP y X-Forwarded-For preservan la IP real del cliente para la aplicación backend. Las líneas Upgrade y Connection habilitan WebSockets.

11

Para servir archivos estáticos directamente, agrega otro bloque server:

server {
    listen 80;
    server_name static.tudominio.com;
    root C:/sites/static;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~* \.(jpg|jpeg|png|gif|svg|css|js|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Atención al formato de la ruta: dentro de nginx.conf usa barra normal (C:/sites/static), nunca barra invertida. Nginx en Windows interpreta \ como carácter de escape.

12

Valida la configuración antes de recargar:

C:\nginx\nginx.exe -t

La salida esperada es syntax is ok seguida de test is successful. Cualquier error muestra el número exacto de línea.

13

Recarga Nginx sin tirar el servicio:

C:\nginx\nginx.exe -s reload

El proceso master lee el nuevo nginx.conf e inicia workers actualizados, manteniendo los antiguos atendiendo conexiones en curso hasta que finalicen.

Verificación

Confirma que el servicio está activo, escuchando en los puertos correctos y respondiendo externamente.

Get-Service Nginx
netstat -ano | findstr ":80 :443"
Invoke-WebRequest -Uri "http://localhost" -UseBasicParsing | Select-Object StatusCode

La primera línea debe mostrar Running, la segunda lista el nginx.exe (PID) escuchando en los puertos, y la tercera devuelve StatusCode : 200.

Desde una máquina externa, accede a la IP pública de la VPS en el navegador. Si aparece la página por defecto o tu virtual host, el firewall está liberado correctamente. En caso contrario, valida las reglas con Get-NetFirewallRule -DisplayName "Nginx*".

Resolución de problemas

El servicio inicia y se detiene de inmediato

Casi siempre es un error de configuración. Revisa C:\nginx\logs\error.log — habitualmente se trata de una ruta inválida o un puerto ocupado. Ejecuta C:\nginx\nginx.exe -t para validar la sintaxis antes de cualquier reinicio.

El sitio no responde externamente, solo local

Firewall o bind incorrecto. Confirma que listen 80; no está restringido a 127.0.0.1:80 y que la regla de firewall existe para el perfil activo de la red.

Error “could not build server_names_hash”

El nombre de dominio en server_name excede el tamaño del bucket por defecto. Auméntalo dentro de http { ... }:

server_names_hash_bucket_size 128;

Próximos pasos

Con Nginx funcional, el siguiente paso natural es agregar TLS vía Let’s Encrypt (usa win-acme, que es el cliente ACME nativo para Windows), configurar compresión gzip/brotli para mejor rendimiento e implementar rate limiting con limit_req_zone si expones APIs públicas.

Para monitoreo, habilita el módulo stub_status en una ruta interna y consume las métricas con cualquier agente compatible. Logs estructurados en JSON facilitan la ingesta en sistemas de observabilidad.

Si estás llevando este stack a producción, una VPS Windows de Hostini ya viene con licencia Windows Server incluida, IPv4 dedicada y protección DDoS en el borde — sin necesidad de dimensionar tú mismo el filtro de paquetes para tráfico abusivo en el puerto 80.

Preguntas frecuentes

¿Nginx en Windows tiene el mismo rendimiento que en Linux?

No. El binario oficial para Windows usa el modelo select() en lugar del epoll/IOCP optimizado, lo que limita la cantidad de conexiones simultáneas eficientes a algo cercano a 1024. Para tráfico de producción intenso, Nginx en Linux o WSL2 entrega throughput superior. Para reverse proxy interno, panel de administración o sitios estáticos de baja concurrencia, la versión Windows es perfectamente viable.

¿Puedo ejecutar Nginx e IIS en el mismo Windows Server?

Sí, siempre que escuchen en puertos diferentes. El patrón habitual es dejar IIS en 80/443 o moverlo a 8080/8443 y colocar Nginx delante como reverse proxy en los puertos públicos. Usa netstat -ano para confirmar quién está en cada puerto antes de iniciar el segundo servicio.

¿Cómo hago que Nginx inicie automáticamente con Windows?

El ejecutable nginx.exe no es un servicio nativo. La solución estándar es envolverlo con NSSM (Non-Sucking Service Manager) o WinSW, que registra un servicio de Windows apuntando al binario y permite configurar reinicio automático en caso de fallo.

¿Dónde están los logs de Nginx en Windows?

Por defecto en C:\nginx\logs\access.log y error.log. A diferencia de Linux, no hay rotación automática — necesitas configurar una tarea programada que ejecute nginx -s reopen después de mover los archivos, o usar logrotate vía WSL.

¿Cómo recargo la configuración sin tirar el servicio?

Ejecuta nginx -s reload dentro del directorio de instalación. Ese comando hace que el proceso master vuelva a leer nginx.conf e inicie workers nuevos, manteniendo los antiguos atendiendo conexiones en curso hasta que finalicen — cero downtime.

¿Necesito abrir el puerto en el firewall de Windows?

Sí. Windows Defender Firewall bloquea conexiones entrantes por defecto. Crea reglas explícitas para TCP 80 y TCP 443 (o los puertos que utilices), tanto en el perfil público como en el privado si la VPS está en una red mixta.

Temas:
Próximos pasos Cloud Ryzen con NVMe y protección DDoS siempre activa.Pon en producción en un VPS Hostini →
¿Te resultó útil este tutorial?
Hablar por WhatsApp