好玩的 · 22 4 月, 2024 0

如何搭建 WordPress 博客 – 2024 Docker 版

从 15 年至今,我可能已经搭建过不下 20 次 WordPress 了。从直接安装到编写一键安装脚本,我已经是专业 LNMP 环境搭建工程师了(笑)。这一次,我们使用 Docker 来搭建 WordPress,使用简单,维护方便。

前提条件

  1. 一个有公网 IPv4 或 IPv6 的 Linux 主机(何必是电脑,何必又是 VPS,就像本站就在 ARM 开发版上)。
  2. 买一个心仪的域名。
  3. 设置域名的 A 记录(IPv4 访问) / AAAA 记录(IPv6 访问)到 Linux 主机。
  4. 基础的 Linux 与互联网知识。

技术栈

WordPress(内建 Apache2 与 PHP) —-> Nginx 反向代理(实现 HTTPS)

目录

  1. 安装 Docker
  2. 申请 Let’s Encrypt SSL 证书
  3. 创建配置文件
  4. 启动 WordPress

本教程基于 ARM64 架构的 RK3588 开发版(OrangePi 5 Plus)
运行 Armbian Jammy(Ubuntu 22.04)操作系统

安装 Docker

使用 Docker 的一键安装脚本即可:

catboy@orangepi5-plus:~$ wget -O - https://get.docker.com | sh

命令会下载 Docker 官方脚本,输出到标准输出(-O -),并通过管道作为标准输入给 sh(| sh)。

申请 Let’s Encrypt SSL 证书

不再赘述 SSL 证书的作用,也不再讲述 Let’s Encrypt 是什么。该操作通过 Certbot 程序完成。

# 安装 Certbot
catboy@orangepi5-plus:~$ sudo apt update && sudo apt install -y certbot

# 申请证书
catboy@orangepi5-plus:~$ sudo certbot certonly --agree-tos -m mail@example.com -d domain.com

# 将证书目录转移所有权到当前用户,后面 Docker 映射会用到
catboy@orangepi5-plus:~$ sudo chown -R $USER /etc/letsencrypt

记得替换 mail@example.comdomain.com 为你的邮箱与域名。Certbot 会设置一个定时任务来自动续约 SSL 证书,一般不需要手动维护。

创建配置文件

需要创建四个文件,分别用于 Docker Compose 配置,Nginx 反向代理配置,以及 PHP 配置。需要创建如下的目录树:

wordpress                        # WordPress Docker 配置文件总目录
├── docker-compose.yaml          # Docker Compose 配置文件
├── nginx-conf                   # Nginx 配置文件目录
│   ├── nginx.conf               # Nginx 配置文件
│   └── options-ssl-nginx.conf   # Nginx SSL 配置参数
└── php-conf                     # PHP 配置文件目录
    └── uploads.ini              # PHP 上传配置文件

下面是各个文件的内容:

docker-compose.yaml

services:
  wordpress:
    image: wordpress:latest
    container_name: container-wordpress
    restart: always
    depends_on:
      - mysql
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: db_user
      WORDPRESS_DB_PASSWORD: db_p@ssw0rd
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./wordpress:/var/www/html
      - ./php-conf/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini

  mysql:
    image: mysql:8.0
    container_name: container-mysql
    restart: always
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: db_user
      MYSQL_PASSWORD: db_p@ssw0rd
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - ./mysql:/var/lib/mysql

  nginx:
    image: nginx:stable-alpine
    container_name: container-nginx
    restart: always
    depends_on:
      - wordpress
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./nginx-conf:/etc/nginx/conf.d
      - /etc/letsencrypt:/etc/letsencrypt

请修改 db_userdb_p@ssw0rd 的值。分别是 MySQL 数据库的用户名与密码。

nginx.conf

server {
        listen                  80;
        listen                  [::]:80;

        server_name             domain.com;

        location / {
                rewrite         ^ https://$host$request_uri? permanent;
        }
}

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

        server_name             domain.com;
        index                   index.php;

        server_tokens           off;
        ssl_certificate         /etc/letsencrypt/live/domain.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/domain.com/privkey.pem;

        include                 /etc/nginx/conf.d/options-ssl-nginx.conf;

        location / {
                proxy_read_timeout      90;
                proxy_connect_timeout   90;
                proxy_redirect          off;

                proxy_pass              http://wordpress;

                proxy_set_header        X-Real-IP               $remote_addr;
                proxy_set_header        X-Forwarded-For         $proxy_add_x_forwarded_for;
                proxy_set_header        X-Forwarded-Host        $host;
                proxy_set_header        X-Forwarded-Server      $host;
                proxy_set_header        X-Forwarded-Proto       $scheme;
                proxy_set_header        Host                    $host;
    }
}

请修改 domain.com 为你的域名。

options-ssl-nginx.conf

# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file. Contents are based on https://ssl-config.mozilla.org

ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;

ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

文件无需修改。

uploads.ini

file_uploads = On
memory_limit = 500M
upload_max_filesize = 500M
post_max_size = 500M
max_execution_time = 600

文件无需修改。文件配置了 PHP 最大文件上传大小为 500MB。

启动 WordPress

wordpress 目录中,使用 Docker Compose 启动 WordPress 实例:

catboy@orangepi5-plus:~/wordpress$ docker compose up -d

实例启动后,会在 wordpress 目录中创建 mysqlwordpress 目录,分别用于存放 MySQL 和 WordPress 的数据。