Distribuzione WordPress: Docker, Nginx, Apache e SSL

Semplifica il deployment del tuo sito WordPress con la nostra guida facile da seguire. Utilizza Docker Compose, Nginx, Apache e SSL per un processo di installazione senza interruzioni.

Creeremo anche volumi in modo che le modifiche o gli aggiornamenti vengano preservati durante il riavvio del contenitore.

Questa configurazione è stata testata su Google Cloud con un’istanza che esegue il sistema operativo Ubuntu 22.04. Puoi anche realizzare questa configurazione in qualsiasi servizio cloud come AWS, Azure, DigitalOcean, o su server dedicati o VPS.

Prerequisiti

  1. Installare Docker su Ubuntu 22.04
  2. Installare Docker Compose su Ubuntu 22.04.

Assicurati di aver completato tutti i passaggi menzionati sopra.

  • Dominio puntato all’indirizzo IP del tuo server.
  • Docker installato e configurato.
  • Docker Compose installato e configurato.

Una volta che hai completato tutti i prerequisiti, puoi procedere alla configurazione di WordPress.

Creare la Directory del Progetto

Accedi via SSH al tuo server e inizia creando una nuova directory del progetto chiamata wp-project. Puoi anche chiamarla come preferisci.

 
mkdir wp-project

Creare il File Docker Compose YML

Ora, naviga all’interno della directory del progetto e crea un nuovo file docker-compose.yml con la seguente configurazione.

 
cd wp-project

Crea un nuovo file docker-compose.yml.

 
nano docker-compose.yml

Copia l’intero contenuto qui sotto e incollalo nel file.

Configura Docker Compose

Assicurati di sostituire le variabili d’ambiente menzionate di seguito.

 

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:

Premi CTRL-X seguito da Y e INVIO per salvare ed uscire dal file.

Configurazione Docker Compose: Spiegazione

Ecco i dettagli della configurazione:

  • Versione: Compila una versione del file Compose compatibile con il Docker Engine. Puoi controllare la compatibilità qui.
  • Servizi: Qui, abbiamo quattro servizi denominati WordPress, MariaDB, nginx, e certbot.
  • Immagine: Utilizziamo la versione più recente di WordPress con PHP 8.2, Apache, Mariadb, Nginx, e Certbot immagini disponibili nell’hub Docker.
  • Volumi:
    • wordpress_data: Abbiamo configurato questa directory per essere sincronizzata con la directory che desideriamo utilizzare come root web all’interno del contenitore.
    • conf: Qui inseriremo il file di configurazione Nginx da sincronizzare con la cartella predefinita conf.d di Nginx all’interno del contenitore.
    • cedtbot/conf: Qui riceveremo il certificato SSL, e questo sarà sincronizzato con la cartella che desideriamo all’interno del contenitore.
    • ports: Configura il contenitore per ascoltare sui porti elencati.
    • command: Il comando utilizzato per ricevere il certificato SSL.
  • Ambiente: Qui elenchiamo tutte le variabili d’ambiente disponibili per l’immagine WordPress.
    • WORDPRESS_DB_HOST: Qui, utilizziamo il nome del servizio del contenitore MariaDB.
    • WORDPRESS_DB_USER: Identico a quello configurato nel servizio mariadb.
    • WORDPRESS_DB_PASSWORD: Identico a quello configurato nel servizio mariadb.
    • WORDPRESS_DB_NAME: Identico a quello configurato nel servizio mariadb.

Configura Nginx

Secondo la configurazione docker-compose.yml, è necessario creare il file default.conf all’interno della directory nginx/conf.

Crea la directory accanto al tuo file docker-compose.yml per ospitare il file di configurazione.

 
mkdir -p nginx/conf

Crea un file denominato default.conf.

 
nano nginx/conf/default.conf

Inserisci le seguenti configurazioni; qui, utilizziamo una configurazione di reverse proxy al contenitore WordPress che esegue 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;
    }
} 

Premi CTRL-X seguito da Y e INVIO per salvare ed uscire dal file.

Ora hai la configurazione di docker-compose e la configurazione di Nginx.

Distribuisci WordPress con Docker Compose

Avvia i contenitori utilizzando il seguente comando; riceverai i certificati SSL una volta avviati i contenitori.

 
docker-compose up -d

Una volta avviati tutti i contenitori, vedrai due directory aggiuntive, certbot e WordPress, create accanto al tuo file docker-compose.yml.

La directory wordpress contiene tutto il codice sorgente del tuo sito WordPress.

La directory certbot contiene tutti i file relativi ai tuoi certificati SSL.

Per visualizzare i contenitori, puoi eseguire il seguente comando.

 
docker-compose ps

Configura SSL Let’s Encrypt con Nginx

Dato che hai ricevuto il certificato SSL Let’s Encrypt, puoi configurare HTTPS e impostare il reindirizzamento a HTTPS.

Modifica il default.conf e apporta le seguenti modifiche.

 
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;
    }
} 

Premi CTRL-X seguito da Y e INVIO per salvare ed uscire dal file.

Ora, puoi riavviare il servizio Nginx per caricare le nuove configurazioni.

 
docker-compose restart nginx

Ora, puoi verificare il tuo nome di dominio dal browser. Riceverai un reindirizzamento a HTTPS e vedrai la pagina di installazione di WordPress per completare l’installazione.

Risoluzione dei problemi

Di seguito sono riportati alcuni suggerimenti per SSH ai contenitori; consulta i log degli errori.

SSH al contenitore Docker

Per SSH nel contenitore wordpress, puoi utilizzare il seguente comando.

 
docker-compose exec wordpress /bin/bash

Per SSH nel contenitore nginx, puoi utilizzare il comando seguente.

 
docker-compose exec nginx /bin/bash

Verifica Log dei Contenitori

Puoi utilizzare il seguente comando per controllare i log dei contenitori utilizzando docker-compose

 
docker-compose logs -f

Riavvia Contenitori

Puoi riavviare i contenitori utilizzando il comando restart facilmente.

 
docker-compose restart container_name

Sostituisci container_name con il nome del tuo contenitore (wordpress, nginx, certbot)

Ferma Tutti i Contenitori Docker

Puoi fermare tutti i contenitori Docker utilizzando il comando seguente.

docker-compose down

Rimuovi Tutti i Contenitori e i Volumi

Puoi utilizzare docker-compose per rimuovere tutti i contenitori e i loro volumi con il seguente comando.

 
docker compose rm -fv

Rimuovi Tutti i Contenitori Docker

Rimuovi tutti i contenitori utilizzando il seguente comando.

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

Elimina Tutti i Volumi

Puoi anche eliminare tutti i volumi utilizzando il comando seguente.

 
docker volume rm $(docker volume ls -q)

Avvia Tutti i Contenitori

Con un singolo comando Docker compose, puoi avviare tutti i contenitori.

 
docker-compose up -d

Conclusione

Ora hai imparato come installare e configurare WordPress con Nginx, Apache, PHP 8.2, MariaDB e Let’s Encrypt con Docker e Docker Compose su Ubuntu 22.04.

Grazie per il tuo tempo.

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