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 Engine 兼容的 Compose 文件版本。您可以在此檢查兼容性
  • 服務:在此,我們有四個服務名為WordPressMariaDBnginxcertbot
  • 映像:我們使用 Docker Hub 上最新的 WordPress 搭配 PHP 8.2、Apache、Mariadb、NginxCertbot映像。
  • 卷宗:
    • wordpress_data: 我們已將此目錄配置為與容器內部用作網頁根目錄的目錄同步。
    • 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

一旦所有容器啟動,你將看到兩個額外的目錄,certbotWordPress,與你的docker-compose.yml文件並列創建。

目錄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