image-20250906041322774

引言:

为什么需要给 WordPress 套反向代理?

有朋友可能会疑惑:WordPress 本身能设置站点 URL 和端口,为什么还要多此一举用反向代理?

核心原因很简单——避免 80/443 端口被博客独占。公网访问中,80(HTTP)和 443(HTTPS)是默认端口,若直接给 WordPress 用,后续想部署其他项目(如个人网盘、后台管理系统)就无法通过二级域名(如 drive.example.com )复用这两个端口。而用 Nginx Proxy Manager(简称 NPM)做反向代理,能统一管理所有入站流量,通过不同二级域名分配端口,更灵活高效。

📌 说明:本文是博主第一篇技术博客,内容偏向新手友好,若有技术疏漏,欢迎各位大佬留言指正!

一、前置准备:环境与基础要求

在开始前,先确认你的环境是否符合以下条件(仅供参考,非强制但推荐):

  • 部署环境:Nginx Proxy Manager(NPM)与 WordPress(WP)部署在同一台服务器
  • 容器工具:两者均通过 Docker Compose 部署(需提前安装 Docker 和 Docker Compose,参考 Docker 官方安装指南)
  • 网络环境:服务器已具备公网 IP,且开放必要端口(80、443、81),支持公网访问

二、步骤 1:Docker 配置(端口映射 + 容器网络)

这一步的核心是:让 NPM 和 WordPress 容器能互相通信,同时避免端口冲突。

1.1 配置容器端口映射(关键!)

WordPress 容器有个特殊限制:容器内部必须使用 80 端口(否则无法通过 主机IP:端口 访问安装界面),因此需在 docker-compose.yml 中指定「宿主机端口:容器 80 端口」,宿主机端口可自定义(如 8000)。

示例:WordPress 端口映射配置

WordPress 的 docker-compose.yml 片段
1services:
2  wordpress:
3    image: wordpress:latest  # 推荐使用官方最新镜像
4    ports:
5      - "8000:80"  # 宿主机 8000 端口 → 容器 80 端口(宿主机端口可改,容器端必须是 80)
6    # 其他配置(如数据库链接、 volumes 等)省略,需自行补充

Nginx Proxy Manager 端口映射配置

NPM 需要两个关键端口:81 端口(管理界面)、443 端口(HTTPS 访问),配置如下:

NPM 的 docker-compose.yml 片段
1services:
2  nginx-proxy-manager:
3    image: jc21/nginx-proxy-manager:latest  # 官方镜像
4    ports:
5      - "80:80"    # HTTP 流量入口(必须,用于 SSL 验证)
6      - "81:81"    # NPM 管理界面端口(宿主机 81 端口,可自定义)
7      - "443:443"  # HTTPS 流量入口(必须)
8    # 其他配置(如 volumes、环境变量)省略,需自行补充

⚠️ 注意:配置后需开放服务器安全组/防火墙的 80、443、81 端口,否则外部无法访问。

1.2 创建 Docker 外部网络(容器间通信)

默认情况下,不同 Compose 项目的容器无法互相访问,需创建一个「外部网络」,让 NPM 和 WordPress 加入同一网络,后续可通过「容器名」直接通信(无需记复杂的容器 IP)。
  1. 执行命令创建外部网络
命令格式:docker network create 网络名(自定义,如 my-external-net)

docker network create my-external-net

  1. 在 Compose 中关联外部网络

分别在 WordPress 和 NPM 的 docker-compose.yml 中添加网络配置,确保两者加入同一网络:

通用示例(WordPress 和 NPM 的 Compose 都需添加此配置)
 1version: '3'
 2networks:
 3  my-external-net:  # 必须与命令创建的网络名完全一致
 4    external: true  # 关键:声明这是外部网络,不自动创建/删除
 5services:
 6  ##### WordPress 或 NPM 的服务配置
 7  服务名(如 wordpress 或 nginx-proxy-manager):
 8    image: 镜像名(如 wordpress:latest 或 jc21/nginx-proxy-manager:latest)
 9    networks:
10      - my-external-net  # 让当前容器加入外部网络
11    # 其他配置(ports、volumes 等)省略
  1. 验证网络是否生效

执行以下命令,检查 NPM 和 WordPress 容器是否在同一网络:

查看指定网络下的所有容器

`docker network inspect my-external-net | grep “Name”

若输出中包含两者的容器名(如 wordpress_wordpress_1 、 npm_nginx-proxy-manager_1 ),则配置成功。

三、步骤 2:Nginx Proxy Manager 配置(SSL 证书 + 反向代理)

这一步是核心:通过 NPM 申请免费 SSL 证书,并将 https://blog.example.com 反向代理到 WordPress 的容器端口。

2.1 访问 NPM 管理界面

在浏览器输入 http://服务器公网IP:81 ,进入 NPM 登录界面(默认账号: admin@example.com ,密码: changeme ,首次登录需修改密码)。

2.2 申请免费 SSL 证书

  1. 左侧菜单栏点击「SSL Certificates」→ 右上角「Add SSL Certificate」;
  2. 选择「Let’s Encrypt」(免费证书,有效期 90 天,NPM 可自动续期);
  3. 填写「Domain Names」:输入你的二级域名(如 blog.example.com );
  4. 勾选「I agree to the Let’s Encrypt Terms of Service」,点击「Save」;
  5. 等待验证通过(需确保域名已解析到服务器公网 IP),证书会自动保存。

📚 参考:若证书申请失败,可查看 NPM 官方 SSL 配置指南。

2.3 配置反向代理规则

  1. 左侧菜单栏点击「Hosts」→「Proxy Hosts」→ 右上角「Add Proxy Host」;
  2. 填写核心配置(按以下要求准确输入):
    配置项 内容说明
    Domain Names 输入你的博客二级域名(如 blog.example.com )
    Scheme 选择「http」(因为 WordPress 容器内部用 80 端口,走 HTTP 协议)
    Forward Hostname / IP 输入 WordPress 的容器名(如 wordpress_wordpress_1 ,可通过 docker ps 查看)
    Forward Port 输入 WordPress 容器的端口(固定为 80,因为容器内部用 80 端口)
  3. 切换到「SSL」标签页,在「SSL Certificate」中选择刚才申请的证书,勾选「Force SSL」(强制 HTTPS 访问);
  4. 点击「Save」,反向代理规则生效。

四、步骤 3:WordPress 核心配置(wp-config.php)

最后一步:告诉 WordPress 「你的公网访问地址」,否则会出现样式错乱、登录跳转失败等问题。

3.1 找到 wp-config.php 文件

通过 Docker volumes 找到 WordPress 的配置文件,路径通常为:

示例路径(根据你的 Compose volumes 配置调整)

/宿主机挂载目录/wordpress/wp-config.php

3.2 编辑配置文件

用文本编辑器打开 wp-config.php ,在文件末尾( require_once(ABSPATH . ‘wp-settings.php’); 之前)添加以下代码:

1// 定义 WordPress 核心文件访问地址(如 wp-admin、wp-includes)
2define('WP_SITEURL', 'https://blog.example.com');
3// 定义网站前台首页访问地址(通常与 WP_SITEURL 一致,除非有特殊需求)
4define('WP_HOME', 'https://blog.example.com');
5
6// 可选:解决反向代理下的 IP 识别问题(避免评论、登录记录错误 IP)
7if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
8    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
9}

⚠️ 注意:将 https://blog.example.com 替换为你的实际域名,保存文件后无需重启容器,配置立即生效。

五、验证结果与常见问题

5.1 验证访问

在浏览器输入 https://blog.example.com ,若能正常打开 WordPress 首页,且后台( https://blog.example.com/wp-admin )可正常登录,说明配置成功!此时 80/443 端口仍可通过其他二级域名(如 drive.example.com )分配给其他项目。

5.2 常见问题排查

  1. NPM 无法访问 WordPress 容器?
  • 检查两者是否在同一外部网络(参考步骤 1.2.3);
  • 确认「Forward Hostname」填写的是 WordPress 容器名(而非 IP),容器名可通过 docker ps 查看。
  1. WordPress 样式错乱/图片加载失败?
  • 检查 wp-config.php 中的 WP_SITEURL 和 WP_HOME 是否为 HTTPS 地址;
  • 若之前用 IP:8000 访问过 WordPress,需在数据库中替换旧地址(可安装插件 Better Search Replace,搜索 http://服务器IP:8000 替换为 https://blog.example.com )。
  1. SSL 证书申请失败?
  • 确认域名已正确解析到服务器公网 IP;
  • 检查服务器 80 端口是否开放(Let’s Encrypt 需通过 80 端口验证域名所有权)。

结语

通过以上步骤,你已经实现了用 Nginx Proxy Manager 反向代理 WordPress,既避免了 80/443 端口被独占,又能通过二级域名灵活管理多个项目。

如果遇到其他问题,欢迎在评论区留言!我会尽快回复并协助排查,也期待各位大佬分享更优的配置方案~