WordPress 建站实战 2️⃣:基于 Docker + Nginx Proxy Manager 打造解耦型高性能博客

导语:在上一篇教程中,我们将 Nginx、WordPress、MySQL 和 Redis 打包在同一个 docker-compose.yml 中完成了一体化部署。这种“单兵作战”模式适合单站测试,但随着服务器上运行的服务增多(例如后续新增的探针、网盘、爬虫面板),手写 Nginx 配置、反复申请和管理证书会逐渐变成沉重的负担。本文将带来更具前瞻性的全解耦进阶架构:引入 Nginx Proxy Manager (NPM) 作为全局图形化反代网关,配合 Docker 虚拟网络,打造优雅、安全且易于无限横向扩展的多站点体系。


一、 为什么进阶:从“一体化绑死”到“网关式解耦”

在敲键盘前,我们先看两张对比图,感受架构演进的核心价值:

graph TD
    subgraph 传统一体化模式(初级)
        WP_Group[WordPress + Nginx + DB + Redis]
        style WP_Group fill:#f9f0ff,stroke:#d3adf7
    end

    subgraph 网关解耦模式(推荐)
        Internet([公网流量 :80 / :443]) --> NPM[Nginx Proxy Manager 网关]
        NPM -.->|npm_net 虚拟内网| App1[WordPress 博客集群]
        NPM -.->|npm_net 虚拟内网| App2[其他容器应用/监控探针]
        style NPM fill:#e6f7ff,stroke:#1890ff,stroke-width:2px
        style App1 fill:#f6ffed,stroke:#52c41a
    end

解耦带来的三大质变:

  1. 可视化 SSL 证书管理:点点鼠标即可一键申请、续期 Let’s Encrypt 证书,告别手写复杂 Nginx 配置与定时脚本。
  2. 容器无需暴露额外端口:WordPress 容器不必将 8000 或 80 端口映射到宿主机,所有流量通过 Docker 内部虚拟网络由容器名互联,大幅收敛服务器攻击面。
  3. 一台 VPS 托管无数站点:NPM 独占公网 80 和 443 端口,后续无论添加多少个子域名和新项目,只需在 NPM 后台添加一条转发记录即可秒级上线。

二、 准备工作:项目目录规划

为了让各个项目职责清晰,我们在服务器用户目录下将 网关服务 与 博客应用 分目录独立存放:

# 一键创建两个独立项目的根目录
mkdir -p ~/nginx-proxy-manager
mkdir -p ~/wordpress

规范化后的项目目录树如下:

~/
├── nginx-proxy-manager/      # 全局反向代理网关
│   ├── docker-compose.yml
│   ├── data/                 # NPM 数据库与系统配置持久化
│   └── letsencrypt/          # SSL 证书存储目录
└── wordpress/                # WordPress 业务应用
    ├── docker-compose.yml    # 包含 WP、MySQL、Redis
    └── uploads.ini           # PHP 上传上限微调

三、 核心关键:创建 Docker 跨项目共享网络

因为 WordPress 与 NPM 处于两个不同的 Compose 项目中,默认情况下它们的容器网络是相互隔离的。为了让 NPM 能够直接通过容器名(wordpress)转发流量,我们必须先在宿主机中建立一个外部桥接网络:

docker network create npm_net

💡 重要提醒:这一步必须在启动任何 Compose 项目之前执行,否则容器启动时会提示 network npm_net declared as external, but could not be found 报错。


四、 容器编排清单编写

1. 部署全局网关:nginx-proxy-manager/docker-compose.yml

进入 ~/nginx-proxy-manager 目录,创建 docker-compose.yml:

services:
  nginx-proxy-manager:
    image: jc21/nginx-proxy-manager:latest
    container_name: nginx-proxy-manager
    restart: always
    ports:
      - "80:80"     # 公网 HTTP
      - "443:443"   # 公网 HTTPS
      - "81:81"     # Web 管理控制台
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - npm_net

networks:
  npm_net:
    external: true

2. 部署业务应用:wordpress/docker-compose.yml

进入 ~/wordpress 目录,创建 docker-compose.yml:

services:
  # 1. 数据库
  db:
    image: mysql:5.7
    container_name: wp_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_mysql_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: your_wordpress_password
    volumes:
      - ./db_data:/var/lib/mysql
    networks:
      - npm_net

  # 2. Redis 高速内存缓存
  redis:
    image: redis:latest
    container_name: wp_redis
    restart: always
    command: >
      redis-server 
      --appendonly yes 
      --requirepass your_redis_password 
      --maxmemory 512mb 
      --maxmemory-policy allkeys-lru
    volumes:
      - ./redis_data:/data
      - /etc/timezone:/etc/timezone:ro
    networks:
      - npm_net

  # 3. WordPress 核心
  wordpress:
    image: wordpress:latest
    container_name: wordpress
    restart: always
    depends_on:
      - db
      - redis
    # 注意:无需对公网映射端口!流量由 NPM 走内网直接转发,安全性拉满
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: your_wordpress_password
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_CONFIG_EXTRA: |
        /* Redis 内存对象缓存参数注入 */
        define('WP_REDIS_HOST', 'redis');
        define('WP_REDIS_PORT', '6379');
        define('WP_REDIS_PASSWORD', 'your_redis_password');
        define('WP_CACHE_KEY_SALT', 'your_salt_key');
        define('WP_CACHE', true);
      REDIS_HOST: redis
    volumes:
      - ./wp_content:/var/www/html/wp-content
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    networks:
      - npm_net

networks:
  npm_net:
    external: true

3. 解除 PHP 上传上限:wordpress/uploads.ini

在 ~/wordpress 目录下创建 uploads.ini,彻底告别媒体库 2MB 上传限制:

file_uploads = On
memory_limit = 256M
upload_max_filesize = 128M
post_max_size = 128M
max_execution_time = 300
max_input_time = 300

五、 服务拉起与健康检查

按顺序依次拉起网关和业务容器:

# 1. 启动全局反代网关
cd ~/nginx-proxy-manager
docker compose up -d

# 2. 启动 WordPress 业务套件
cd ~/wordpress
docker compose up -d

启动完成后,执行 docker ps,你将看到 4 个容器全部稳定运行,且均归属于 npm_net 局域网内。


六、 NPM 图形化配置反向代理与 HTTPS

现在抛开枯燥的命令行配置文件,我们全部在现代化的 Web 界面中搞定!

1. 首次登录 NPM 管理控制台

在浏览器中打开:http://<你的服务器IP>:81

首次登录后,系统会强制要求修改管理员昵称、邮箱及新密码,请务必设置强密码。


2. 添加反代转发主机 (Proxy Host)

登录控制台后,点击导航栏的 【Hosts】 -> 【Proxy Hosts】,点击右上角的 【Add Proxy Host】:

选项卡一:【Details】

  • Domain Names:输入你的博客域名(例如 blog.example.com),输入完按 Enter 回车键。
  • Scheme:选择 http。
  • Forward Hostname / IP:直接填写容器名 wordpress(得益于 npm_net 内部 DNS 解析,不需要查容器 IP,直接写名字!)。
  • Forward Port:填写 80。
  • 常用开关推荐:
    • 勾选 ✅ Cache Assets(静态资源缓存)
    • 勾选 ✅ Block Common Exploits(基础 SQL 注入及常见漏洞拦截)
    • 勾选 ✅ Websockets Support(支持长连接)

选项卡二:【SSL】

  • SSL Certificate:下拉选择 【Request a new SSL Certificate】(自动向 Let’s Encrypt 申请)。
  • 勾选 ✅ Force SSL(强制 HTTPS 跳转)。

    ⚠️ 避坑预警:如果你外层使用了 Cloudflare 小黄云 CDN 且开启了完全加密,源站 NPM 的 Force SSL 可能会与 CDN 产生 301 重定向冲突。若开启小黄云后出现重定向循环,将此开关关闭即可!

  • 勾选 ✅ HTTP/2 Support(提升页面并发加载速度)。
  • 输入你的真实邮箱并同意 Let’s Encrypt 协议,点击 Save (保存)。

七、 成果验收与结语

稍等几秒,NPM 会全自动完成域名验证、证书下发与 Nginx 规则重载。

现在打开浏览器访问:https://blog.example.com,一把绿色的小锁赫然亮起,WordPress 经典的安装界面秒级呈现!进入后台后,同样安装并启用 Redis Object Cache 插件,你的解耦型高性能博客便彻底投入服役。

架构优势回顾:

  • 后续扩展极度丝滑:将来你想在服务器部署新的开源面板(如监控、个人网盘等),只需让新容器加入 npm_net,并在 NPM 点一下鼠标即可搞定域名绑定与 HTTPS,主站完全不受影响。
  • 运维与灾备清晰:网关只管流量,博客只管内容,模块分明,互不牵绊。
上一篇 WordPress 建站实战 1️⃣:基于 Docker + Nginx + Redis + Cloudflare 搭建高性能专属博客
下一篇 为多个 Docker Compose 项目编写自动更新脚本:打造轻量、可控的无人值守运维流
目录
keiomn

keiomn管理员

这个人很懒,什么都没有留下。

本月创作热力图

少
多