☰
Docker Compose 部署 WordPress 个人博客实战指南
2026/10/21 3:19:45 网站建设 项目流程

1. 为什么现在还要亲手搭一个 WordPress 博客?不是有现成的平台吗?

“docker+wordpress搭建个人博客(如何在阿里云服务器上线部署个人博客)”——这个标题背后,藏着一群正在悄悄回归技术掌控权的人。不是他们不信平台,而是当某天发现编辑器突然改版、文章被限流、后台弹出“服务升级需续费高级版”、甚至某次误操作导致整站内容无法导出时,那种无力感会逼人重新思考:我的内容,到底该长在谁的土壤里?

我接触过不少从公众号、小红书、知乎转向自建博客的创作者。他们不是技术极客,A同学是做设计的,用三年时间攒了200多篇排版精美的教程;B老师是高校讲师,把课程笔记、学生作品、教学反思全存在一个第三方平台里,直到某次平台迁移数据丢失了2019年前的所有附件——那之后,他花了一个周末,在阿里云上跑通了第一个 Docker 化的 WordPress 站点。

这事儿的核心,从来不是“能不能”,而是“值不值得”。用 Docker 部署 WordPress,不是为了炫技,而是为了解决三个真实痛点:
第一,环境隔离性——你不用再担心 PHP 版本冲突、MySQL 配置被其他项目污染,WordPress 就该只管写文章,数据库就该只管存数据,Docker 让它们各司其职,互不打扰;
第二,部署可复现性——今天在测试机上跑通的配置,明天换台新服务器,只要docker-compose up -d一行命令,整个博客环境原样重建,连 PHP 的upload_max_filesize和max_execution_time都一模一样;
第三,运维轻量化——你不需要成为 Linux 系统管理员,也不用天天查 Apache 错误日志。容器挂了?docker restart wordpress;数据库慢了?docker exec -it mysql mysql -u root -p进去看慢查询;想升级 WordPress?改docker-compose.yml里的镜像标签,docker-compose pull && docker-compose up -d,全程不到两分钟。

阿里云服务器在这里的角色,也不是“必须选它”,而是因为它提供了最贴近真实生产场景的入门级基础设施:一台 2 核 4G 的轻量应用服务器(ECS 入门型也完全够用),带公网 IP、独立域名解析能力、基础防火墙控制,且价格可控(年付约 300 元起)。它不像本地 VirtualBox 那样“关机就停”,也不像某些免费云主机那样限制端口或强制跳转 HTTPS,它就是一个干净、稳定、你能真正“摸到”的 Linux 节点——这才是练手和长期运营的理想起点。

所以,如果你正犹豫“要不要自己搭”,不妨先问自己三个问题:

  • 我是否希望未来五年,哪怕平台规则巨变,我的所有文章、图片、评论数据,都完整掌握在自己手里?
  • 我是否愿意花一次性的 3–5 小时学习成本,换来此后每次更新、备份、迁移都只需敲几行命令的确定性?
  • 我是否需要一个能自由安装任意插件(比如本地 SEO 工具、私有图床对接、邮件订阅系统)、自由修改主题源码、甚至接入自己写的 API 接口的开放空间?

如果答案是肯定的,那么接下来的内容,就是为你准备的一份“可抄作业”的实操手册。它不讲 Docker 原理的底层调度,也不堆砌 Kubernetes 编排术语,只聚焦一件事:从零开始,在阿里云服务器上,用最简路径,跑起一个安全、可用、好维护的个人博客。所有命令、配置、参数,我都已在三台不同配置的阿里云实例上实测验证,包括 CentOS 7、Alibaba Cloud Linux 3 和 Ubuntu 22.04,差异点我会明确标注。

2. 整体架构设计与方案选型逻辑:为什么是 Docker Compose,而不是纯 Docker 或 K8s?

2.1 为什么放弃手动编译安装?——环境一致性是第一道生死线

五年前,我帮一位做翻译的朋友部署博客,用的是传统方式:SSH 登录,yum install httpd php mysql-server,然后手动下载 WordPress 源码,解压到/var/www/html,再配php.ini、改httpd.conf、初始化 MySQL 数据库……整个过程花了近 4 小时。结果第二天他想加个缓存插件,发现 PHP 缺少opcache模块,又得重装 PHP 并重新编译。第三周他换了台新服务器迁移,因为没记全所有配置项,导致中文 URL 乱码、上传图片失败、后台登录 500 错误——整整两天没更新文章。

这件事让我彻底放弃“手动裸装”。原因很现实:WordPress 不是一个静态程序,而是一套依赖链极长的动态生态。它需要:

  • PHP ≥ 8.0(官方推荐,7.4 已于 2022 年底停止支持)
  • MySQL ≥ 5.7 或 MariaDB ≥ 10.3(尤其涉及 JSON 字段、全文索引等特性)
  • Nginx 或 Apache(Nginx 在高并发静态资源处理上更轻量)
  • Redis(可选,但对提升后台响应速度和对象缓存至关重要)
  • Let’s Encrypt 客户端(用于自动申请 HTTPS 证书)

这些组件之间存在隐式耦合:PHP 的mysqli扩展要和 MySQL 协议版本匹配;Nginx 的fastcgi_pass地址要指向正确的 PHP-FPM socket;Redis 的host必须是容器内可解析的网络别名……任何一个环节配错,都会导致“页面白屏但无报错”“后台打不开但前端正常”这类玄学问题。而 Docker 的核心价值,就是把这套复杂依赖打包成“可执行的说明书”——镜像即契约,运行即承诺。

2.2 为什么选 Docker Compose,而不是单个docker run?——服务编排是生产可用的基石

有人会说:“我直接docker run -d -p 80:80 wordpress:latest不就行了吗?”
不行。原因有三:
第一,数据库无法持久化。wordpress:latest镜像默认使用 SQLite,但生产环境必须用 MySQL/MariaDB,且数据必须落盘。单容器模式下,你得手动挂载 MySQL 数据卷、配 root 密码、建 wp 数据库、授权用户——这些操作一旦出错,容器重启后数据全丢。
第二,网络通信不可靠。WordPress 容器需要连接数据库,但docker run启动的容器默认在bridge网络,IP 地址随机分配。你不能写死172.17.0.2这种地址,因为下次重启可能变成172.17.0.3。必须通过 Docker 内置的 DNS 服务,用容器名作为主机名(如mysql),而只有docker-compose才能自动创建共享网络并注册服务名。
第三,配置管理碎片化。WordPress 的wp-config.php需要填数据库地址、用户名、密码、密钥;Nginx 需要配反向代理、静态资源缓存;PHP 需要调memory_limit和post_max_size……把这些全塞进一条docker run命令里,不仅超长难读,而且无法版本化管理。

Docker Compose 正是为解决这些问题而生。它用一个docker-compose.yml文件,声明式地定义:

  • 有哪些服务(wordpress、mysql、nginx、redis)
  • 每个服务用什么镜像、启动参数、环境变量
  • 服务间如何通信(networks)、数据存哪(volumes)
  • 启动顺序依赖(如 mysql 必须先于 wordpress 启动)

这就像一份建筑蓝图:你不需要记住每根钢筋怎么绑、每块砖怎么砌,只要按图施工,房子就能立起来。更重要的是,这份蓝图可以 Git 管理、团队共享、CI/CD 自动部署——这才是现代运维的起点。

2.3 为什么不用 Kubernetes?——复杂度与收益严重不匹配

看到这里,可能有读者会问:“K8s 不是更先进吗?为什么不一步到位?”
我的回答很直接:除非你当前博客日均 PV 超过 10 万,或者需要跨 5 台以上服务器做弹性伸缩,否则 K8s 是典型的“杀鸡用牛刀”。

我曾在某公司内部用 K8s 部署过 WordPress 集群,整套 Helm Chart 加 CI 流水线写了 2000 多行 YAML,光是调试 Ingress Controller 的 TLS 重定向就耗了两天。而同样的功能,用 Docker Compose 实现,docker-compose.yml不到 120 行,nginx.conf60 行,wp-config.php30 行——总代码量不到 K8s 方案的 1/5,但稳定性、可读性、排查效率高出数倍。

K8s 的核心价值在于“大规模、多租户、强隔离”,而个人博客是典型的“单租户、低流量、强定制”。它的瓶颈从来不是“调度失败”或“Pod 驱逐”,而是“插件冲突”“主题 CSS 覆盖”“备份脚本漏传附件”。把精力花在理解kubectl get pods -n wordpress上,不如花十分钟研究怎么用wp-cli批量更新文章元数据。

所以,我们的最终架构非常克制:

  • Nginx 容器:作为反向代理和静态资源服务器,处理 HTTPS 终止、Gzip 压缩、防盗链、访问日志
  • WordPress 容器:基于官方wordpress:php8.2-apache镜像,挂载自定义主题和插件目录,通过环境变量注入数据库配置
  • MySQL 容器:使用mysql:8.0,挂载独立数据卷,启用innodb_file_per_table=ON保证表空间隔离
  • Redis 容器(可选):使用redis:7-alpine,仅用于对象缓存(WP Redis 插件),不存 session

所有容器运行在同一 Docker 网络(blog-network),通过服务名互访(wordpress连mysql:3306,nginx反代wordpress:80)。没有 Service Mesh,没有 Istio,没有 Operator——只有清晰、简单、一眼能看懂的数据流向。

提示:阿里云轻量应用服务器默认已安装 Docker,但未启用 Docker Compose。你需要手动安装docker-compose-plugin(新版 Docker CLI 插件)或docker-compose二进制文件。Ubuntu 系统推荐用sudo apt install docker-compose-plugin;CentOS 7 则需下载docker-compose-linux-x86_64并放入/usr/local/bin/。这是唯一需要手动干预的系统级依赖,其余全部由 Compose 自动拉取镜像、创建网络、挂载卷。

3. 核心细节解析与实操要点:从服务器初始化到域名解析的完整链路

3.1 阿里云服务器初始化:安全组、系统更新与 Docker 准备

拿到阿里云轻量应用服务器后,第一步不是急着敲命令,而是做三件事:
第一,收紧安全组规则。默认安全组放行全部端口,这极其危险。你只需保留:

  • 入方向:TCP 22(SSH)、TCP 80(HTTP)、TCP 443(HTTPS)
  • 出方向:全部放行(容器需要联网拉取镜像、更新插件)
    其他端口(如 3306 MySQL、6379 Redis)必须禁止公网访问,只允许 Docker 内部网络通信。这是防止暴力破解数据库的第一道防线。我在实测中发现,未关闭 3306 端口的服务器,平均 12 小时内就会收到境外 IP 的扫描请求。

第二,系统更新与基础工具安装。登录后立即执行:

# CentOS/Alibaba Cloud Linux sudo yum update -y && sudo yum install -y curl wget vim git unzip # Ubuntu sudo apt update && sudo apt upgrade -y && sudo apt install -y curl wget vim git unzip

注意:不要执行yum autoremove或apt autoremove,某些系统关键包可能被误删。更新后建议重启一次,确保内核和驱动生效。

第三,验证 Docker 状态。阿里云镜像通常预装 Docker,但版本可能较旧。检查并升级:

docker --version # 应显示 24.x 或更高 sudo systemctl status docker # 确保 active (running) sudo usermod -aG docker $USER # 将当前用户加入 docker 组,避免每次 sudo newgrp docker # 刷新组权限(或重新 SSH 登录)

如果docker --version报错,说明未安装。按官方文档安装:

  • Ubuntu:curl -fsSL https://get.docker.com | sh
  • CentOS 7:sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && sudo yum install docker-ce docker-ce-cli containerd.io

注意:阿里云某些老版本镜像(如 CentOS 7.6)的内核(3.10.x)对 overlay2 存储驱动支持不完善,可能导致容器启动失败。此时需升级内核至 4.19+,或改用vfs驱动(性能略降,但稳定)。升级内核命令为sudo yum install kernel-ml -y && sudo reboot,重启后uname -r查看版本。

3.2 域名与 DNS 解析:让yourblog.com指向你的服务器

没有域名,博客只是局域网里的玩具。阿里云提供万网域名注册,但无论你从哪家购买域名,解析设置都一样:

  • 登录域名管理后台(如阿里云云解析 DNS)
  • 添加两条 A 记录:
    • 主机记录@,记录值填你的服务器公网 IP
    • 主机记录www,记录值同样填服务器 IP
  • TTL 值设为 600 秒(10 分钟),便于后续调试时快速生效

等待 DNS 全网生效(通常 10 分钟内,国内运营商更快)。验证方法:

ping yourblog.com # 应返回你的服务器 IP dig +short yourblog.com # 应输出 IP 地址

如果ping不通,但dig正常,说明是服务器防火墙拦截。检查:

sudo ufw status # Ubuntu 查看防火墙状态 sudo firewall-cmd --list-all # CentOS 查看防火墙规则

确保 80/443 端口已放行。若使用ufw,执行sudo ufw allow 80 && sudo ufw allow 443。

实操心得:首次部署建议用测试子域名(如test.yourblog.com),避免主域名解析错误影响现有业务。我曾因误删主域名 CNAME 记录,导致公司官网 DNS 中断 2 小时——从此所有新项目必先走子域名灰度。

3.3 目录结构规划:让文件组织像乐高积木一样可拆卸

混乱的目录结构是后期维护的噩梦。我坚持一套极简但健壮的布局:

/home/blog/ ├── docker-compose.yml # 主编排文件(核心!) ├── nginx/ │ ├── conf.d/ │ │ └── default.conf # Nginx 配置(含 HTTPS 重定向) │ └── ssl/ # SSL 证书存放目录(后续生成) ├── wordpress/ │ ├── themes/ # 自定义主题目录(git clone 进来) │ ├── plugins/ # 插件目录(避免用后台安装,易权限错误) │ └── uploads.ini # PHP 上传配置(覆盖默认值) ├── mysql/ │ └── data/ # MySQL 数据库存储卷(绝对路径挂载) └── redis/ └── data/ # Redis 持久化目录

关键设计逻辑:

  • 所有业务数据(主题、插件、上传文件)与容器镜像分离。这样升级 WordPress 镜像时,你的个性化内容不会被覆盖。
  • Nginx 配置独立于容器。官方nginx镜像虽可挂载配置,但它的默认nginx.conf过于通用。我们直接用自定义default.conf,精准控制缓存头、防盗链、HTTPS 强制跳转。
  • MySQL 数据卷用绝对路径挂载(如/home/blog/mysql/data),而非命名卷。命名卷在docker volume ls中可见,但路径不直观;绝对路径便于直接rsync备份、mysqldump导出,也方便用宝塔等面板管理。

创建目录命令(一次性执行):

mkdir -p /home/blog/{nginx/conf.d,nginx/ssl,wordpress/{themes,plugins},mysql/data,redis/data} touch /home/blog/nginx/conf.d/default.conf touch /home/blog/wordpress/uploads.ini

3.4 Docker Compose 文件详解:每一行配置背后的生产考量

这是整个项目的灵魂文件。下面是我经过 17 次迭代后确认的docker-compose.yml,已去除所有冗余注释,仅保留生产必需项:

version: '3.8' services: nginx: image: nginx:1.25-alpine restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf:ro - ./nginx/ssl:/etc/nginx/ssl:ro - ./wordpress:/var/www/html:ro - /home/blog/nginx/logs:/var/log/nginx:rw depends_on: - wordpress wordpress: image: wordpress:6.4-php8.2-apache restart: unless-stopped environment: WORDPRESS_DB_HOST: mysql:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: your_strong_password_here WORDPRESS_DB_NAME: wordpress WORDPRESS_TABLE_PREFIX: wp_ WORDPRESS_CONFIG_EXTRA: | define('WP_REDIS_HOST', 'redis'); define('WP_REDIS_PORT', 6379); define('WP_REDIS_TIMEOUT', 1); define('WP_REDIS_READ_TIMEOUT', 1); define('WP_REDIS_RETRY_INTERVAL', 100); volumes: - ./wordpress:/var/www/html - ./wordpress/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro - /home/blog/wordpress/wp-content:/var/www/html/wp-content:rw depends_on: - mysql - redis mysql: image: mysql:8.0 restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: your_root_password_here MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: your_strong_password_here volumes: - ./mysql/data:/var/lib/mysql:rw - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro command: --default-authentication-plugin=mysql_native_password redis: image: redis:7-alpine restart: unless-stopped volumes: - ./redis/data:/data:rw command: redis-server --appendonly yes --save 60 1 --loglevel warning

逐项解析关键配置:

  • restart: unless-stopped:确保容器异常退出后自动恢复,但手动docker stop后不重启,符合运维直觉。
  • volumes挂载策略:/var/www/html是只读(ro),防止插件误删核心文件;wp-content是读写(rw),因为主题、插件、上传文件都存在这里;uploads.ini也是只读,避免 PHP 配置被运行时修改。
  • WORDPRESS_CONFIG_EXTRA:这是官方镜像提供的“注入额外 PHP 常量”机制。我们用它直接定义 Redis 连接参数,无需进入容器手动改wp-config.php——既安全又可版本化。
  • command覆盖:MySQL 的--default-authentication-plugin=mysql_native_password是为兼容旧版 PHP MySQL 扩展(如mysql_connect),避免Client does not support authentication protocol requested by server错误;Redis 的--save 60 1表示“60 秒内至少 1 次修改就持久化”,平衡性能与数据安全。
  • depends_on:仅控制启动顺序,不保证服务就绪。因此我们在 Nginx 配置中加入健康检查(见下文),确保 WordPress 容器真正响应 HTTP 请求后才代理流量。

注意:所有your_strong_password_here必须替换成高强度密码(12 位以上,含大小写字母、数字、符号)。我用openssl rand -base64 12生成,绝不重复使用同一密码。MySQL root 密码和 WordPress 用户密码必须不同,这是最小权限原则。

4. 实操过程与核心环节实现:从docker-compose up到 HTTPS 全站加密

4.1 第一次启动与初始配置:让博客“活”起来

切换到/home/blog目录,执行:

cd /home/blog docker-compose up -d

等待 30 秒,检查状态:

docker-compose ps # 应显示所有服务状态为 "Up",且时间大于 0 docker-compose logs -f wordpress | grep "Apache/2.4" # 看到 Apache 启动日志即成功

此时访问http://yourblog.com,应看到 WordPress 安装向导页面。但别急着点“现在就开始”——我们需要先完成两件事:
第一,配置 Nginx 强制 HTTPS。当前是 HTTP 明文,不安全。编辑/home/blog/nginx/conf.d/default.conf:

server { listen 80; server_name yourblog.com www.yourblog.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name yourblog.com www.yourblog.com; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; ssl_trusted_certificate /etc/nginx/ssl/chain.pem; # SSL 优化 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; } # WordPress 核心规则 root /var/www/html; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { fastcgi_pass wordpress:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } # 防盗链 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { valid_referers none blocked yourblog.com www.yourblog.com; if ($invalid_referer) { return 403; } } }

关键点说明:

  • return 301是永久重定向,搜索引擎会将 HTTP 页面权重转移到 HTTPS;
  • ssl_certificate路径必须与docker-compose.yml中挂载的./nginx/ssl目录一致;
  • try_files $uri $uri/ /index.php?$args是 WordPress 固定链接(Permalink)的基石,确保/post-name/这类 URL 能正确路由;
  • fastcgi_pass wordpress:9000中的wordpress是容器名,9000是 PHP-FPM 默认端口,官方wordpress镜像已预配置。

保存后,重载 Nginx 配置:

docker-compose exec nginx nginx -t # 先测试语法 docker-compose exec nginx nginx -s reload # 无报错则重载

4.2 申请并配置 Let’s Encrypt 免费 SSL 证书

HTTPS 不是可选项,而是现代网站的标配。我们用certbot(官方客户端)自动申请:

# 进入 Nginx 容器临时安装 certbot(仅用于申请,不长期驻留) docker-compose exec nginx apk add --no-cache py3-certbot-nginx # 申请证书(替换 yourblog.com) docker-compose exec nginx certbot --nginx -d yourblog.com -d www.yourblog.com --non-interactive --agree-tos -m admin@yourblog.com # 证书会自动存入 /etc/letsencrypt/live/yourblog.com/,但我们挂载的是 ./nginx/ssl # 所以需要软链接或复制 docker-compose exec nginx sh -c "ln -sf /etc/letsencrypt/live/yourblog.com/fullchain.pem /etc/nginx/ssl/fullchain.pem" docker-compose exec nginx sh -c "ln -sf /etc/letsencrypt/live/yourblog.com/privkey.pem /etc/nginx/ssl/privkey.pem" docker-compose exec nginx sh -c "ln -sf /etc/letsencrypt/live/yourblog.com/chain.pem /etc/nginx/ssl/chain.pem"

提示:certbot在容器内运行可能因时区或网络问题失败。若报错,可改用“手动验证”方式:

  1. docker-compose exec nginx certbot certonly --standalone -d yourblog.com -d www.yourblog.com --non-interactive --agree-tos -m admin@yourblog.com
  2. 此时 certbot 会启动临时 Web 服务监听 80 端口,需先docker-compose stop nginx,待证书生成后再docker-compose start nginx
  3. 证书生成后,同样执行软链接命令。

证书有效期 90 天,需自动续期。添加定时任务:

# 编辑 root 用户 crontab sudo crontab -e # 添加一行(每月 1 号凌晨 2:15 自动续期) 15 2 1 * * cd /home/blog && docker-compose exec nginx certbot renew --quiet --post-hook "nginx -s reload"

4.3 WordPress 初始化安装:避开后台安装的三大坑

回到浏览器,访问https://yourblog.com,现在应该看到 HTTPS 加锁图标。点击“现在就开始”,填写:

  • 数据库名:wordpress(与docker-compose.yml一致)
  • 用户名:wordpress(同上)
  • 密码:your_strong_password_here(同上)
  • 数据库主机:mysql(不是localhost!这是 Docker 内部网络别名)
  • 表前缀:wp_(保持默认,除非你有特殊需求)

关键避坑点:

  • 不要勾选“启用 Akismet”或“Jetpack”等需要 API Key 的插件。它们会在安装后自动联网,而你的服务器可能未配置 DNS 或被防火墙拦截,导致后台卡死。先完成基础安装,再手动安装。
  • 站点标题和管理员邮箱务必真实。这关系到后续找回密码、邮件通知等功能。我见过太多人填admin@example.com,结果收不到 WordPress 发送的密码重置邮件。
  • 密码强度必须达标。WordPress 6.4 要求至少 12 位,含大小写字母和数字。用openssl rand -base64 12生成后粘贴。

安装完成后,用管理员账号登录https://yourblog.com/wp-admin。此时你会看到一个干净的后台,但还缺三样东西:

  1. 主题:删除默认的 Twenty Twenty-Four,上传你选好的主题 ZIP(如 Astra、GeneratePress),或git clone到/home/blog/wordpress/themes/目录。
  2. 必要插件:安装WP Redis(启用对象缓存)、WP Super Cache(页面缓存)、Wordfence Security(基础防护)、Classic Editor(如果你不习惯古腾堡)。切记:所有插件 ZIP 包,先下载到本地,再用 SFTP 上传到/home/blog/wordpress/plugins/,最后在后台“已上传插件”中启用。直接后台搜索安装,容易因容器内 DNS 或权限问题失败。
  3. 固定链接设置:进入“设置 > 固定链接”,选择“文章名”(即/sample-post/),点击“保存更改”。这会触发 Nginx 重写规则生效。

实操心得:第一次登录后台后,立即修改“常规设置”中的“WordPress 地址(URL)”和“站点地址(URL)”为https://yourblog.com(注意是https)。否则后台资源(CSS/JS)会加载 HTTP 协议,被浏览器拦截,导致界面错乱。这是新手最高频的“白屏”原因。

4.4 Redis 缓存启用与性能验证:让后台快如闪电

WordPress 后台卡顿,90% 是数据库查询拖慢。启用 Redis 对象缓存,能将后台响应时间从 3–5 秒降至 300–500 毫秒。步骤如下:

  1. 在后台“插件 > 安装插件”搜索WP Redis,安装并启用;
  2. 插件会自动读取wp-config.php中的WP_REDIS_HOST等常量(我们在docker-compose.yml中已注入),无需额外配置;
  3. 进入“设置 > WP Redis”,勾选“启用对象缓存”,点击“保存更改”;
  4. 查看状态栏,应显示“Connected to Redis server at redis:6379”;

验证效果:

  • 打开 Chrome 开发者工具(F12),切换到 Network 标签;
  • 刷新后台首页,观察admin-ajax.php和load-scripts.php的加载时间;
  • 对比启用前后,TTFB(Time to First Byte)应下降 70% 以上。

注意:Redis 默认内存上限为 100MB,对个人博客足够。如需调整,修改docker-compose.yml中 redis 的command:
command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
这表示最大内存 256MB,淘汰策略为“最近最少使用”,避免内存溢出。

5. 常见问题与排查技巧实录:那些文档里不会写的“血泪经验”

5.1 问题速查表:高频故障与一键修复命令

现象可能原因快速诊断命令修复方案
访问https://yourblog.com显示“502 Bad Gateway”Nginx 无法连接 WordPress 容器docker-compose logs nginx | grep "connect failed"docker-compose restart wordpress;检查docker-compose.yml中fastcgi_pass地址是否为wordpress:9000
后台登录页空白,F12 显示Mixed Content错误WordPress 地址仍为 HTTPdocker-compose exec wordpress grep "define('WP_HOME'" /var/www/html/wp-config.php进入后台“设置 > 常规”,将两个 URL 改为https://;或手动改wp-config.php加define('WP_HOME', 'https://yourblog.com'); define('WP_SITEURL', 'https://yourblog.com');
上传图片失败,提示“上传的文件尺寸过大”PHPupload_max_filesize未生效docker-compose exec wordpress php -i | grep "upload_max_filesize"确认/home/blog/wordpress/uploads.ini内容为upload_max_filesize = 64Mpost_max_size = 128M,然后docker-compose restart wordpress
MySQL 容器启动失败,日志显示InnoDB initialization failureMySQL 数据卷损坏或权限错误ls -l /home/blog/mysql/datasudo chown -R 999:999 /home/blog/mysql/data(MySQL 8.0 官方镜像以用户 ID 999 运行);若仍失败,删除/home/blog/mysql/data目录(先备份!),再docker-compose up -d重建
docker-compose up -d后wordpress容器反复重启数据库未就绪,WordPress 连接超时docker-compose logs wordpress | tail -20在docker-compose.yml的wordpress服务下添加healthcheck:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3

5.2 “看不见”的陷阱:文件权限、时区与日志分析

陷阱一:WordPress 插件无法自动更新
现象:点击“立即更新”,进度条卡住,后台无报错。
原因:容器内/var/www/html目录属主是www-data(UID 33),但挂载的宿主机目录/home/blog/wordpress属主是root或普通用户

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询