Instalação do Nginx no Windows
Para utilizar o Nginx no Windows, basta baixar o pacote de instalação no site oficial, extrair os arquivos e executar o servidor. Endereço para download: http://nginx.org/en/download.html
Após a instalação, os principais comandos para gerenciar o serviço são:
Verificar versão
nginx -v
Iniciar o serviço
start nginx
Encerrar normalmente
nginx -s quit
Forçar parada
nginx -s stop
Recarregar configurações
nginx -s reload
Reabrir arquivos de log
nginx -s reopen
Configuração do Proxy para Jetty
Após realizar o deployment, o próximo passo é configurar o Nginx como proxy para o Jetty. O Nginx ficará ouvindo na porta 80 e o Jetty na porta 8080. A princípio, ao acesssar a aplicação, não seria necessário informar a porta. Porém, durante a navegação nas páginas, a porta 8080 aparece na URL, o que não é desejado.
Para corrigir esse problema, é necessário ajustar o arquivo de configuração do Nginx adicionando os headers adequados:
server {
listen 80;
server_name dominio.com.br;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://192.168.1.100:8080;
}
}
Regras de matching do location
A sintaxe para definição de locations segue o padrão: location [=|~|~*|^~] /uri/ { … }
Tipos de matching:
=: Matches exatos^~: Matches de prefixo (não utiliza regex)~: Regex com distinção de maiúsculas/minúsculas~*: Regex sem distinção de maiúsculas/minúsculas!~e!~*: Negação das regras anteriores/: Match genérico
Ordem de avaliação:
O Nginx avalia as regras na seguinte sequência: primeiro o match exato (=), depois o prefixo (^~), em seguida as expressões regulares na ordem em que aparecem no arquivo, e por último o match genérico (/). Quando uma regra faz match, o processsamento para.
Exemplo prático:
location = / {
# Regra para raiz exata
}
location = /login {
# Página de login
}
location ^~ /assets/ {
# Arquivos estáticos prefixo
}
location ~ \.(gif|jpg|png|js|css)$ {
# Imagens e scripts
}
location ~* \.png$ {
# PNG ignore case
}
location / {
# Regra genérica
}
Resultado das requisições:
http://localhost/→ Regra exata da raizhttp://localhost/login→ Match específicohttp://localhost/assets/style.css→ Prefix matchhttp://localhost/image.jpg→ Regex matchhttp://localhost/document.PNG→ Regex case insensitive
Configurações essenciais para produção:
Três configurações são fundamentais para a maioria dos projetos:
- Redirect para página inicial:
location = / {
proxy_pass http://backend:8080/index
}
- Arquivos estáticos:
location ^~ /static/ {
root /var/www/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /var/www/res/;
}
- Proxy para aplicação:
location / {
proxy_pass http://backend:8080/
}
Sintaxe de Rewriting
Flags disponíveis:
last: Interrompe o processing do location atual e inicia novo lookupbreak: Encerra completamente o rewritingredirect: Retorna HTTP 302 (temporário)permanent: Retorna HTTP 301 (permanente)
Variáveis úteis:
$args: Parâmetros da query string$host: Host da requisição$remote_addr: IP do cliente$request_method: Método HTTP (GET, POST, etc)$request_uri: URI completa com parâmetros$uri: URI atual sem parâmetros$server_name: Nome do servidor$server_port: Porta do servidor
Exemplo de variáveis:
Para http://servidor:8080/app/pagina?param=1:
$host: servidor$server_port: 8080$request_uri: http://servidor:8080/app/pagina?param=1$uri: /app/pagina
Exemplos de Redirect
Redirecionamento de subdiretórios:
# dominio.com/produto/123 → dominio.com/index.php?id=123
if ($host ~* (.*)\.dominio\.com) {
set $subdomain $1;
rewrite ^/produto\/(\d+)\/?$ /index.php?item=$subdomain&id=$1 last;
}
URL amigável:
# /54321/post → /post?id=54321
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
Redirecionamento para usuário com Internet Explorer:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /ie-version/$1 break;
}
Adicionar barra final automaticamente:
if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
Bloquear acesso a arquivos sensíveis:
location ~ /\.ht {
deny all;
}
Bloquear diretórios específicos:
location ~ ^/(cache|temp)/ {
deny all;
break;
}
Configurar expires para assets:
location ~(favicon.ico) {
log_not_found off;
expires 30d;
break;
}
location ~(robots.txt) {
log_not_found off;
expires 7d;
break;
}
Arquivos com cache:
location ^~ /js/ {
access_log off;
root /var/www/public;
expires 600;
break;
}
Anti-hotlinking com redirect:
location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
valid_referers none blocked *.meusite.com.br localhost 192.168.1.50;
if ($invalid_referer) {
rewrite ^/ http://meusite.com.br/proibido.gif;
return 403;
break;
}
access_log off;
root /var/www/public;
expires 7d;
break;
}
Redirect baseado em IP:
root /var/www/html;
allow 192.168.1.10;
allow 10.0.0.0/8;
deny all;
auth_basic "Area Administrativa";
auth_basic_user_file senhas;
SEO - URL antiga para nova:
# /produto-111-222-333.html → /produto/111/222/detalhes_333.html
rewrite ^/produto-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /produto/$1/$2/detalhes_$3.html last;
Mapeamento de diretórios:
# /cidadejob/ → /regiao/cidade/
rewrite ^/([0-9a-z]+)job/(.*)$ /regiao/$1/$2 last;
Tratamento de caminhos sem match:
if (!-e $request_filename) {
proxy_pass http://127.0.0.1;
}
Redirecionamento de domínio:
server {
listen 80;
server_name antigo.com.br;
index index.html index.htm;
root /var/www/antigo;
rewrite ^/ http://novo.com.br/;
access_log off;
}
Múltiplos domínios:
server_name www.novo.com.br novo.com.br;
index index.html index.htm;
root /var/www;
if ($host ~ "novo\.com\.br") {
rewrite ^(.*) http://www.novo.com.br$1 permanent;
}
Subdomínio para domínio principle:
if ($http_host ~* "^(.*)\.app\.meusite\.com$") {
rewrite ^(.*) http://principal.meusite.com$1;
break;
}