如果您想在运行 Discourse 的同一台机器上托管其他网站,需要在 Docker 容器前面配置一个额外的 NGINX 或 HAProxy 反向代理。
注意:本指南面向高级管理员
本指南假设您已经成功运行了 Discourse——如果没有,您可能很难判断配置是否生效。
如果另一台服务器正在使用 80 或 443 端口,您将无法使用 ./discourse-setup 来设置 Discourse。您需要使用您喜欢的文本编辑器复制并编辑 samples/standalone.yml 文件。
在容器外部安装 nginx
首先,确保容器未运行:
cd /var/discourse
./launcher stop app
然后安装 nginx 和 certbot:
sudo apt-get update && sudo apt-get install nginx certbot python3-certbot-nginx
修改容器定义
这里我们将更改 Discourse 的实际设置方式。我们不希望容器监听端口,而是告诉它监听一个特殊的文件(socket)。
您需要编辑 /var/discourse/containers/app.yml 以禁用 SSL 并添加模板来创建 nginx socket。内容应如下所示:
# 基础模板;可以精简以减少每个容器模板的功能:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
# - "templates/web.ssl.template.yml" # 移除 - HTTPS 将由外部 nginx 处理
# - "templates/web.letsencrypt.ssl.template.yml" # 移除 - HTTPS 将由外部 nginx 处理
- "templates/web.socketed.template.yml" # <-- 新增
请务必通过在前面加上 # 来移除或注释掉暴露的端口部分:
# 要暴露哪些端口?
# expose: 通过在每行前面加上 # 来注释掉整个部分
# - "80:80" # http
# - "443:443" # https
现在您可以执行以下命令:
/var/discourse/launcher rebuild app
以重建 Discourse,使其数据可通过 socket 访问。
如果您使用的是其他无法使用 WebSocket 的反向代理,可以在上述部分中改为暴露其他端口,例如 - 8080:80。
为外部 nginx 创建 NGINX “站点”
为 Discourse 创建一个站点文件:
cd /etc/nginx/sites-available
cp default discourse.example.com
cd ../sites-enabled
ln -s ../sites-available/discourse.example.com
接下来编辑该文件,注释掉以下行:
#listen 80 default_server;
#listen [::]:80 default_server;
并按照以下方式编辑 server_name 和 location 部分:
server_name discourse.example.com; # <-- 修改此处
location / {
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
如果您使用的是双容器安装,socket 行应为:
proxy_pass http://unix:/var/discourse/shared/web-only/nginx.http.sock:;
然后在 Shell 中执行:
certbot --nginx
并按照提示操作。如果您不理解这些提示,可能不应该执行此操作,但可以查阅 certbot 文档寻求帮助。
@pfaffman 认为 certbot 会自动为您完成此操作,但如果您修改了 nginx 配置,则需要执行:
sudo service nginx reload
创建其他站点
Discourse 部分的设置已完成!
创建其他 NGINX “站点”,然后像上一步那样链接并启用它们。
提示
sudo netstat -tulpn:这将告诉您哪些端口正在被使用/var/log/nginx/error.log:这是 Ubuntu 上 nginx 日志的位置。当您遇到 502 Bad Gateway 错误时,这里会告诉您具体的错误信息。