Como instalar e configurar Nginx em VPS Windows Server
Guia prático para instalar, configurar como serviço e usar Nginx como reverse proxy ou servidor estático em uma VPS Windows Server passo a passo.
O Nginx é mais associado a ambientes Linux, mas existe um binário oficial para Windows que cobre cenários onde o servidor precisa rodar nesse sistema operacional — geralmente quando há uma stack mista de aplicações .NET legadas, IIS e serviços modernos coexistindo na mesma VPS. Funciona bem como reverse proxy para apps Node.js, .NET Core ou Java rodando em portas internas, e como servidor de arquivos estáticos rápido.
Este guia é para desenvolvedores e administradores que já provisionaram uma VPS Windows Server (2019, 2022 ou 2025) e precisam colocar o Nginx em produção como serviço do Windows, com firewall configurado, virtual hosts definidos e reverse proxy funcional. O tempo médio de execução é de 25 a 40 minutos, dependendo de quanto você customiza os virtual hosts.
A versão Windows do Nginx tem limitações de performance comparada à do Linux (não usa IOCP de forma otimizada e fica restrita ao modelo select), mas para a maioria dos cenários de proxy interno ou hosting de painéis ela é mais que suficiente.
Pré-requisitos
VPS com Windows Server 2019 ou superior, acesso via RDP com conta de administrador, conexão de internet ativa e ao menos 200 MB livres em C:. Você precisará abrir o PowerShell como administrador em vários momentos.
Windows Server 2019+ 1.27.x mainline C:\nginx 80, 443 Confirme que você tem acesso administrativo abrindo o PowerShell e rodando whoami /groups | findstr Administrators. Se a saída listar o grupo, você está pronto.
Baixar e extrair o Nginx
Esta seção pega o binário oficial e o organiza em um diretório estável que será referenciado pelo serviço.
Abra o PowerShell como administrador e crie o diretório de instalação:
New-Item -ItemType Directory -Path "C:\nginx" -Force
Set-Location "C:\nginx"Esse diretório vai abrigar o binário, os arquivos de configuração e os logs. Manter tudo em C:\nginx simplifica os caminhos no nginx.conf e evita problemas com espaços (não use C:\Program Files\).
Baixe a versão estável mais recente do Nginx para Windows:
Invoke-WebRequest -Uri "https://nginx.org/download/nginx-1.27.3.zip" -OutFile "nginx.zip"Confira a versão atual em nginx.org/en/download.html antes de rodar — a linha mainline (1.27.x) recebe correções mais frequentes. A linha stable (1.26.x) é uma alternativa mais conservadora para produção.
Extraia o arquivo e organize o conteúdo na raiz 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 -ForceDepois disso, C:\nginx deve conter nginx.exe, as pastas conf, html, logs e temp.
Iniciar o Nginx manualmente para validar
Antes de transformar em serviço, confirme que o binário roda corretamente.
Inicie o Nginx em primeiro plano:
Set-Location "C:\nginx"
.\nginx.exeO comando retorna imediatamente — o Nginx fica rodando em background. Abra o navegador na própria VPS e acesse http://localhost. A página padrão “Welcome to nginx!” deve aparecer.
Pare o processo manualmente antes de seguir:
.\nginx.exe -s stopUse -s quit para encerrar graciosamente (espera conexões ativas terminarem) ou -s stop para encerrar imediatamente.
Se o Nginx falhar com “bind() to 0.0.0.0:80 failed”, o IIS ou o serviço World Wide Web Publishing (W3SVC) está usando a porta. Pare com Stop-Service W3SVC -Force e desabilite com Set-Service W3SVC -StartupType Disabled se não for usar o IIS.
Liberar portas no firewall do Windows
O Windows Defender Firewall bloqueia conexões externas por padrão. Sem esse passo, o Nginx responde só dentro da VPS.
Crie regras para HTTP e 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 padrão, isso aplica a todos os perfis (Domínio, Privado, Público). Se sua VPS está em uma rede mista, valide com Get-NetFirewallRule -DisplayName "Nginx*" | Format-List.
Registrar como serviço do Windows com NSSM
O nginx.exe não tem suporte nativo a serviços. O NSSM resolve isso envolvendo o binário em um serviço gerenciado.
Baixe e extraia o 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 -ForceA pasta win64 contém o binário 64-bit. Se sua VPS é 32-bit (raro hoje), use win32.
Registre o serviço apontando para o 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"O parâmetro AppDirectory é crítico — sem ele, o Nginx procura conf/nginx.conf no diretório errado e falha silenciosamente.
Inicie o serviço e habilite o autostart:
Start-Service Nginx
Get-Service NginxA coluna Status deve mostrar Running. A partir daqui, o Nginx sobe automaticamente ao reiniciar o servidor.
Configure o NSSM para reiniciar o serviço se ele cair: C:\nginx\nssm.exe set Nginx AppExit Default Restart e C:\nginx\nssm.exe set Nginx AppRestartDelay 5000. Cinco segundos de delay evita loop de reinício quando o erro é estrutural (config quebrada).
Configurar virtual host e reverse proxy
Aqui você define como o Nginx serve seu site ou faz proxy para uma aplicação rodando em outra porta.
Edite o arquivo principal de configuração:
notepad C:\nginx\conf\nginx.confDentro do bloco http { ... }, adicione um bloco server para reverse proxy de uma aplicação rodando em localhost:3000 (típico para Node.js):
server {
listen 80;
server_name app.seudominio.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";
}
}Os headers X-Real-IP e X-Forwarded-For preservam o IP real do cliente para a aplicação backend. As linhas Upgrade e Connection habilitam WebSockets.
Para servir arquivos estáticos diretamente, adicione outro bloco server:
server {
listen 80;
server_name static.seudominio.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";
}
}Atenção ao formato do path: dentro do nginx.conf use barra normal (C:/sites/static), nunca barra invertida. O Nginx no Windows interpreta \ como escape.
Valide a configuração antes de recarregar:
C:\nginx\nginx.exe -tA saída esperada é syntax is ok seguida de test is successful. Qualquer erro mostra o número da linha exata.
Recarregue o Nginx sem derrubar o serviço:
C:\nginx\nginx.exe -s reloadO processo master lê o novo nginx.conf e inicia workers atualizados, mantendo os antigos atendendo conexões em andamento até finalizarem.
Verificação
Confirme que o serviço está ativo, escutando nas portas certas e respondendo externamente.
Get-Service Nginx
netstat -ano | findstr ":80 :443"
Invoke-WebRequest -Uri "http://localhost" -UseBasicParsing | Select-Object StatusCode
A primeira linha deve mostrar Running, a segunda lista o nginx.exe (PID) escutando nas portas, e a terceira retorna StatusCode : 200.
De uma máquina externa, acesse o IP público da VPS no navegador. Se a página padrão ou seu virtual host aparecer, o firewall está liberado corretamente. Caso contrário, valide as regras com Get-NetFirewallRule -DisplayName "Nginx*".
Resolução de problemas
Serviço inicia e para imediatamente
Quase sempre é erro de configuração. Cheque C:\nginx\logs\error.log — geralmente é path inválido ou porta ocupada. Rode C:\nginx\nginx.exe -t para validar a sintaxe antes de qualquer reinício.
Site não responde externamente, só local
Firewall ou bind incorreto. Confirme que listen 80; não está restrito a 127.0.0.1:80 e que a regra de firewall existe para o perfil ativo da rede.
Erro “could not build server_names_hash”
O nome de domínio em server_name excede o tamanho do bucket padrão. Aumente dentro do http { ... }:
server_names_hash_bucket_size 128;
Próximos passos
Com o Nginx funcional, o caminho natural é adicionar TLS via Let’s Encrypt (use win-acme, que é o cliente ACME nativo para Windows), configurar compressão gzip/brotli para melhor performance e implementar rate limiting com limit_req_zone se você expõe APIs públicas.
Para monitoramento, habilite o módulo stub_status em uma rota interna e raspe as métricas com qualquer agente compatível. Logs estruturados em JSON facilitam ingestão em sistemas de observabilidade.
Se você está colocando essa stack em produção, uma VPS Windows da Hostini já vem com licença Windows Server inclusa, IPv4 dedicado e proteção DDoS na borda — sem precisar dimensionar você mesmo o filtro de pacotes para tráfego abusivo na porta 80.
Perguntas frequentes
Nginx no Windows tem a mesma performance que no Linux?
Não. O binário oficial para Windows usa o modelo select() em vez de epoll/IOCP otimizado, o que limita a quantidade de conexões simultâneas eficientes a algo em torno de 1024. Para tráfego de produção pesado, o Nginx em Linux ou WSL2 entrega throughput superior. Para reverse proxy interno, painel de admin ou sites estáticos de baixa concorrência, a versão Windows é perfeitamente viável.
Posso rodar Nginx e IIS no mesmo Windows Server?
Sim, desde que escutem em portas diferentes. O padrão é deixar o IIS na 80/443 ou mover ele para 8080/8443 e colocar o Nginx na frente como reverse proxy nas portas públicas. Use netstat -ano para confirmar quem está em cada porta antes de iniciar o segundo serviço.
Como faço o Nginx iniciar automaticamente com o Windows?
O executável nginx.exe não é um serviço nativo. A solução padrão é envolvê-lo com NSSM (Non-Sucking Service Manager) ou WinSW, que registra um serviço do Windows apontando para o binário e permite configurar reinício automático em falha.
Onde ficam os logs do Nginx no Windows?
Por padrão em C:\nginx\logs\access.log e error.log. Diferente do Linux, não há rotação automática — você precisa configurar uma tarefa agendada para rodar nginx -s reopen após mover os arquivos, ou usar logrotate via WSL.
Como recarregar a configuração sem derrubar o serviço?
Execute nginx -s reload dentro do diretório de instalação. Esse comando faz o processo master ler novamente o nginx.conf e iniciar workers novos, mantendo os antigos atendendo conexões em andamento até finalizarem — zero downtime.
Preciso liberar porta no firewall do Windows?
Sim. O Windows Defender Firewall bloqueia conexões de entrada por padrão. Crie regras explícitas para TCP 80 e TCP 443 (ou as portas que você usa), tanto no perfil público quanto no privado se a VPS estiver em rede mista.