Como Encaminhar Parâmetros de Query String Através do Nginx Proxy_Pass?

Publicado 13 de outubro de 2024

Problema: Encaminhamento de Parâmetros de String de Consulta no Nginx

Ao usar o Nginx como proxy reverso, passar parâmetros de string de consulta da requisição original para o servidor backend pode ser complicado. Esse problema frequentemente ocorre ao configurar a diretiva proxy_pass, pois o comportamento padrão pode nem sempre manter esses parâmetros.

Implementando o Encaminhamento de String de Consulta no Proxy_Pass do Nginx

Método 1: Usando um Bloco de Localização Simples

A abordagem do bloco de localização oferece uma maneira de encaminhar parâmetros de string de consulta no Nginx. Este método usa uma diretiva de localização com uma barra no final na declaração proxy_pass.

Passos de configuração:

  1. Abra seu arquivo de configuração do Nginx.
  2. Adicione ou modifique o bloco de localização:
location /service/ {
    proxy_pass http://apache/;
}
  1. A barra no final em proxy_pass http://apache/; informa ao Nginx para substituir /service/ por / ao passar a requisição.
  2. Esta configuração encaminha parâmetros de string de consulta sem modificações extras.

Dica: Testando o Encaminhamento de String de Consulta

Para testar se o encaminhamento de string de consulta está funcionando corretamente, você pode usar uma ferramenta como curl ou as ferramentas de desenvolvedor do seu navegador. Tente acessar uma URL com parâmetros de consulta, como: http://seu-dominio.com/service/page?param1=value1&param2=value2. Verifique se esses parâmetros são corretamente encaminhados para o seu servidor backend.

Método 2: Usando Expressões Regulares com Parâmetros de Consulta

Para cenários complexos, usar expressões regulares com parâmetros de consulta oferece mais flexibilidade.

Passos de configuração:

  1. Abra seu arquivo de configuração do Nginx.
  2. Adicione ou modifique o bloco de localização usando uma regex:
location ~* ^/service/(.*) {
    proxy_pass http://apache/$1$is_args$args;
}
  1. O ~* indica uma correspondência de expressão regular sem distinção entre maiúsculas e minúsculas.
  2. ^/service/(.*) captura tudo após /service/ na URL.
  3. $1 no proxy_pass se refere ao grupo capturado.
  4. $is_args$args adiciona a string de consulta à URL proxiada.

Este método permite mais controle sobre a reescrita de URL enquanto mantém os parâmetros de string de consulta.

Considerações Adicionais para Configuração do Proxy_Pass do Nginx

Preservando Informações da Requisição Original

Ao usar proxy_pass, é importante manter a requisição original intacta. Aqui estão algumas formas de fazer isso:

  1. Use diretivas proxy_set_header:

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    Esses cabeçalhos enviam as informações do cliente original para o servidor backend.

  2. Ative proxy_buffering:

    proxy_buffering on;

    Isso permite que o Nginx armazene em buffer as respostas do servidor backend, melhorando o desempenho.

  3. Defina timeouts:

    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;

    Essas configurações gerenciam os tempos de conexão entre o Nginx e o servidor backend.

Dica: Preserve o Caminho da URL

Para manter o caminho da URL original ao fazer proxy de requisições, use a variável $request_uri:

location /api/ {
    proxy_pass http://backend$request_uri;
}

Isso garante que o caminho completo após /api/ seja enviado para o servidor backend.

Lidando com SSL/TLS em Configurações de Proxy

Para configurações seguras de proxy_pass, considere estas práticas:

  1. Use SSL/TLS para conexões backend:

    server {
    listen 443 ssl;
    server_name example.com;
    
    ssl_certificate /caminho/para/cert.pem;
    ssl_certificate_key /caminho/para/key.pem;
    
    location / {
        proxy_pass https://backend;
        proxy_ssl_verify on;
        proxy_ssl_trusted_certificate /caminho/para/trusted_ca_cert.pem;
    }
    }

    Esta configuração usa HTTPS para a conexão proxy_pass e verifica o certificado do servidor backend.

  2. Defina protocolos e cifras SSL:

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    Essas configurações limitam os protocolos SSL/TLS e cifras a opções seguras.

  3. Ative HSTS (HTTP Strict Transport Security):

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    Este cabeçalho informa aos navegadores para sempre usar HTTPS para o seu domínio.