Configurando Nginx como Proxy Reverso para Jetty

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 raiz
  • http://localhost/login → Match específico
  • http://localhost/assets/style.css → Prefix match
  • http://localhost/image.jpg → Regex match
  • http://localhost/document.PNG → Regex case insensitive

Configurações essenciais para produção:

Três configurações são fundamentais para a maioria dos projetos:

  1. Redirect para página inicial:
location = / {
    proxy_pass http://backend:8080/index
}

  1. Arquivos estáticos:
location ^~ /static/ {
    root /var/www/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /var/www/res/;
}

  1. 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 lookup
  • break: Encerra completamente o rewriting
  • redirect: 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:

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;
}

Publicado em 6-26 21:16