WordPress部署:Docker、Nginx、Apache与SSL

通过我们的简易指南简化您的WordPress网站部署。利用Docker Compose、Nginx、Apache和SSL实现无缝安装流程。

我们还将创建卷,以便在容器重启时保留更改或更新。

此设置已在Google云上使用运行Ubuntu 22.04操作系统的实例进行测试。您也可以在AWS、Azure、DigitalOcean或任何专用或VPS服务器上进行此设置。

预备条件

  1. 在Ubuntu 22.04上安装Docker
  2. 在Ubuntu 22.04上安装Docker Compose.

请确保已完成上述所有步骤。

  • 域名已指向您的服务器IP地址。
  • Docker已安装并配置。
  • Docker Compose已安装并配置。

一旦完成所有预备条件,您就可以继续进行设置并配置WordPress。

创建项目目录

通过SSH连接到您的服务器,首先创建一个名为wp-project的新项目目录。您也可以根据需要命名它。

 
mkdir wp-project

创建Docker Compose YML文件

现在,进入项目目录并创建一个新的docker-compose.yml文件,配置如下。

 
cd wp-project

创建一个新的docker-compose.yml文件。

 
nano docker-compose.yml

复制以下全部内容并粘贴到文件中。

配置Docker Compose

确保替换下面提到的环境变量。

 

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:

按下CTRL-X,接着按YENTER保存并退出文件。

Docker Compose配置:解释

以下是配置详情:

  • 版本:编写与Docker引擎兼容的Compose文件版本。您可以在此处检查兼容性
  • 服务:这里,我们有四个服务,名为WordPressMariaDBnginxcertbot
  • 镜像:我们使用Docker Hub上最新的WordPress与PHP 8.2、Apache、MariaDB、NginxCertbot镜像。
  • 卷配置:
    • wordpress_data: 我们已配置此目录与容器内希望用作Web根目录的目录同步。
    • conf: 这里将放置Nginx配置文件,该文件将与容器内默认的Nginx conf.d文件夹同步。
    • cedtbot/conf: 此处将接收SSL证书,并与容器内希望同步的文件夹保持一致。
    • ports: 配置容器监听列出的端口。
    • command: 用于接收SSL证书的命令。
  • 环境:此处列出了适用于WordPress镜像的所有可用环境变量。
    • WORDPRESS_DB_HOST:这里,我们使用MariaDB容器的服务名称。
    • WORDPRESS_DB_USER:与我们在mariadb服务中配置的用户相同。
    • WORDPRESS_DB_PASSWORD:与我们在mariadb服务中配置的密码相同。
    • WORDPRESS_DB_NAME:与我们在mariadb服务中配置的数据库名称相同。

配置Nginx

根据docker-compose.yml配置,我们需要在nginx/conf目录下创建default.conf文件。

docker-compose.yml文件旁创建一个目录以存放配置文件。

 
mkdir -p nginx/conf

创建一个名为default.conf的文件。

 
nano nginx/conf/default.conf

放置以下配置;这里,我们使用反向代理配置指向运行Apache的WordPress容器。

 

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

CTRL-X,接着按YENTER保存并退出文件。

现在你已经有了docker-compose配置和Nginx配置。

使用Docker Compose部署WordPress

通过以下命令启动容器;一旦容器启动,你将收到SSL证书。

 
docker-compose up -d

所有容器启动后,你会在docker-compose.yml文件旁边看到两个新目录:certbotWordPress

目录wordpress存放了你的WordPress网站源代码。

目录certbot存放了与你的SSL证书相关的所有文件。

要查看容器,可以执行以下命令。

 
docker-compose ps

使用Nginx配置Let’s Encrypt SSL

收到Let’s Encrypt SSL证书后,你可以配置HTTPS并设置重定向至HTTPS。

编辑default.conf并进行以下更改。

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

CTRL-X,然后输入YENTER保存并退出文件。

现在,你可以重启Nginx服务以加载新配置。

 
docker-compose restart nginx

现在,你可以从浏览器检查你的域名。你将看到重定向至HTTPS,并显示WordPress安装页面以完成安装。

故障排除

以下是一些SSH到容器的提示;查看错误日志。

SSH到Docker容器

要SSH进入wordpress容器,可以使用以下命令。

 
docker-compose exec wordpress /bin/bash

要通过SSH进入nginx容器,可以使用以下命令。

 
docker-compose exec nginx /bin/bash

查看容器日志

使用docker-compose可以执行以下命令来检查容器日志

 
docker-compose logs -f

重启容器

通过restart命令可以轻松重启容器。

 
docker-compose restart container_name

container_name替换为您的容器名称(wordpress、nginx、certbot)

停止所有Docker容器

使用以下命令可以停止所有Docker容器。

docker-compose down

移除所有容器及其卷

使用docker-compose可以执行以下命令来移除所有容器及其卷。

 
docker compose rm -fv

移除所有Docker容器

使用以下命令移除所有容器。

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

删除所有卷

您也可以使用以下命令删除所有卷。

 
docker volume rm $(docker volume ls -q)

启动所有容器

通过一个Docker compose命令,您可以启动所有容器。

 
docker-compose up -d

结论

现在您已经学会了如何在Ubuntu 22.04上使用Docker和Docker Compose安装并配置WordPress,搭配Nginx、Apache、PHP 8.2、MariaDB和Let’s Encrypt。

感谢您的阅读。

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