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

引言

默认情况下,Discourse 的“独立”安装会绑定到端口 80443。要在同一服务器上托管另一个应用程序(如 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. 更改端口映射:

    YAML

    expose:
      - "8080:80"   # 将主机端口 8080 映射到容器端口 80
    
    
  2. 禁用内部 SSL: 注释掉 SSL 和 Let’s Encrypt 模板:

    YAML

    templates:
      - "templates/postgres.template.yml"
      - "templates/redis.template.yml"
      - "templates/web.template.yml"
      # - "templates/web.ssl.template.yml"
      # - "templates/web.letsencrypt.ssl.template.yml"
    
    
  3. 重建: 运行 ./launcher rebuild app


3. B 阶段:通过 Docker Compose 部署 WordPress

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

YAML

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

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 downrebuild


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

2 个赞