在同一服务器上运行多个站点作为不同的容器

我已成功安装站点1并运行了一个多月。今天我按照这里的说明操作:https://meta.discourse.org/t/running-other-websites-on-the-same-machine-as-discourse/17247,我编辑了第一个 Discourse 的配置文件,在宿主机上安装了外部的 nginx,并重新构建了第一个 Discourse。

站点1的 app.yml

root@docker-s-1vcpu-2gb-sgp1-01:~# cat /var/bbs-antivte-discourse/containers/app.yml
## 这是一个独立运行的 Discourse Docker 容器模板(all-in-one)
##
## 修改此文件后,您必须重新构建
## /var/discourse/launcher rebuild app
##
## 编辑时请*非常*小心!
## YAML 文件对空白字符或缩进错误极其敏感!
## 如需验证,请访问 http://www.yamllint.com/

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## 如果希望添加 Lets Encrypt (https),请取消下面两行的注释
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"  # <-- 已添加
## 此容器应暴露哪些 TCP/IP 端口?
## 如果您希望 Discourse 与 Apache 或 nginx 等其他 Web 服务器共享端口,
## 请参阅 https://meta.discourse.org/t/17247 了解详情
#expose:
#  - "80:80"   # http
#  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## 将 db_shared_buffers 设置为总内存的 25% 以内。
  ## 将根据检测到的 RAM 自动由 bootstrap 设置,您也可以手动覆盖
  db_shared_buffers: "256MB"

  ## 可提升排序性能,但会增加每个连接的内存占用
  #db_work_mem: "40MB"

  ## 此容器应使用哪个 Git 版本?(默认:tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## 支持的并发 Web 请求数量?取决于内存和 CPU 核心数。
  ## 将根据检测到的 CPU 自动由 bootstrap 设置,您也可以手动覆盖
  UNICORN_WORKERS: 4

  ## TODO: 此 Discourse 实例将响应的域名
  ## 必填。Discourse 无法仅通过 IP 地址运行。
  DISCOURSE_HOSTNAME: bbs.antivte.com

  ## 如果希望容器以与上述相同的 hostname(-h 选项)启动,请取消注释
  ## (默认为 "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 初始注册时自动设为管理员和开发者的邮箱列表,以逗号分隔
  ## 示例:'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'techempower@163.com'

  ## TODO: 用于验证新账户和发送通知的 SMTP 邮件服务器
  # 需要 SMTP 地址、用户名和密码
  # 警告:SMTP 密码中的字符 '#' 可能引发问题!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: postmaster@mail.antivte.com
  DISCOURSE_SMTP_PASSWORD: "67c9458eb7a6ff11b4db70f097b1b5c3-f7910792"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (可选,默认为 true)

  ## 如果添加了 Lets Encrypt 模板,请取消下方注释以获取免费 SSL 证书
  LETSENCRYPT_ACCOUNT_EMAIL: techempower@163.com

  ## 此 Discourse 实例的 http 或 https CDN 地址(配置为拉取)
  ## 详情请见 https://meta.discourse.org/t/14857
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

## Docker 容器是无状态的;所有数据均存储在 /shared 中
volumes:
  - volume:
      host: /var/bbs-antivte-discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/bbs-antivte-discourse/shared/standalone/log/var-log
      guest: /var/log

## 插件请放在此处
## 详情请见 https://meta.discourse.org/t/19157
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-knowledge-explorer
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/procourse/procourse-static-pages
## 构建后需要运行的任何自定义命令
run:
  - exec: echo "开始执行自定义命令"
  ## 如果希望设置首次注册时的 'From' 邮箱地址,请取消注释并修改:
  ## 收到首次注册邮件后,请重新注释该行。该命令只需运行一次。
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "自定义命令执行完毕"

接着进行第二个站点的安装,我将源代码克隆到另一个目录,复制第一个编辑好的 app.yml,仅修改其中的域名和克隆目录名称以适配第二个站点,然后运行 https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md

./discourse-setup

我对以下提示信息感到困惑,并且我为两个站点配置了两个不同的 nginx 配置。

站点1的 nginx 配置

root@docker-s-1vcpu-2gb-sgp1-01:~# cat /var/website/conf/conf.d/ytb.antivte.com 


server {
    listen 80; listen [::]:80;
    server_name ytb.antivte.com;  # <-- 请修改此处

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;  listen [::]:443 ssl http2;
    server_name ytb.antivte.com;  # <-- 请修改此处

#    ssl on;
    ssl_certificate      /var/ytb-antivte-discourse/shared/standalone/ssl/ssl.crt;
    ssl_certificate_key  /var/ytb-antivte-discourse/shared/standalone/ssl/ssl.key;
    ssl_dhparam          /var/ytb-antivte-discourse/shared/standalone/ssl/dhparams.pem;
    ssl_session_tickets off;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;

    http2_idle_timeout 5m; # 从默认的 3m 提升至 5m

    location / {
        proxy_pass http://unix:/var/ytb-antivte-discourse/shared/standalone/nginx.http.sock:;
        proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

站点2的 nginx 配置

server {
    listen 80; listen [::]:80;
    server_name bbs.antivte.com;  # <-- 请修改此处

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;  listen [::]:443 ssl http2;
    server_name bbs.antivte.com;  # <-- 请修改此处

#    ssl on;
    ssl_certificate      /var/bbs-antivte-discourse/shared/standalone/ssl/bbs.antivte.com.cer;
    ssl_certificate_key  /var/bbs-antivte-discourse/shared/standalone/ssl/bbs.antivte.com.key;
    ssl_dhparam          /var/bbs-antivte-discourse/shared/standalone/ssl/dhparams.pem;
    ssl_session_tickets off;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;

    http2_idle_timeout 5m; # 从默认的 3m 提升至 5m

    location / {
        proxy_pass http://unix:/var/bbs-antivte-discourse/shared/standalone/nginx.http.sock:;
        proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

以及

    /var/ytb-antivte-discourse/discourse-setup 
端口 80 似乎已被占用。

这将显示正在使用端口 80 的命令
COMMAND  PID   USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nginx   4255   root    6u  IPv4 22842780      0t0  TCP *:http (LISTEN)
nginx   4255   root    7u  IPv6 22842781      0t0  TCP *:http (LISTEN)
nginx   4256 nobody    6u  IPv4 22842780      0t0  TCP *:http (LISTEN)
nginx   4256 nobody    7u  IPv6 22842781      0t0  TCP *:http (LISTEN)

如果您尝试将 Discourse 与 Apache 或 nginx 等其他 Web 服务器同时运行,
您需要绑定到不同的端口。

请参阅 https://meta.discourse.org/t/17247

如果您正在重新配置已配置好的 Discourse,请使用

./launcher stop app

在重新配置之前停止 Discourse,然后重试。
1 个赞

为什么这一行会出现两次?

1 个赞

你应该做的是重命名 containers 目录下的 app.yml 文件。

如果你的邮件是真实密码,还需要更改你的 Mailgun 凭据。

如果已有 Web 服务器在运行,你将无法运行 discourse-setup。你应该直接使用 nano 或类似工具手动编辑文件。该脚本仅设计用于支持最标准的情况。

2 个赞

如果您正在运行 Web 服务器,将无法运行 discourse-setup。您应该直接使用 nano 或类似工具手动编辑文件。该脚本仅设计用于支持最标准的场景。

我运行的是 nginx,如果您是指这个的话。
编辑哪个文件?我不明白您说的意思。

1 个赞