如何在Ubuntu14.04上安装Nginx后面的Discourse

来自菜鸟教程
跳转至:导航、​搜索

介绍

Discourse 是一个为现代网络构建的开源社区讨论平台。

本教程将引导您完成配置 Discourse、使用 Nginx 将其移动到反向代理后面以及使用 Let's Encrypt 为其配置 SSL 证书的步骤。 将 Discourse 移动到保留代理之后,您可以灵活地在 Droplet 上运行其他网站。

先决条件

在我们开始之前,请确保您具备以下条件:

本教程中的所有命令都应以非 root 用户身份运行。 如果该命令需要 root 访问权限,它将在前面加上 sudo

第 1 步 - 配置 Discourse

现在您已经安装了 Discourse,我们需要将其配置为在 Nginx 后面工作。

警告:这将导致您的 Discourse 论坛停机,直到我们配置 Nginx。 确保这是 Discourse 的全新安装或在配置完成之前拥有备份服务器。


我们只需要将一个设置更改为 Discourse,以便我们可以将其移到 Nginx 后面。 切换到包含配置文件的目录:

cd /var/discourse

然后,打开我们需要修改的配置文件:

sudo nano containers/app.yml

使用箭头键,向下滚动到 expose 部分(它应该在顶部附近)并更改此行的第一个端口号:

/var/discourse/containers/app.yml

...
## which TCP/IP ports should this container expose?
expose:
  - "25654:80"   # fwd host port 80   to container port 80 (http)
...

这个数字可以是随机的,不应与他人共享。 如果您愿意,您甚至可以使用 iptables 防火墙规则 阻止未经授权的访问

现在保存并退出文本编辑器。

通过运行启用配置更改:

sudo ./launcher rebuild app

此步骤可能需要一段时间,因此请耐心等待。

您可以通过访问您的网站来验证一切正常。 您的 Discourse 域名(例如 http://discourse.example.com)将不再在 Web 浏览器中加载界面,但如果您使用刚刚为 Discourse 配置的端口,例如 http:///discourse.example.com:25654(替换discourse.example.com 使用您的域名,25654 使用您刚刚在此步骤中使用的端口)。

第 2 步 — 安装和配置 Nginx

现在 Discourse 已经安装并配置为在 Nginx 后面工作,是时候安装 Nginx 了。

要在 Ubuntu 上安装 Nginx,只需输入以下命令即可开始安装:

sudo apt-get install nginx

http://discourse.example.com 浏览旧的 Discourse URL 将显示默认的 Nginx 网页:

这可以。 我们现在将其更改为您的论坛。 首先,让我们停止 Nginx:

sudo service nginx stop

然后,删除这个默认的网页配置——我们不需要它:

sudo rm /etc/nginx/sites-enabled/default

接下来,我们将为我们的 Discourse 服务器创建一个新的配置文件,我们将其命名为 discourse

sudo nano /etc/nginx/sites-enabled/discourse

复制并粘贴以下配置。 将 discourse.example.com 替换为您的域名,将 25654 替换为您在上一步中刚刚使用的端口:

/etc/nginx/sites-enabled/discourse

server {
        listen 80;
        server_name discourse.example.com;
        return 301 https://discourse.example.com$request_uri;
}
server {
        listen 443 ssl spdy; 
        server_name discourse.example.com;
        ssl_certificate /etc/letsencrypt/live/discourse.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/discourse.example.com/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        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';
        ssl_prefer_server_ciphers on;
        location / {
                proxy_pass      http://discourse.example.com:25654/;
                proxy_read_timeout      90;
                proxy_redirect  http://discourse.example.com:25654/ https://discourse.example.com;
        }
}

这是此配置的作用:

  • 第一个服务器块正在侦听端口 80 上的 discourse.example.com 域,并将所有请求重定向到端口 443 上的 SSL。 这是可选的,但它会强制所有用户在您的网站上使用 SSL。
  • 第二个服务器块位于端口 443 上,并将请求传递给在端口 25654 上运行的 Web 服务器(在本例中为 Discourse)。 这实质上是使用反向代理将 Discourse 页面发送给您的用户并通过 SSL 返回。

您可能已经注意到我们在 /etc/letsencrypt 上引用了一些证书。 在下一步中,我们将在重新启动 Nginx 之前生成它们。

第 3 步 — 生成 SSL 证书

要生成 SSL 证书,我们将首先安装 Let's Encrypt 的 ACME 客户端。 该软件允许我们生成 SSL 证书。

sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

然后进入letsencrypt目录:

cd /opt/letsencrypt/

第一次安装 Let's Encrypt 所需的包:

./letsencrypt-auto --help

现在我们可以通过运行(替换为您的电子邮件地址和域名)来生成您的证书:

./letsencrypt-auto certonly --standalone --email sammy@example.com --agree-tos -d discourse.example.com

注意: Let's Encrypt 只会为域名颁发证书。 如果您尝试使用 IP 地址,则会收到错误消息。 如果您需要域名,请查看先决条件部分中的链接。


您应该会很快得到响应,类似于:

让我们加密输出

IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to sammy@example.com.
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/discourse.example.com/fullchain.pem. Your
   cert will expire on 2016-04-26. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.

您会注意到它说您的证书保存在 /etc/letsencrypt/live/discourse.example.com 中。 这意味着我们的 Nginx 配置现在有效。 您还会注意到到期日期不会太远。 这对于 Let's Encrypt 证书是正常的。 更新所需要做的就是再次运行完全相同的命令,但每 90 天登录一次并不好玩,因此我们将在下一步中将其自动化。

第 4 步 — 自动化 Let's Encrypt 证书更新

现在我们已经第一次设置了我们的证书,我们应该确保它们自动更新。 Let's Encrypt 证书仅在 90 天内有效,之后它们将过期并在浏览器中向您网站的所有访问者显示警告。 在撰写本文时,客户端并没有内置自动更新功能,但我们可以设置一个脚本来手动更新它们。

有关设置 cron 作业以自动更新证书的详细信息,请参阅 How To Secure Nginx with Let's Encrypt on Ubuntu 14.04Set Up Auto Renewal 步骤。

此命令创建的任何输出都将位于 /var/log/certificate-renewal.log 以进行故障排除。

第 5 步 — 重启 Nginx

最后,我们的配置应该就完成了。 通过运行以下命令重新启动 Nginx:

sudo service nginx restart

现在,如果您浏览到 https://discourse.example.com/,您的网站应该在线并使用 Let's Encrypt 保护,在大多数浏览器中显示为绿色锁。

结论

就是这样! 您现在在 Nginx 后面建立了一个 Discourse 论坛,使用 Let's Encrypt 使用最新的 SSL 标准进行保护。