# 在单个 VPS 上使用 Nginx 反向代理运行 Discourse 和 WordPress (Docker)

**URL:** <https://meta.discourse.org/t/running-discourse-with-wordpress-docker-on-a-single-vps-using-nginx-reverse-proxy/392094>\
**Category:** Sysadmins\
**Tags:** wordpress\
**Created:** [2025年十二月24日 16:14 UTC](https://meta.discourse.org/t/running-discourse-with-wordpress-docker-on-a-single-vps-using-nginx-reverse-proxy/392094 "2025-12-24T16:14:24Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![thaidb](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/thaidb/32/68488_2.png) [@thaidb](https://meta.discourse.org/u/thaidb)\
**Post date:** [2025年十二月24日 16:14 UTC](https://meta.discourse.org/t/running-discourse-with-wordpress-docker-on-a-single-vps-using-nginx-reverse-proxy/392094/1 "2025-12-24T16:14:24Z")

</div>

### **引言**

默认情况下，Discourse 的“独立”安装会绑定到端口 **80** 和 **443** 。要在同一服务器上托管另一个应用程序（如 WordPress），您必须重新配置 Discourse 以监听内部端口，并使用主机级别的 Nginx 作为反向代理来管理流量和 SSL 证书。

* * *

### **1. 架构概述**

- **主机 Nginx：** 监听端口 80 和 443 的主网关。它处理 SSL 终止，并根据 `server_name` 将请求路由到适当的容器。

- **Discourse 容器：** 重新配置为监听 `localhost:8080`。

- **WordPress 容器：** 通过 Docker Compose 管理，监听 `localhost:8081`。

* * *

### **2. A 阶段：重新配置 Discourse**

修改您的 `/var/discourse/containers/app.yml` 文件以释放公共端口：

1. **更改端口映射：**

2. **禁用内部 SSL：** 注释掉 SSL 和 Let’s Encrypt 模板：

3. **重建：** 运行 `./launcher rebuild app`。

* * *

### **3. B 阶段：通过 Docker Compose 部署 WordPress**

在专用目录中组织您的 WordPress 站点。确保数据库卷是持久化的，以防止数据丢失。

YAML

```plaintext
services:
  db:
    image: mariadb:10.11
    environment:
      MYSQL_ROOT_PASSWORD: 'your_secure_password'
    volumes:
      - ./mysql_data:/var/lib/mysql
  wordpress:
    image: wordpress:latest
    ports:
      - "8081:80"
    volumes:
      - .:/var/www/html

```

* * *

### **4. C 阶段：最终 Nginx 配置（SSL 和 443 端口）**

在 2025 年，专业的设置需要完整的 HTTPS 和 HTTP/2 支持。在主机上安装 Nginx（`sudo apt install nginx`）后，为您的域名创建一个配置。

**专业提示：** 运行 `sudo certbot --nginx` 以自动生成 SSL 块，但请确保它们包含以下代理头，以便 Discourse 正常工作。

Nginx

```plaintext
server {
    listen 443 ssl http2;
    server_name discourse.com;

    # Certbot 提供的 SSL 证书
    ssl_certificate /etc/letsencrypt/live/discourse.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/discourse.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
        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-Proto $scheme; # 对 Discourse HTTPS 检测至关重要
    }
}

```

* * *

### **5. 宝贵经验和最佳实践**

- **数据库凭据：** 如果您的密码包含特殊字符，如 `&` 或 `?`，请务必在配置文件和终端命令中用单引号 `' '` 将它们括起来，以防止 shell 解释错误。

- **文件权限：** WordPress 容器以 `www-data` (UID 33) 身份运行。如果您以 `root` 身份上传或解压文件，则必须运行 `chown -R 33:33 .` 以避免出现 500 内部服务器错误。

- **Cloudflare 设置：** 当使用服务器上的 SSL 证书（Let’s Encrypt）时，将 Cloudflare 的 SSL/TLS 设置为 **完全 (严格)** (Full (Strict))。这可以防止“灵活”模式通常引起的“重定向过多”循环。

- **持久卷：** 切勿在未验证数据库文件存储在持久卷（例如 `./mysql_data`）中的情况下运行 `docker compose down` 或 `rebuild`。

* * *

**结论：** 使用反向代理将应用程序与端口 80/443 解耦是管理多站点 VPS 最具可扩展性的方法。它允许集中管理 SSL 并在主机级别的 Nginx 日志中轻松调试。

---

_[View the full topic](https://meta.discourse.org/t/running-discourse-with-wordpress-docker-on-a-single-vps-using-nginx-reverse-proxy/392094)._
