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
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.
Windows Server 2019+ 1.27.x mainline C:\nginx 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.
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\).
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.
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 -ForceDespué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.
Inicia Nginx en primer plano:
Set-Location "C:\nginx"
.\nginx.exeEl 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.
Detén el proceso manualmente antes de continuar:
.\nginx.exe -s stopUsa -s quit para finalizar de forma elegante (espera a que terminen las conexiones activas) o -s stop para terminar inmediatamente.
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.
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 AllowPor 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.
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 -ForceLa carpeta win64 contiene el binario de 64 bits. Si tu VPS es de 32 bits (raro hoy en día), usa win32.
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.
Inicia el servicio y habilita el autoarranque:
Start-Service Nginx
Get-Service NginxLa columna Status debe mostrar Running. A partir de aquí, Nginx se levanta automáticamente al reiniciar el servidor.
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.
Edita el archivo principal de configuración:
notepad C:\nginx\conf\nginx.confDentro 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.
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.
Valida la configuración antes de recargar:
C:\nginx\nginx.exe -tLa salida esperada es syntax is ok seguida de test is successful. Cualquier error muestra el número exacto de línea.
Recarga Nginx sin tirar el servicio:
C:\nginx\nginx.exe -s reloadEl 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.