Dominando a Configuração do Nginx: Diretivas Essenciais Explicadas
Entenda as diretivas do Nginx que você mais usa: http, server, location, proxy_pass, try_files, gzip, TLS e recarregamentos de serviço.
Dominando a Configuração do Nginx: Diretivas Essenciais Explicadas
A configuração do Nginx fica muito mais fácil quando você entende onde cada diretiva pode ser usada. Se sua regra proxy_pass, root ou try_files estiver no contexto errado, o Nginx pode rejeitar a configuração ou tratar as requisições de forma inesperada.
Este guia aborda as diretivas essenciais que você usará ao servir arquivos estáticos, fazer proxy reverso de uma aplicação, habilitar compressão e recarregar alterações com segurança.
A Estrutura de Configuração do Nginx
Os arquivos de configuração do Nginx geralmente ficam em /etc/nginx/ em pacotes Linux. O arquivo principal é comumente /etc/nginx/nginx.conf, e ele frequentemente inclui arquivos de /etc/nginx/conf.d/. Pacotes Debian e Ubuntu costumam usar sites-available/ e sites-enabled/; muitas outras distribuições não.
A configuração é hierárquica, organizada em blocos ou diretivas. Blocos principais incluem:
events: Configura o processamento de conexões.http: Contém configurações gerais de HTTP e servidores virtuais.server: Define um servidor virtual para uma porta e nome de host.location: Escolhe como tratar URIs de requisição correspondentes.
Diretivas são pares chave-valor que controlam o comportamento do Nginx. Elas podem ser globais ou aninhadas dentro de blocos.
Diretivas Essenciais Explicadas
O Bloco http
O bloco http engloba configurações que se aplicam globalmente ao tráfego HTTP. É aqui que você define configurações comuns para seu servidor web.
include: Esta diretiva permite incluir outros arquivos de configuração, ajudando a modularizar sua configuração. É comumente usada para separar configurações de diferentes sites ou aplicações.http { include mime.types; default_type application/octet-stream; # Incluir configurações de servidor do diretório conf.d include /etc/nginx/conf.d/*.conf; }log_format: Define formatos de log personalizados para logs de acesso e erro do Nginx. Isso é essencial para logging e análise detalhados.http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; # ... outras diretivas http }sendfile: Otimiza transferências de arquivos permitindo que o kernel envie arquivos diretamente do disco para o cliente, ignorando o espaço do usuário. Defina comoonpara desempenho.http { sendfile on; # ... }tcp_nopushetcp_nodelay: Ajustam o comportamento TCP para respostas HTTP.tcp_nopushé comumente usado comsendfilepara otimizar o envio de pacotes, enquantotcp_nodelayajuda a evitar atrasos em conexões keepalive.http { tcp_nopush on; tcp_nodelay on; # ... }
O Bloco server
Cada bloco server define um servidor virtual, permitindo que o Nginx trate requisições para diferentes nomes de domínio ou endereços IP no mesmo servidor.
listen: Especifica o endereço IP e/ou porta na qual o servidor ouvirá por conexões de entrada.server { listen 80; listen [::]:80; server_name example.com www.example.com; # ... }server_name: Define os nomes do servidor. O Nginx usa isso para corresponder ao cabeçalhoHostda requisição de entrada.server { listen 80; server_name mydomain.org *.mydomain.org; # ... }root: Define a raiz do documento. O Nginx constrói o caminho do arquivo anexando a URI da requisição a este diretório.server { listen 80; server_name localhost; root /var/www/html; index index.html index.htm; # ... }index: Especifica o arquivo padrão a ser servido quando um diretório é solicitado.server { # ... index index.html index.htm default.html; # ... }error_page: Define páginas de erro personalizadas para códigos de status HTTP específicos.server { # ... error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; internal; } # ... }
O Bloco location
O bloco location é usado para corresponder URIs de requisição e determinar como o Nginx deve processá-las. É aqui que você configura o roteamento para diferentes partes da sua aplicação.
Correspondência de URIs: Locations podem corresponder a strings exatas, prefixos ou expressões regulares. Correspondências exatas usam
=, expressões regulares usam~ou~*, e prefixos simples correspondem pelo prefixo da URI.location /images/ { # Diretivas para requisições começando com /images/ } location = /favicon.ico { # Correspondência exata para /favicon.ico } location ~ \.php$ { # Correspondência regex para arquivos terminados em .php }proxy_pass: Encaminha requisições para um servidor upstream. Cuidado com a barra no final, pois ela altera como o Nginx reescreve o prefixo correspondido.location /api/ { proxy_pass http://backend-service:8080/; 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; }alias: Mapeia uma location para um caminho no sistema de arquivos sem anexar a URI original completa. É frequentemente usado para ativos estáticos armazenados fora da raiz principal do documento.location /static/ { alias /var/www/app/assets/; }Com
alias, inclua a barra no final tanto na location quanto no caminho para mapeamentos de diretório.aliassubstitui o prefixo da location correspondida pelo caminho do alias, enquantorootanexa a URI ao caminho raiz.try_files: Verifica a existência de arquivos em uma ordem especificada e serve o primeiro encontrado, ou retorna um código/URI especificado.location / { try_files $uri $uri/ /index.html; }Isso é comum para aplicações de página única. Se um arquivo ou diretório solicitado não existir, o Nginx serve
index.htmlpara que o roteador do lado do cliente possa lidar com o caminho.
Diretivas de Segurança e Desempenho
ssl_certificateessl_certificate_key: Essenciais para configurar HTTPS. Essas diretivas apontam para seus arquivos de certificado SSL e chave privada.server { listen 443 ssl; server_name secure.example.com; ssl_certificate /etc/letsencrypt/live/secure.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/secure.example.com/privkey.pem; # ... outras configurações SSL }gzip: Ativa ou desativa a compressão gzip para tipos de resposta selecionados. Frequentemente reduz o tamanho da transferência para ativos de texto, mas evite comprimir arquivos já comprimidos, como a maioria das imagens.http { gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # ... }expires: Controla cabeçalhos de cache para ativos estáticos. Use tempos de cache longos para arquivos com fingerprint, e tempos mais curtos para arquivos que mantêm a mesma URL entre implantações.location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public"; }
Comandos Comuns do Nginx
Para gerenciar o Nginx e aplicar alterações de configuração, você usará frequentemente estes comandos:
Testar configuração: Verifica erros de sintaxe nos arquivos de configuração do Nginx.
sudo nginx -tRecarregar configuração: Recarrega graciosamente a configuração do Nginx sem interromper conexões ativas.
sudo systemctl reload nginx # ou sudo service nginx reloadReiniciar Nginx: Para e depois inicia o serviço Nginx.
sudo systemctl restart nginx # ou sudo service nginx restartVerificar status: Mostra o status atual do serviço Nginx.
sudo systemctl status nginx # ou sudo service nginx status
Um Exemplo Mínimo Funcional
Este exemplo serve uma aplicação de página única do disco e faz proxy de requisições de API para um servidor de aplicação:
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.html;
location /api/ {
proxy_pass http://127.0.0.1:3000/;
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;
}
location / {
try_files $uri $uri/ /index.html;
}
}
Execute sudo nginx -t antes de cada recarregamento. Esse único hábito detecta erros de sintaxe antes que se transformem em indisponibilidade.
Conclusão
A maioria dos erros com o Nginx vem do contexto e do tratamento de caminhos. Coloque configurações gerais de HTTP em http, regras específicas de host em server, roteamento de URI em location, e teste cada alteração com nginx -t antes de recarregar.