WordPress com HTTPS no Nginx (Let's Encrypt)

Configurar HTTPS no WordPress com Nginx e Let's Encrypt na VPS envolve três passos: gerar o certificado via Certbot, atualizar o bloco server do Nginx para escutar em 443, e configurar o redirect permanente de HTTP para HTTPS. O processo leva menos de 5 minutos e o certificado se renova automaticamente.

Pré-requisito: domínio apontando para a VPS

O Let's Encrypt valida que você controla o domínio verificando um arquivo na porta 80. O DNS deve estar resolvendo para o IP da VPS antes de continuar:

bash
# Verificar resolução DNS (aguardar propagação se acabou de configurar)
dig +short seudominio.com.br
nslookup seudominio.com.br

# Confirmar que a porta 80 está acessível
curl -I http://seudominio.com.br

Gerar o certificado com Certbot

Com o stack WordPress rodando (Nginx na porta 80), execute o Certbot via Docker usando o método webroot:

bash
cd /opt/wordpress

# Certbot com método webroot
docker compose run --rm certbot certonly \
  --webroot \
  --webroot-path=/var/www/certbot \
  --email seu@email.com \
  --agree-tos \
  --no-eff-email \
  -d seudominio.com.br \
  -d www.seudominio.com.br

# Verificar certificado gerado
ls /var/lib/docker/volumes/wordpress_certbot_conf/_data/live/seudominio.com.br/

Atualizar o Nginx para HTTPS

Após gerar o certificado, atualize o nginx.conf para aceitar HTTPS e redirecionar HTTP:

nginx
# Bloco HTTP — apenas redirect e desafio Certbot
server {
    listen 80;
    server_name seudominio.com.br www.seudominio.com.br;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://seudominio.com.br$request_uri;
    }
}

# Bloco HTTPS
server {
    listen 443 ssl;
    http2 on;
    server_name seudominio.com.br www.seudominio.com.br;
    root /var/www/html;
    index index.php;

    ssl_certificate     /etc/letsencrypt/live/seudominio.com.br/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/seudominio.com.br/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;

    add_header Strict-Transport-Security "max-age=63072000" always;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS on;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    client_max_body_size 64M;
}

Recarregar Nginx e corrigir URLs do WordPress

Recarregue o Nginx sem downtime e atualize as URLs do WordPress para HTTPS:

bash
# Recarregar Nginx
docker compose exec nginx nginx -s reload

# Verificar HTTPS
curl -I https://seudominio.com.br

# Atualizar URLs no WordPress via WP-CLI
docker compose exec wordpress wp option update siteurl https://seudominio.com.br --allow-root
docker compose exec wordpress wp option update home https://seudominio.com.br --allow-root

# Substituir URLs antigas no banco (migração HTTP → HTTPS)
docker compose exec wordpress wp search-replace \
  'http://seudominio.com.br' 'https://seudominio.com.br' \
  --allow-root --skip-columns=guid

Renovação automática

Configure a renovação automática do certificado antes que expire (90 dias):

bash
# Crontab do root (crontab -e)
0 3 * * * cd /opt/wordpress && docker compose run --rm certbot renew --quiet && docker compose exec nginx nginx -s reload

# Testar renovação sem aplicar (dry-run)
docker compose run --rm certbot renew --dry-run

Não quer configurar manualmente?

Implante o WordPress em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Sim. Let's Encrypt é uma autoridade certificadora sem fins lucrativos que emite certificados DV (Domain Validated) gratuitos com validade de 90 dias e renovação automática. Não há plano pago, o serviço é 100% gratuito.

Mixed content: há recursos (imagens, CSS, JS) carregando via HTTP dentro da página HTTPS. Instale o plugin Really Simple SSL, ele detecta e corrige mixed content automaticamente. Outra causa: as URLs no banco ainda são HTTP. Execute o search-replace com WP-CLI conforme descrito acima.

Não é obrigatório, mas é recomendado para evitar conteúdo duplicado (SEO). Defina um canonical: ou sempre use www ou sempre sem www. Configure o redirect no Nginx e atualize o siteurl/home no WordPress para o formato escolhido.

Via curl: curl -vI https://seudominio.com.br 2>&1 | grep -E "expire|issuer|subject". Via OpenSSL: echo | openssl s_client -connect seudominio.com.br:443 2>/dev/null | openssl x509 -noout -dates.

Sim. O Nginx Proxy Manager tem uma interface web para configurar hosts, SSL e redirects sem editar arquivos de configuração. Para múltiplos sites na mesma VPS é mais prático. Veja o artigo dedicado ao Nginx Proxy Manager no Docker.