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
    Atenção
    Se o domínio ainda não resolve para o IP correto, o Certbot vai falhar com "DNS problem". Aguarde a propagação DNS (pode levar até 24h, normalmente 5–30 min).

    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/
    Dica
    O Certbot cria quatro arquivos: cert.pem (certificado), chain.pem (intermediária), fullchain.pem (cert + chain), privkey.pem (chave privada). O Nginx usa fullchain.pem e privkey.pem.

    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
    Atenção
    Após mudar as URLs no WordPress, limpe o cache do browser e de plugins de cache antes de testar — URLs antigas em cache causam redirect loops.

    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

    $ runstack deploy --plan starter

    Não quer configurar manualmente?

    Não quer configurar manualmente? Implante o WordPress em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.

    Perguntas frequentes