Configuração e Gerenciamento do Servidor Web Nginx

Ferramentas Essenciais para Web

Códigos de Status HTTP Comuns

Compreender os códigos de status HTTP é fundamental para diagnosticar problemas e otimizar o desempenho do servidor.

  • 1xx (Informacional): Indica que a solicitação está sendo processada (ex: 100 Continue, 101 Switching Protocols).
  • 2xx (Sucesso): A solicitação foi recebida, entendida e aceita com sucesso (ex: 200 OK).
  • 3xx (Redirecionamento): Indica que o cliente precisa realizar uma ação adicional para completar a solicitação (ex: 301 Moved Permanently, 302 Found).
  • 4xx (Erro do Cliente): A solicitação contém sintaxe incorreta ou não pode ser cumprida (ex: 403 Forbidden, 404 Not Found).
  • 5xx (Erro do Servidor): O servidor falhou em cumprir uma solicitação aparentemente válida (ex: 500 Internal Server Error, 502 Bad Gateway).

Download de Arquivos com wget

O utilitário wget é uma ferramenta poderosa para baixar arquivos da web, com suporte a reinício de downloads interrompidos e controle de taxa de transferência.

# Exemplo: Baixar um arquivo com nome especificado e limitar a velocidade
wget -O nginx-1.24.0.tar.gz --limit-rate=1M 'https://nginx.org/download/nginx-1.24.0.tar.gz'

# Opções comuns:
# -q: Modo silencioso
# -c: Continuar download interrompido
# -P /caminho: Especificar o diretório de destino
# -O nome_arquivo: Especificar o nome do arquivo de saída
# --limit-rate=velocidade: Definir a taxa de transferência (ex: 1M para 1 Megabyte/segundo)

Obtendo Código de Status e IP com curl

O curl é versátil para interagir com servidores web, permitindo verificar respostas e identificar IPs.

# Obter apenas o código de status HTTP
curl -s -I -m10 -o /dev/null -w "%{http_code}" http://10.0.0.31:8080

# Obter o IP remoto do servidor de destino
curl -s -I -m10 -o /dev/null -w "%{remote_ip}" www.baidu.com

# Obter o IP local do cliente
curl -s -I -m10 -o /dev/null -w "%{local_ip}" www.baidu.com

# Opções comuns:
# -s: Modo silencioso
# -I: Realizar um request HEAD (apenas cabeçalhos)
# -m segundos: Definir timeout em segundos
# -o /dev/null: Descartar o corpo da resposta
# -w formato: Especificar o formato de saída (ex: %{http_code}, %{remote_ip})

Instalação e Atualização Suave do Nginx

O Nginx é um servidor web popular, conhecido por sua eficiência e flexibilidade. Ele possui versões Mainline (em desenvolvimento ativo), Stable (mais recente e estável) e Legacy (versões estáveis mais antigas).

O site oficial para download é: http://nginx.org/en/download.html

Instalação Compilada do Nginx

Compilar o Nginx a partir do código-fonte oferece controle total sobre os módulos incluídos.

#!/bin/bash
set -euo pipefail

readonly NGINX_SOURCE_FILE="nginx-1.24.0.tar.gz"
readonly INSTALL_PREFIX="/usr/local/nginx"
readonly SOURCE_DIR="/usr/local/src"
readonly NGINX_USER="nginx"
readonly NGINX_GROUP="nginx"

# Verifica se o arquivo fonte existe
if [ ! -f "${SOURCE_DIR}/${NGINX_SOURCE_FILE}" ]; then
   echo "Erro: Arquivo fonte ${NGINX_SOURCE_FILE} não encontrado em ${SOURCE_DIR}."
   exit 1
fi

# Verifica se o Nginx já está instalado
if [ -d "${INSTALL_PREFIX}/sbin" ]; then
   echo "Erro: Nginx já parece estar instalado em ${INSTALL_PREFIX}."
   exit 1
fi

# Cria diretórios necessários
mkdir -pv "${INSTALL_PREFIX}" "${SOURCE_DIR}"

# Cria usuário e grupo do Nginx, se não existirem
if ! getent group "${NGINX_GROUP}" &>/dev/null; then
   useradd -r -s /sbin/nologin "${NGINX_USER}"
   echo "Usuário e grupo '${NGINX_USER}' criados."
else
   echo "Usuário e grupo '${NGINX_USER}' já existem."
fi

# Instala dependências
echo "Instalando dependências..."
yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel gcc make gcc-c++ # Adicione outras dependências conforme necessário
if [ $? -ne 0 ]; then
   echo "Erro: Falha ao instalar dependências."
   exit 1
fi

# Descompacta e configura o Nginx
echo "Descompactando e compilando Nginx..."
tar xzf "${SOURCE_DIR}/${NGINX_SOURCE_FILE}" -C "${SOURCE_DIR}"
NGINX_DIR=$(basename "${NGINX_SOURCE_FILE}" .tar.gz)
cd "${SOURCE_DIR}/${NGINX_DIR}"

./configure \
   --prefix="${INSTALL_PREFIX}" \
   --user="${NGINX_USER}" \
   --group="${NGINX_GROUP}" \
   --with-http_ssl_module \
   --with-http_v2_module \
   --with-http_realip_module \
   --with-http_stub_status_module \
   --with-http_gzip_static_module \
   --with-pcre \
   --with-stream \
   --with-stream_ssl_module \
   --with-stream_realip_module
   
make -j$(nproc) && make install
if [ $? -ne 0 ]; then
   echo "Erro: Compilação e instalação do Nginx falharam."
   exit 1
fi

# Ajusta permissões
chown -R "${NGINX_USER}:${NGINX_GROUP}" "${INSTALL_PREFIX}"

# Cria link simbólico para o executável
ln -sv "${INSTALL_PREFIX}/sbin/nginx" "/usr/local/sbin/nginx"

# Cria script de inicialização do systemd
cat > /etc/systemd/system/nginx.service <<eof after="network.target" and="" ao="" com="" compilado="" daemon-reload="" description="The" e="" echo="" else="" em="" enable="" eof="" execreload="/bin/kill" execstart="${INSTALL_PREFIX}/sbin/nginx" execstartpre="/bin/rm" exit="" falha="" fi="" habilita="" http="" hup="" if="" inicia="" iniciar="" instalado="" is-active="" killmode="process" killsignal="SIGQUIT" limitnofile="100000" nginx="" nginx.="" nss-lookup.target="" o="" pidfile="${INSTALL_PREFIX}/logs/nginx.pid" privatetmp="true" proxy="" recarrega="" remote-fs.target="" reverse="" server="" servi="" start="" sucesso="" systemctl="" systemd="" then="" timeoutstopsec="5" type="forking" wantedby="multi-user.target"></eof>

Comandos úteis do Nginx:

  • nginx -h: Exibe a ajuda.
  • nginx -t: Testa a sintaxe dos arquivos de configuração.
  • nginx -s reload: Recarrega a configuração sem interromper os processos em execução.
  • nginx -s stop: Fecha graciosamente todos os processos.
  • nginx -s quit: Fecha graciosamente o processo master e os workers.
  • nginx -s reopen: Reabre os arquivos de log.

Atualização Suave do Nginx

A atualização suave permite atualizar o binário do Nginx sem interromper as conexões existentes. O processo envolve compilar a nova versão com os mesmos argumentos de configuração da versão antiga e, em seguida, sinalizar os processos do Nginx para substituírem os antigos gradualmente.

  1. Verifique os argumentos de configuração da versão atual: nginx -V.
  2. Compile a nova versão do Nginx usando os mesmos argumentos.
  3. Execute make (sem make install) para gerar o novo binário na pasta objs/.
  4. Faça backup do binário antigo: cp /usr/local/nginx/sbin/nginx /opt/nginx.old.
  5. Substitua o binário antigo pelo novo: cp objs/nginx /usr/local/nginx/sbin/nginx -f.
  6. Teste a configuração: nginx -t.
  7. Envie o sinal USR2 para o processo master antigo: kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid). Isso iniciará uma nova instância do Nginx com o novo binário.
  8. Envie o sinal WINCH para o processo master antigo para que seus workers processem as conexões existentes e depois terminem: kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin).
  9. Após um período de teste e confirmação de que a nova versão está funcionando corretamente, envie o sinal QUIT para o processo master antigo para encerrá-lo: kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin).

Para reverter a atualização, envie o sinal HUP para o processo master antigo (kill -HUP $(cat /usr/local/nginx/logs/nginx.pid.oldbin)) e o sinal QUIT para o novo processo master (kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid)).

Módulos Principais do Nginx

Configuração Principal (nginx.conf)

O arquivo nginx.conf contém configurações globais, de eventos e de HTTP. É comum incluir arquivos de configuração adicionais a partir de diretórios como conf.d/.

# Exemplo de estrutura básica do nginx.conf
worker_processes auto; # Define o número de worker processes (auto ou número de CPUs)

events {
   worker_connections 1024; # Define o número máximo de conexões por worker process
   use epoll;              # Utiliza epoll para I/O multiplexing
}

http {
   include       mime.types; # Inclui tipos MIME
   default_type  application/octet-stream; # Tipo de conteúdo padrão

   sendfile        on;       # Otimiza transferência de arquivos
   keepalive_timeout  65;    # Tempo limite para conexões keep-alive

   # Inclui configurações de sites virtuais
   include /usr/local/nginx/conf/conf.d/*.conf;

   server {
       listen       80;
       server_name  localhost;

       location / {
           root   html;
           index  index.html index.htm;
       }

       error_page   500 502 503 504  /50x.html;
       location = /50x.html {
           root   html;
       }
   }
}

Configurações Globais

  • user: Define o usuário e grupo sob os quais os worker processes rodarão.
  • worker_processes: Número de worker processes. 'auto' ajusta com base nos núcleos da CPU.
  • worker_cpu_affinity: Permite vincular worker processes a CPUs específicas.
  • error_log: Define o caminho e o nível de severidade do log de erros (debug, info, notice, warn, error, crit, alert, emerg).
  • worker_priority: Define a prioridade do worker process (nice value).
  • worker_rlimit_nofile: Limita o número de arquivos que um worker process pode abrir.

Configurações de Eventos (events block)

  • worker_connections: Número máximo de conexões simultâneas que um worker process pode gerenciar.
  • use: Método de I/O multiplexing a ser utilizado (ex: epoll, kqueue, select).
  • accept_mutex: Habilita um mutex para serializar aceitação de novas conexões entre workers.
  • multi_accept: Permite que um worker aceite múltiplas conexões de uma vez.

Teste de Carga com ab (Apache Bench)

O ab é uma ferramenta para medir o desempenho de servidores web.

# Aumentar o limite de arquivos abertos pelo processo
ulimit -n 102400

# Executar teste de carga com 800 conexões concorrentes e 10000 requisições totais
ab -c 800 -n 10000 http://10.0.0.41/

# Analisar a saída para "Failed requests" para identificar problemas.

Módulos Comuns do Nginx

Configuração HTTP (http block)

Dentro do bloco http, definem-se os server blocks para hospedar múltiplos sites ou configurar diferentes aspectos do servidor web.

Configuração de Virtual Hosts

# Arquivo: /usr/local/nginx/conf/conf.d/meusite.conf
server {
   listen 80; # Porta de escuta
   server_name www.meudominio.com; # Nome do domínio
   root /var/www/meudominio/html; # Diretório raiz dos arquivos do site
   index index.html index.htm; # Arquivos de índice padrão

   location / {
       try_files $uri $uri/ /index.html; # Tenta servir o arquivo, depois o diretório, ou o index.html
   }
}

Configurando Múltiplos Sites (Desktop e Mobile)

# Arquivo: /usr/local/nginx/conf/conf.d/desktop.conf
server {
   listen 80 default_server; # O primeiro server com listen 80 default_server será o padrão
   server_name desktop.meudominio.com;
   root /var/www/desktop/html;
}

# Arquivo: /usr/local/nginx/conf/conf.d/mobile.conf
server {
   listen 80;
   server_name mobile.meudominio.com;
   root /var/www/mobile/html;
}

Redirecionamento de Erro 404 com location

server {
   listen 80 default_server;
   server_name site.com;
   root /var/www/site/html;

   error_page 404 = @custom_404; # Redireciona erro 404 para o named location @custom_404

   location / {
       index index.html;
   }

   location @custom_404 {
       return 200 'Página não encontrada.'; # Retorna uma mensagem personalizada
       add_header Content-Type text/plain;
   }
}

Controle de Acesso por IP (allow/deny)

Restringe o acesso a determinados locais com base no endereço IP do cliente.

server {
   listen 80;
   server_name admin.site.com;
   root /var/www/admin/html;

   location /login {
       allow 192.168.1.100; # Permite acesso do IP específico
       deny all;           # Nega acesso de todos os outros IPs
   }
}

Redirecionamento com try\_files

O try\_files verifica a existência de arquivos ou diretórios em uma ordem específica e, se nenhum for encontrado, redireciona para um URI padrão.

server {
   listen 80;
   server_name app.com;
   root /var/www/app/public;

   # Tenta servir $uri, depois $uri.html, depois o diretório $uri/, e se nada funcionar, redireciona para /default.html
   try_files $uri $uri.html $uri/ /default.html;
}

Página de Status do Nginx (stub\_status)

Exibe métricas de desempenho do Nginx.

server {
   listen 80;
   server_name status.com;

   location /nginx_status {
       stub_status;
       allow 192.168.1.0/24; # Permite acesso da rede interna
       deny all;
   }
}

HTTPS e Módulo rewrite

Configuração Básica de HTTPS

Para habilitar HTTPS, configure a porta 443 com certificados SSL/TLS.

server {
   listen 80; # Listener para HTTP
   listen 443 ssl http2; # Listener para HTTPS com HTTP/2
   server_name www.example.com;

   ssl_certificate /etc/nginx/ssl/www.example.com.crt; # Caminho para o certificado público
   ssl_certificate_key /etc/nginx/ssl/www.example.com.key; # Caminho para a chave privada

   ssl_session_cache shared:sslcache:20m; # Cache de sessão SSL
   ssl_session_timeout 10m;              # Tempo de expiração do cache

   # ... outras configurações do server ...
}

O módulo ngx_http_rewrite_module, que depende da biblioteca PCRE, é usado para reescrita de URLs.

Redirecionamento de HTTP para HTTPS com return

server {
   listen 80;
   listen 443 ssl http2;
   server_name www.example.com;

   ssl_certificate /etc/nginx/ssl/www.example.com.crt;
   ssl_certificate_key /etc/nginx/ssl/www.example.com.key;

   if ($scheme = http) {
       return 301 https://$server_name$request_uri; # Redireciona permanentemente HTTP para HTTPS
   }

   # ... outras configurações ...
}

Redirecionamento para Manutenção

Utilize if e rewrite para redirecionar temporariamente o tráfego durante a manutenção.

server {
   listen 80 default_server;
   server_name maintenance.com;

   set $maintenance_mode 0;
   if ($remote_addr = 192.168.1.50) { # Permite acesso de um IP específico
       set $maintenance_mode 1;
   }

   if ($maintenance_mode = 0) {
       rewrite ^(.*)$ /maintenance.html break; # Redireciona outros IPs para a página de manutenção
   }

   location / {
       root /var/www/maintenance/html;
       index index.html;
   }
}

Prevenção de Hotlinking com valid\_referers

Impede que outros sites usem seus recursos (imagens, arquivos) diretamente, verificando o cabeçalho Referer.

server {
   # ... outras configurações ...

   # Define os referers permitidos
   valid_referers none blocked *.example.com google.com baidu.com;

   # Se o referer não estiver na lista permitida, retorna 403 Forbidden
   if ($invalid_referer) {
       return 403 "Access Denied";
   }

   location /images/ {
       root /var/www/assets;
   }
}

Tags: nginx web server HTTP HTTPS ssl

Publicado em 7-27 08:28