共计 4361 个字符,预计需要花费 11 分钟才能阅读完成。
在全新的服务器上,使用 Docker 部署 WordPress 时,正常的思路是:
- 安装 Docker
- 使用 docker compose 拉取并启动 wordpress 和 mysql,使用 IP 登录 wordpress 并完成初始化配置
- 配置域名解析
- 安装 nginx,配置域名证书和反向代理
此时通过域名打开 WordPress,大概率遇到 页面样式丢失 ,不管是主页还是管理页面。打开 F12 开发者工具,发现 链接无限重定向。
最初我的解决思路是“遇到问题解决问题”,瞄着 无限重定向 寻找解锁思路,尝试多种方法后仍然无解,同时也引入了各种其他问题。
后通过查看 WP 源码和查询 Forums,WordPress 应该是会根据部署场景(Docker/ 非 Docker)以及反向代理 自动配置 的。
然后删除容器重新部署,即部署顺序调整为:
- 安装 Docker
- 配置域名解析
- 安装 nginx,配置域名证书和反向代理
- 使用 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.Pro 和 AkileCloud 的 JPIIJ-One。VMISS 的 CN.HK.BGP.DC3.Pro适合需要稳定建站的站长,AkileCloud 的 JPIIJ-One 适合入门或者玩玩的朋友。
操作系统推荐选择 Debian12 或者 Ubuntu 22.04。
为什么选择境外的服务器?当然是为了省事儿免备案!
除了推荐配置外,也有其他配置可选,注意要选带大陆直连优化的,参考如下表:
| 型号 | 核数 / 内存 | 存储 | 带宽 | 流量 | 价格 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/ 月 | 👉购买 |
| 型号 | 核数 / 内存 | 存储 | 带宽 | 流量 | 价格 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.yml 和 uploads.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