如何在Ubuntu14.04上安装Nginx后面的Discourse
介绍
Discourse 是一个为现代网络构建的开源社区讨论平台。
本教程将引导您完成配置 Discourse、使用 Nginx 将其移动到反向代理后面以及使用 Let's Encrypt 为其配置 SSL 证书的步骤。 将 Discourse 移动到保留代理之后,您可以灵活地在 Droplet 上运行其他网站。
先决条件
在我们开始之前,请确保您具备以下条件:
- Ubuntu 14.04 Droplet(1 GB 或更大)
- 具有 sudo 权限的非 root 用户(Initial Server Setup with Ubuntu 14.04 解释了如何设置。)
- 使用安装的话语本教程
- 完全注册的域。 您可以在 Namecheap 上购买一个或在 Freenom 上免费获得一个。
- 确保您的域名配置为指向您的 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.04 的 Set 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 标准进行保护。