导语:在上一篇教程中,我们将 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
解耦带来的三大质变:
- 可视化 SSL 证书管理:点点鼠标即可一键申请、续期 Let’s Encrypt 证书,告别手写复杂 Nginx 配置与定时脚本。
- 容器无需暴露额外端口:WordPress 容器不必将
8000或80端口映射到宿主机,所有流量通过 Docker 内部虚拟网络由容器名互联,大幅收敛服务器攻击面。 - 一台 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
- 默认初始账号:
[email protected] - 默认初始密码:
changeme
首次登录后,系统会强制要求修改管理员昵称、邮箱及新密码,请务必设置强密码。
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,主站完全不受影响。 - 运维与灾备清晰:网关只管流量,博客只管内容,模块分明,互不牵绊。