Docker 部署 WordPress 踩坑

73次阅读
没有评论

共计 4361 个字符,预计需要花费 11 分钟才能阅读完成。

在全新的服务器上,使用 Docker 部署 WordPress 时,正常的思路是:

  1. 安装 Docker
  2. 使用 docker compose 拉取并启动 wordpress 和 mysql,使用 IP 登录 wordpress 并完成初始化配置
  3. 配置域名解析
  4. 安装 nginx,配置域名证书和反向代理

此时通过域名打开 WordPress,大概率遇到 页面样式丢失 ,不管是主页还是管理页面。打开 F12 开发者工具,发现 链接无限重定向

最初我的解决思路是“遇到问题解决问题”,瞄着 无限重定向 寻找解锁思路,尝试多种方法后仍然无解,同时也引入了各种其他问题。

后通过查看 WP 源码和查询 Forums,WordPress 应该是会根据部署场景(Docker/ 非 Docker)以及反向代理 自动配置 的。

然后删除容器重新部署,即部署顺序调整为:

  1. 安装 Docker
  2. 配置域名解析
  3. 安装 nginx,配置域名证书和反向代理
  4. 使用 docker compose 拉取并启动 wordpress 和 mysql,使用 IP 登录 wordpress 并完成初始化配置

继续访问后,发现仍然有无限重定向的问题,定位后发现 WordPress 地址(URL)该配置项自动设置的不对,手动修改后仍然不能解决问题。

继续定位,发现 WordPress 会根据 Header 内的 Host 来处理这项配置。修改反向代理配置后,再次删除容器重新部署,终于一切回归正常。

Nginx 反向代理配置如下:

location / {
	proxy_pass http://127.0.0.1:8128;
	proxy_set_header Host $host; # 这行必须添加
	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 $server_name;
	proxy_set_header X-Forwarded-Proto $scheme;
	proxy_redirect off;
}

最后附上完整的部署过程

Docker 部署 WordPress 完整过程

1. 准备服务器

服务器这里推荐 VMISS 的 CN.HK.BGP.DC3.ProAkileCloud 的 JPIIJ-OneVMISS 的 CN.HK.BGP.DC3.Pro适合需要稳定建站的站长,AkileCloud 的 JPIIJ-One 适合入门或者玩玩的朋友。

操作系统推荐选择 Debian12 或者 Ubuntu 22.04

为什么选择境外的服务器?当然是为了省事儿免备案!

除了推荐配置外,也有其他配置可选,注意要选带大陆直连优化的,参考如下表:

VMISS:

型号 核数 / 内存 存储 带宽 流量 价格 CAD 直达链接
CN.HK.BGP.DC3.Pro 1C2G 20G SSD 100Mbps 1000G $16.00/ 月 👉购买
CN.HK.BGP.DC3.Elite 2C4G 40G SSD 100Mbps 1600G $30.00/ 月 👉购买
CN.HK.BGP.DC3.Ultra 4C8G 80G SSD 100Mbps 3000G $60.00/ 月 👉购买
加拿大元汇率提示:1CAD≈5.0CNY

AkileCloud:

型号 核数 / 内存 存储 带宽 流量 价格 CAD 直达链接
JPIIJ-One
IIJ+GSL+PCCW+JPNAP+EIE
1C512M 5G 5000M 300G ¥10.00/ 月 👉购买
LAX4837-Mini
三网 4837 优化线路
1C1G 10G 1000M 1000G ¥24.99/ 月 👉购买

2. 准备域名

如果愿意花钱,无脑 Cloudfare 吧,省事儿方便。

如果不愿意花钱,推荐使用 https://domain.digitalplat.org,注册二级域名后托管到 Cloudfare 配置解析。推荐 *.qzz.io,看起来还蛮舒服的。

这部分网上教程很多,不展开了。

3. 准备证书

使用 acme.sh 申请和自动续签证书,需要先在 Cloudfare 上创建 API Token。

命令如下,注意替换成自己的 CF_Token、邮箱和域名

# 安装
curl https://get.acme.sh | sh -s email=my@example.com

# 申请证书,推荐带着泛域名一起,方便后续使用子域名
export CF_Token="xxxxxxxxxxxxxxxxxxx"
export CF_Account_ID="xxxxxxxxxxxxxxxxxxx"
acme.sh --issue --server google \
        --dns dns_cf \
        -d example.qzz.io -d *.example.qzz.io \
        --keylength ec-256

# 安装证书
mkdir -p /opt/certs
acme.sh --installcert -d example.qzz.io --ecc \
        --cert-file      /opt/certs/cert.pem  \
        --key-file       /opt/certs/key.pem  \
        --fullchain-file /opt/certs/fullchain.pem \
        --reloadcmd     "chmod 644 /opt/certs/* && systemctl force-reload nginx || true"

4. 安装 Nginx 和 配置反向代理

直接使用包管理器安装:

sudo apt install nginx 

修改 Nginx 配置文件: /etc/nginx/nginx.conf,注意修改 域名 为你自己的域名。

user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /dev/null;
include /etc/nginx/modules-enabled/*.conf;

events {worker_connections 768;}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;

    client_max_body_size 20m;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    access_log off;

    # Redirect HTTP to HTTPS
    server {listen       [::]:80 default ipv6only=off;
        return       301 https://$http_host$request_uri;
    }

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

        server_name example.qzz.io;

        ssl_certificate "/opt/certs/fullchain.pem";
        ssl_certificate_key "/opt/certs/key.pem";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        charset utf-8;

        location / {
            proxy_pass http://127.0.0.1:8128;
            proxy_set_header Host $host;
            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 $server_name;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_redirect off;
        }
    }
}

重新启动 Nginx:

systemctl restart nginx

5. 安装 Docker

参考官方文档对应操作系统的安装说明:https://docs.docker.com/engine/install

6. 使用 docker compose 部署 WordPress 和 MySQL

创建 wordpress 目录,并上传 compose 配置

mkdir -p /opt/wordpress
cd /opt/wordpress

docker-compose.ymluploads.ini 上传到该目录下。

/opt/wordpress/docker-compose.yml 内容如下(MySQL 仅本地可访问,密码可改可不改):

services:
  db:
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=password

  wordpress:
    image: wordpress:latest
    volumes:
      - wp_data:/var/www/html
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    ports:
      - 127.0.0.1:8128:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=password
      - WORDPRESS_DB_NAME=wordpress
    depends_on:
      - db

volumes:
  db_data:
  wp_data:

/opt/wordpress/uploads.ini 内容如下:

memory_limit = 256M
upload_max_filesize = 20M
post_max_size = 20M

拉取镜像并启动:

# 拉取最新镜像
docker compose pull

# 构建 / 创建 / 重新创建并启动容器
docker compose up -d

7. WordPress 初始化

访问你的域名,完成初始化配置,如 https://example.qzz.io

8. 安装主题和插件

主题推荐:Puock

SEO 插件推荐:The SEO Framework

正文完
 0
小甲哥
版权声明:本站原创文章,由 小甲哥 于2026-01-28发表,共计4361字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处,同时不得修改内嵌的AFF链接。
评论(没有评论)