Otimização e Proteção contra Hotlinking no Nginx

  1. Ocultar a versão do servidor

A forma mais simples de esconder a versão do Nginx é ativar a diretiva server_tokens no arquivo principal de configuração.

sudo nano /etc/nginx/nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;
}

Reinicie o serviço e confira o cabeçalho de resposta:

sudo systemctl restart nginx
curl -I http://192.168.1.10

Outra alternativa, mais radical, é alterar a identidade do servidor diretamente no código-fonte antes de compilar. Edite src/core/nginx.h:

#define NGINX_VERSION "2.0.0"
#define NGINX_VER     "ServidorWeb/" NGINX_VERSION

cd /tmp/nginx-1.24.0
./configure --prefix=/etc/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && sudo make install

  1. Definir usuário e grupo do processo

Execute o Nginx com um usuário não privilegiado. O processo mestre continua sob root, mas os processos workers rodarão com o usuário configurado.

sudo nano /etc/nginx/nginx.conf

user nginx;

sudo systemctl restart nginx
ps aux | grep nginx

  1. Controlar o cache do cliente

Adicione cabeçalhos de expiração para recursos estáticos e reduza a carga repetitiva no servidor.

server {
    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

    location ~* \.(gif|jpg|jpeg|png|bmp|ico|svg|webp)$ {
        root    /var/www/html;
        expires 24h;
        add_header Cache-Control "public, immutable";
    }
}

  1. Rotacionar logs automaticamente

Crie um script para aruqivar logs diariamente e remover arquivos antigos.

sudo nano /opt/rotacionar_nginx.sh

#!/bin/bash

data_atual=$(date -d "yesterday" +%Y%m%d)
dir_logs="/var/log/nginx"
pid_file="/run/nginx.pid"

[ -d "$dir_logs" ] || mkdir -p "$dir_logs"
mv /var/log/nginx/access.log "$dir_logs/acesso-$data_atual.log"
kill -USR1 $(cat "$pid_file")

find "$dir_logs" -name "acesso-*.log" -mtime +30 -delete

sudo chmod +x /opt/rotacionar_nginx.sh
sudo /opt/rotacionar_nginx.sh

sudo crontab -e
0 2 * * * /opt/rotacionar_nginx.sh

Os principais tempos de arquivo no Linux são: ctime (metadados/permissões), atime (acesso) e mtime (conteúdo).

  1. Ajustar tempos de conexão

Defina timeouts para evitar que conexões ociosas consumam recursos.

http {
    keepalive_timeout   60 120;
    client_header_timeout 30;
    client_body_timeout   30;
    send_timeout          30;
}

O primeiro valor de keepalive_timeout define por quanto segundos a conexão TCP permanece aberta; o segundo valor é enviado no cabeçalho Keep-Alive. client_header_timeout e client_body_timeout limitam o tempo de espera pelo cabeçalho e corpo da requisição.

  1. Ajustar processos workers e conexões

Configure o Nginx para usar um worker por núcleo e aumente o limite de conexões simultâneas.

worker_processes     auto;
worker_cpu_affinity auto;

events {
    worker_connections 4096;
    use                 epoll;
    multi_accept        on;
}

Verifique os recursos do sistema antes de aplicar:

ulimit -n 65535
nproc

  1. Habilitar compressão Gzip

Ative a compressão para diminuir o tráfego de saída e melhorar a experiência do usuário.

http {
    gzip              on;
    gzip_vary         on;
    gzip_min_length   1024;
    gzip_comp_level   5;
    gzip_buffers      16 8k;
    gzip_http_version 1.1;
    gzip_types        text/plain text/css application/json application/javascript
                      text/xml application/xml application/xml+rss image/svg+xml;
}

Após recarregar o Nginx, confirme o cabeçalho Content-Encoding: gzip nas respostas.

  1. Proteger conteúdo contra hotlinking

Use valid_referers para permitir apenas domínios autorizados e bloquear requisições externas a imagens e mídias.

server {
    location ~* \.(jpg|jpeg|png|gif|swf|webp)$ {
        valid_referers none blocked *.exemplo.com exemplo.com;
        if ($invalid_referer) {
            return 403;
            # ou: rewrite ^/ http://www.exemplo.com/proibido.png;
        }
    }
}

Teste e aplique a configuração:

sudo nginx -t
sudo systemctl reload nginx

Se um site externo tentar referenciar a imagem, a requisição será rejeitada com 403.

Tags: nginx Hotlinking gzip caching Linux

Publicado em 8-15 21:47