在同一台机器上运行 Discourse 和其他站点


(Erick Guan) #1

本文翻译于官方论坛,于 2017-09-02。

如果你想要在同一台机器运行 Discourse 和其他网站,你需要在 Docker 容器前设置一个额外的 Nginx 代理。

如果你还没有看过高级 Docker 除错,请读一遍,因为它包含了主机和容器的基本区别。

这篇指南 假设你已经有了一个可以工作的 Discourse — 如果你没有,你可能很难确定配置是不是正确了。

在容器外安装 nginx

首先,确定容器没有工作:

cd /var/discourse
./launcher stop app

然后用包管理器安装 nginx:

sudo apt-get install nginx

改变容器设置

这是我们设置 Discourse 的地方。我们不想要容器监听端口——我们将监听一个特殊文件。

改变你的 app.yml,像这样:

# this is the base templates used, you can cut it down to include less functionality per container
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  # - "templates/web.ssl.template.yml" # 如果有 HTTPS
  # - "templates/web.china.template.yml" # 如果原来有,则保持不变
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml" # <-- 增加

如果有这行,删掉:

- "80:80" # fwd host port 80 to container port 80 (http)

为外部的 Nginx 创建一个 nginx “站点”

将以下配置放在 /etc/nginx/sites-enabled/discourse.conf,然后修改 server_name

server {
	listen 80; listen [::]:80;
	# 改下面这行到你的域名
	server_name forum.riking.org;

	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 $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
 	}
}

对于一个 HTTPS 站点,设置该文件 /etc/nginx/sites-enabled/discourse.conf 为:

server {
    listen 80; listen [::]:80;
    server_name forum.example.com;  # <-- change this

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

server {
    listen 443 ssl http2;  listen [::]:443 ssl http2;
    server_name forum.example.com;  # 改成你的域名

    ssl on;
    ssl_certificate      /var/discourse/shared/standalone/ssl/ssl.crt;
    ssl_certificate_key  /var/discourse/shared/standalone/ssl/ssl.key;
    ssl_dhparam          /var/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; # up from 3m default

    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 $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

server_name 要么删掉,要么设置好至你需要的域名。

然后,在命令行中:

# 停止运行任何在运行的 Discourse
/var/discourse/launcher stop app || true

# 测试配置文件
sudo nginx -t
# 重要:如果 nginx -t 返回了错误,再次重置前改正配置!
sudo service nginx reload

# 重建容器以生效
/var/discourse/launcher rebuild app

创建你的其他站点

你做完了 Discourse 的部分了!

有需要的话,创建其他的 nginx “站点”,然后按照以上的步骤连接并启用他们。


既安装wordpress又安装discourse
如何安装discourse和wordpress 在同一服务器?
VPS上的其他网站都变成discourse的首页了
阿里云上已有lnmp,怎么在不破坏lnmp的情况下安装呢?
Discourse和php网站安装在同一台服务器如何配置域名
已经安装了lanmp,不能再按照常规安装discourse?
关于nginx反向代理,一台主机多discourse运行
如何设置自定义的错误页面?
在同一服务器上部署 Wordpress 和 Discourse 不成功
(咖啡白菊) #2

完全按照此方法配置,测试配置文件正确,但就是网站打不开呢


(freemangl) #3

那你一定是哪个地方出错了。
你修改的nginx配置文件确定是在docker的discourse镜像中修改的吗?还在主机上又安装了一个Nginx?


(咖啡白菊) #4

早就弄好了,漏了一个标点


(雪莱鸟) #5

尝试了一下,还是不行了,打算开个新帖咨询一下…
我觉得应该有很多用户需要这样的


(雪莱鸟) #6

已经使用以上方法搭建了 A.com 然后继续搭建B.com 但是,A.com就出现了502,B.com正常访问,求教是什么原因


(雪莱鸟) #7

A.com B.com 谁后rebuild谁正常,另外一个502,无法显示,求教~


(雪莱鸟) #8

A.com B.com 都是discourse,我查看后发现生成的nginx.http.sock 只能在一个discourse下,
rebuild A.com后会自动删除B.com的nginx.http.sock,
rebuild B.com 后会自动删除A.com的nginx.http.sock
造成在一台主机只能同时访问一台discourse系统
请问站长是如何做到的,我已醉,还望站长能指导一下~ :grinning:


(cyufu) #10

您好,这里一直没有弄懂,crt和pem文件,只有一个怎么办?也就是只有crt和key,没有pem。pem和crt只是后缀不同,内容一样吗?