Implementación de WordPress: Docker, Nginx, Apache y SSL

Simplifica el despliegue de tu sitio web de WordPress con nuestra guía fácil de seguir. Utiliza Docker Compose, Nginx, Apache y SSL para un proceso de instalación sin problemas.

También crearemos volúmenes para que los cambios o actualizaciones se conserven al reiniciar el contenedor.

Este setup se ha probado en Google Cloud con una instancia que ejecuta el sistema operativo Ubuntu 22.04. También puedes realizar este setup en cualquier servicio en la nube como AWS, Azure, DigitalOcean, o en servidores dedicados o VPS.

Requisitos previos

  1. Instalar Docker en Ubuntu 22.04
  2. Instalar Docker Compose en Ubuntu 22.04.

Asegúrate de haber completado todos los pasos mencionados anteriormente.

  • Dominio apuntando a la dirección IP de tu servidor.
  • Docker instalado y configurado.
  • Docker Compose instalado y configurado.

Una vez que tengas todos los requisitos previos listos, puedes proceder a realizar el setup y configurar WordPress.

Crear Directorio del Proyecto

Accede por SSH a tu servidor y comienza creando un nuevo directorio de proyecto llamado wp-project. También puedes nombrarlo como necesites.

 
mkdir wp-project

Crear Archivo Docker Compose YML

Ahora, navega dentro del directorio del proyecto y crea un nuevo archivo docker-compose.yml con la siguiente configuración.

 
cd wp-project

Crea un nuevo archivo docker-compose.yml.

 
nano docker-compose.yml

Copia todo el contenido a continuación y pégalo en el archivo.

Configurar Docker Compose

Asegúrate de reemplazar las variables de entorno mencionadas a continuación.

 

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:

Presiona CTRL-X seguido de Y y ENTER para guardar y salir del archivo.

Configuración de Docker Compose: Explicación

Aquí están los detalles de configuración:

  • Versión: Compone una versión de archivo compatible con el Docker Engine. Puedes verificar la compatibilidad aquí.
  • Servicios: Aquí, tenemos cuatro servicios llamados WordPress, MariaDB, nginx, y certbot.
  • Imagen: Utilizamos la última versión de WordPress con PHP 8.2, Apache, Mariadb, Nginx, y Certbot imágenes disponibles en Docker hub.
  • Volúmenes:
    • wordpress_data: Hemos configurado este directorio para que se sincronice con el directorio que deseamos utilizar como raíz web dentro del contenedor.
    • conf: Aquí colocaremos el archivo de configuración de Nginx para sincronizarlo con la carpeta conf.d predeterminada de Nginx dentro del contenedor.
    • cedtbot/conf: Aquí es donde recibiremos el certificado SSL, y esto se sincronizará con la carpeta que deseemos dentro del contenedor.
    • puertos: Configurar el contenedor para que escuche en los puertos listados.
    • comando: El comando utilizado para recibir el certificado SSL.
  • Entorno: Aquí, enumeramos todas las variables de entorno disponibles para la imagen de WordPress.
    • WORDPRESS_DB_HOST: Aquí, utilizamos el nombre del servicio del contenedor de MariaDB.
    • WORDPRESS_DB_USER: Igual al que hemos configurado en el servicio de mariadb.
    • WORDPRESS_DB_PASSWORD: Igual al que hemos configurado en el servicio de mariadb.
    • WORDPRESS_DB_NAME: Igual al que hemos configurado en el servicio de mariadb.

Configurar Nginx

De acuerdo con la configuración de docker-compose.yml, necesitamos crear el archivo default.conf dentro del directorio nginx/conf.

Crea el directorio junto a tu archivo docker-compose.yml para albergar el archivo de configuración.

 
mkdir -p nginx/conf

Crea un archivo llamado default.conf.

 
nano nginx/conf/default.conf

Coloca las siguientes configuraciones; aquí, utilizamos la configuración de proxy inverso al contenedor de WordPress que ejecuta 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;
    }
} 

Presiona CTRL-X seguido de Y y ENTER para guardar y salir del archivo.

Ahora tienes tu configuración de docker-compose y tu configuración de Nginx.

Implementar WordPress con Docker Compose

Inicia los contenedores utilizando el siguiente comando; recibirás los certificados SSL una vez que los contenedores estén iniciados.

 
docker-compose up -d

Una vez que todos los contenedores estén iniciados, verás dos directorios adicionales, certbot y WordPress, creados junto a tu archivo docker-compose.yml.

El directorio wordpress contiene todo el código fuente de tu sitio web de WordPress.

El directorio certbot contiene todos los archivos relacionados con tus certificados SSL.

Para ver los contenedores, puedes ejecutar el siguiente comando.

 
docker-compose ps

Configurar SSL Let’s Encrypt con Nginx

Como has recibido el certificado SSL Let’s Encrypt, puedes configurar HTTPS y establecer la redirección a HTTPS.

Edita el default.conf y realiza los siguientes cambios.

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

Presiona CTRL-X seguido de Y y ENTER para guardar y salir del archivo.

Ahora, puedes reiniciar el servicio de Nginx para cargar las nuevas configuraciones.

 
docker-compose restart nginx

Ahora, puedes verificar tu nombre de dominio desde tu navegador. Obtendrás una redirección a HTTPS, y verás la página de instalación de WordPress para completar la instalación.

Solución de problemas

A continuación, se ofrecen algunos consejos para SSH a contenedores; revisa los registros de errores.

SSH al contenedor Docker

Para SSH al contenedor wordpress, puedes usar el siguiente comando.

 
docker-compose exec wordpress /bin/bash

Para conectarse por SSH al contenedor nginx, puedes utilizar el siguiente comando.

 
docker-compose exec nginx /bin/bash

Verificar Registros de Contenedor

Puedes utilizar el siguiente comando para revisar los registros de los contenedores mediante docker-compose

 
docker-compose logs -f

Reiniciar Contenedores

Puedes reiniciar los contenedores fácilmente utilizando el comando restart.

 
docker-compose restart container_name

Reemplaza container_name con el nombre de tu contenedor (wordpress, nginx, certbot)

Detener Todos los Contenedores de Docker

Puedes detener todos los contenedores de Docker utilizando el siguiente comando.

docker-compose down

Eliminar Todos los Contenedores y Volúmenes

Puedes utilizar docker-compose para eliminar todos los contenedores y sus volúmenes con el siguiente comando.

 
docker compose rm -fv

Eliminar Todos los Contenedores de Docker

Elimina todos los contenedores utilizando el siguiente comando.

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

Eliminar Todos los Volúmenes

También puedes eliminar todos los volúmenes utilizando el siguiente comando.

 
docker volume rm $(docker volume ls -q)

Iniciar Todos los Contenedores

Con un solo comando de Docker compose, puedes iniciar todos los contenedores.

 
docker-compose up -d

Conclusión

Ahora has aprendido cómo instalar y configurar WordPress con Nginx, Apache, PHP 8.2, MariaDB y Let’s Encrypt con Docker y Docker Compose en Ubuntu 22.04.

Gracias por tu tiempo.

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