Implantação do WordPress: Docker, Nginx, Apache e SSL

Simplifique o deploy do seu site WordPress com nosso guia fácil de seguir. Use Docker Compose, Nginx, Apache e SSL para um processo de instalação sem problemas.

Também criaremos volumes para que as alterações ou atualizações sejam preservadas durante o reinício do contêiner.

Este setup foi testado no Google Cloud com uma instância executando o sistema operacional Ubuntu 22.04. Você também pode fazer este setup em qualquer serviço de nuvem como AWS, Azure, DigitalOcean, ou em servidores dedicados ou VPS.

Pré-requisitos

  1. Instale o Docker no Ubuntu 22.04
  2. Instale o Docker Compose no Ubuntu 22.04.

Certifique-se de ter completado todos os passos mencionados acima.

  • Domínio apontado para o endereço IP do seu servidor.
  • Docker instalado e configurado.
  • Docker Compose instalado e configurado.

Depois de concluir todos os pré-requisitos, você pode prosseguir para fazer o setup e configurar o WordPress.

Criar Diretório do Projeto

Conecte-se via SSH ao seu servidor e comece criando um novo diretório de projeto chamado wp-project. Você também pode nomeá-lo como desejar.

 
mkdir wp-project

Criar Arquivo Docker Compose YML

Agora, navegue dentro do diretório do projeto e crie um novo arquivo docker-compose.yml com a seguinte configuração.

 
cd wp-project

Crie um novo arquivo docker-compose.yml.

 
nano docker-compose.yml

Copie todo o conteúdo abaixo e cole-o no arquivo.

Configure Docker Compose

Certifique-se de substituir as variáveis de ambiente mencionadas abaixo.

 

docker-compose.ymlversion: "3.9"
services:
    wordpress:
        container_name: wordpress
        image: wordpress:php8.2-apache
        restart: always
        stdin_open: true
        tty: true
        environment:
            WORDPRESS_DB_HOST: mariadb
            WORDPRESS_DB_USER: db_user
            WORDPRESS_DB_PASSWORD: db_user_pass
            WORDPRESS_DB_NAME: db_name
        volumes:
            - wordpress_data:/var/www/html
    mariadb:
        container_name: mariadb
        image: mariadb
        restart: always
        environment:
            MYSQL_DATABASE: db_name
            MYSQL_USER: db_user
            MYSQL_PASSWORD: db_user_pass
            MYSQL_RANDOM_ROOT_PASSWORD: 'root_pass'
        volumes:
            - db_data:/var/lib/mysql
    nginx:
        container_name: nginx
        image: nginx:latest
        restart: unless-stopped
        ports:
            - 80:80
            - 443:443
        volumes:
            - ./nginx/conf:/etc/nginx/conf.d
            - ./certbot/conf:/etc/nginx/ssl
            - ./certbot/data:/var/www/html
    certbot:
        container_name: certbot
        image: certbot/certbot:latest
        command: certonly --webroot --webroot-path=/var/www/html --email [email protected] --agree-tos --no-eff-email -d domain.com -d www.domain.com
        volumes:
            - ./certbot/conf:/etc/letsencrypt
            - ./certbot/logs:/var/log/letsencrypt
            - ./certbot/data:/var/www/html
volumes:
    db_data:
    wordpress_data:

Pressione CTRL-X seguido de Y e ENTER para salvar e sair do arquivo.

Configuração do Docker Compose: Explicação

Aqui estão os detalhes de configuração:

  • Versão: Componha uma versão de arquivo compatível com o Docker Engine. Você pode verificar a compatibilidade aqui.
  • Serviços: Aqui, temos quatro serviços chamados WordPress, MariaDB, nginx e certbot.
  • Imagem: Usamos a última versão do WordPress com PHP 8.2, Apache, Mariadb, Nginx e Certbot imagens disponíveis no Docker hub.
  • Volumes:
    • wordpress_data: Configuramos este diretório para ser sincronizado com o diretório que desejamos usar como raiz da web dentro do contêiner.
    • conf: Aqui, colocaremos o arquivo de configuração do Nginx para ser sincronizado com a pasta conf.d padrão do Nginx dentro do contêiner.
    • cedtbot/conf: É aqui que receberemos o certificado SSL, e isso será sincronizado com a pasta que desejamos dentro do contêiner.
    • ports: Configure o contêiner para escutar nas portas listadas.
    • command: O comando usado para receber o certificado SSL.
  • Ambiente: Aqui, listamos todas as variáveis de ambiente disponíveis para a imagem WordPress.
    • WORDPRESS_DB_HOST: Aqui, usamos o nome do serviço do contêiner MariaDB.
    • WORDPRESS_DB_USER: Igual ao que configuramos no serviço mariadb.
    • WORDPRESS_DB_PASSWORD: Igual ao que configuramos no serviço mariadb.
    • WORDPRESS_DB_NAME: Igual ao que configuramos no serviço mariadb.

Configure o Nginx

De acordo com a configuração do docker-compose.yml, precisamos criar o arquivo default.conf dentro do diretório nginx/conf.

Crie o diretório ao lado do seu arquivo docker-compose.yml para abrigar o arquivo de configuração.

 
mkdir -p nginx/conf

Crie um arquivo chamado default.conf.

 
nano nginx/conf/default.conf

Coloque as seguintes configurações; aqui, usamos a configuração de proxy reverso para o contêiner wordpress que executa o Apache.

 

nginx/conf/default.conf server {
    listen [::]:80;
    listen 80;

    server_name domain.com www.domain.com;

    root /var/www/html;
    index index.php;

    location ~ /.well-known/acme-challenge {
        allow all; 
        root /var/www/html;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/.user.ini {
        deny all;
    }

    location ~*  .(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~ .php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }
} 

Aperte CTRL-X seguido de Y e ENTER para salvar e sair do arquivo.

Agora você tem sua configuração do docker-compose e sua configuração do Nginx.

Implantar WordPress com Docker Compose

Inicie os contêineres usando o seguinte comando; você receberá os certificados SSL assim que os contêineres forem iniciados.

 
docker-compose up -d

Uma vez que todos os contêineres estejam em funcionamento, você verá dois diretórios adicionais, certbot e WordPress, criados ao lado do seu arquivo docker-compose.yml.

O diretório wordpress contém todo o código fonte do seu site WordPress.

O diretório certbot contém todos os arquivos relacionados aos seus certificados SSL.

Para visualizar os contêineres, você pode executar o seguinte comando.

 
docker-compose ps

Configurar SSL Let’s Encrypt com Nginx

Como você já recebeu o certificado SSL Let’s Encrypt, pode configurar o HTTPS e configurar a redirecionamento para HTTPS.

Edite o default.conf e faça as seguintes alterações.

 
nano nginx/conf/default.conf

 

nginx/conf/default.confserver {
    listen [::]:80;
    listen 80;

    server_name domain.com www.domain;

    return 301 https://www.domain.com$request_uri;
}

 server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name domain.com;

    ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;

    return 301 https://www.domain.com$request_uri; 
}

server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name www.domain.com;

    ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;

    root /var/www/html;
    index index.php;

    location ~ /.well-known/acme-challenge {
         allow all; 
         root /var/www/html;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/.user.ini {
        deny all;
    }

    location ~*  .(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~ .php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }
} 

Aperte CTRL-X seguido de Y e ENTER para salvar e sair do arquivo.

Agora, você pode reiniciar o serviço Nginx para carregar as novas configurações.

 
docker-compose restart nginx

Agora, você pode verificar seu nome de domínio em seu navegador. Você será redirecionado para HTTPS e verá a página de instalação do WordPress para concluir a instalação.

Solução de Problemas

Abaixo estão algumas dicas para SSH em contêineres; consulte os logs de erro.

SSH para o Contêiner Docker

Para SSH no contêiner wordpress, você pode usar o comando abaixo.

 
docker-compose exec wordpress /bin/bash

Para SSH no contêiner nginx, você pode usar o comando abaixo.

 
docker-compose exec nginx /bin/bash

Verificar Logs do Contêiner

Você pode usar o comando abaixo para verificar os logs dos contêineres usando docker-compose

 
docker-compose logs -f

Reiniciar Contêineres

Você pode reiniciar os contêineres usando o comando restart facilmente.

 
docker-compose restart container_name

Substitua container_name pelo nome do seu contêiner (wordpress, nginx, certbot)

Parar Todos os Contêineres Docker

Você pode parar todos os contêineres Docker usando o comando abaixo.

docker-compose down

Remover Todos os Contêineres e Volumes

Você pode usar o docker-compose para remover todos os contêineres e seus volumes com o comando abaixo.

 
docker compose rm -fv

Remover Todos os Contêineres Docker

Remova todos os contêineres usando o seguinte comando.

 
docker rm -f $(docker ps -a -q)

Excluir Todos os Volumes

Você também pode excluir todos os volumes usando o comando abaixo.

 
docker volume rm $(docker volume ls -q)

Iniciar Todos os Contêineres

Com um único comando de Docker compose, você pode iniciar todos os contêineres.

 
docker-compose up -d

Conclusão

Agora você aprendeu a instalar e configurar o WordPress com Nginx, Apache, PHP 8.2, MariaDB e Let’s Encrypt com Docker e Docker Compose no Ubuntu 22.04.

Obrigado pelo seu tempo.

Source:
https://dzone.com/articles/wordpress-deployment-docker-nginx-apache-ssl