Instalar e proteger Nginx no Ubuntu

Configure Nginx, site, UFW, HTTPS, permissões e verificações preservando o acesso remoto.

Instalar e proteger Nginx no Ubuntu

Configure Nginx, site, UFW, HTTPS, permissões e verificações preservando o acesso remoto.

Requisitos e DNS

Use Ubuntu Server atualizado e sudo. Para HTTPS, example.com deve apontar para o IP público. Publique www ou AAAA só quando funcionarem. Mantenha outra sessão SSH e acesso de recuperação; confira A/AAAA com dig.

Instalação e verificação

Instale o pacote Ubuntu e confira serviço, sintaxe e resposta HTTP local. HTTP 200 local não comprova acesso público.

sudo apt update
sudo apt upgrade
sudo apt install nginx
sudo systemctl enable --now nginx
sudo nginx -t
curl -I http://127.0.0.1

Firewall UFW

Antes de ativar UFW, permita a porta SSH real. OpenSSH no exemplo pressupõe perfil padrão; para outra porta use NÚMERO/tcp. Nginx Full abre TCP 80/443. Teste nova sessão SSH sem fechar a primeira. Confira firewall do provedor e IPv6.

sudo ufw status verbose
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status verbose

Diretório e permissões

O exemplo estático pertence ao administrador, grupo www-data, diretórios 750 e arquivos 640. Confira acesso aos diretórios pais. Aplicações dinâmicas exigem regras próprias; evite chown -R indiscriminado e 777.

sudo install -d -o "$USER" -g www-data -m 750 /var/www/example.com/public
printf '%s
' '<!doctype html><title>Example</title><h1>It works</h1>' | tee /var/www/example.com/public/index.html >/dev/null
chmod 640 /var/www/example.com/public/index.html

Bloco HTTP

Crie /etc/nginx/sites-available/example.com. Comece só com example.com; adicione www se DNS e certificado incluírem esse nome. A regra de arquivos ocultos pode afetar /.well-known/: teste o desafio HTTP e deixe o plugin Nginx gerir a exceção ou defina uma location explícita para o desafio.

server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    root /var/www/example.com/public;
    index index.html;
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;
    location / { try_files $uri $uri/ =404; }
    location ~ /\. { deny all; }
}

Ativação e teste

Crie o link se não existir, execute nginx -t antes do reload e teste o Host local. Desative o site padrão somente após confirmar que não atende conteúdo necessário. Corrija falhas antes de recarregar.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo nginx -t && sudo systemctl reload nginx
curl -I -H 'Host: example.com' http://127.0.0.1

Certificado HTTPS

Siga as instruções atuais do Certbot. Snap é suportado; /snap/bin/certbot evita conflito com links existentes. example.com deve ser acessível publicamente na porta 80. O exemplo pede certificado só para esse nome. Certbot pode alterar o bloco; confira redirecionamento, certificado e teste de renovação.

sudo snap install --classic certbot
sudo /snap/bin/certbot --nginx -d example.com
sudo nginx -t && sudo systemctl reload nginx
curl -I https://example.com
sudo /snap/bin/certbot renew --dry-run

Cabeçalhos e limites

server_tokens off oculta a versão, mas não garante segurança. Adapte cabeçalhos à aplicação e confira herança de add_header nas locations. SAMEORIGIN pode bloquear incorporação legítima. 8m é apenas exemplo. Ative HSTS só após testar HTTPS e subdomínios, inicialmente sem preload.

server_tokens off;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
add_header X-Frame-Options SAMEORIGIN always;
client_max_body_size 8m;

Proxy reverso opcional

Substitua a location / estática por este bloco; não duplique a mesma location. Faça o backend escutar em 127.0.0.1:8080 se não for público. Confie em cabeçalhos encaminhados apenas do proxy previsto; teste redirecionamentos, WebSockets e timeouts.

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    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;
}

Manutenção e logs

Atualize sistema e aplicação; avalie unattended-upgrades conforme sua rotina. Confira logs, espaço e nginx -t. 403 pode indicar permissões ou índice ausente; 502, backend indisponível. Teste antes de recarregar.

sudo tail -f /var/log/nginx/example.com.error.log
sudo journalctl -u nginx --since '1 hour ago'
df -h
sudo nginx -t

Verificação final

Confira SSH após UFW, DNS/IPv6, portas públicas, permissões, nginx -t, HTTPS e teste de renovação. Ajuste uploads, cabeçalhos e proxy à aplicação. Salve a configuração e monitore serviços.

Fontes oficiais

Nginx: https://nginx.org/en/docs/ ; Certbot: https://certbot.eff.org/instructions?ws=nginx&os=snap ; UFW: https://documentation.ubuntu.com/server/how-to/security/firewalls/ .

Partilhar

Qual é a sua reação?

Gosto Gosto 0
Não gosto Não gosto 0
Adoro Adoro 0
Divertido Divertido 0
Irritado Irritado 0
Triste Triste 0
Uau Uau 0