我看过几个教程,它们以不同的方式解释了如何实现这一点,但这并没有帮到我。有没有一种方法可以为 Discourse 配置 Apache 虚拟主机,使特定域名像添加其他网站及其对应域名一样重定向到该软件?
谢谢。
我看过几个教程,它们以不同的方式解释了如何实现这一点,但这并没有帮到我。有没有一种方法可以为 Discourse 配置 Apache 虚拟主机,使特定域名像添加其他网站及其对应域名一样重定向到该软件?
谢谢。
是的,那些教程解释了具体方法。
或者,如果你是指能否在不使用 Docker 且以 Apache 作为反向代理的情况下运行 Discourse,答案是不行。
每月只需 5 美元,你就可以避免这些麻烦。
感谢您的回复。
我是在 VPS 上运行的。我已经安装了 Apache,但对网站不太熟悉。我正在查看这个链接:Run other websites on the same machine as Discourse
但看起来由于配置文件的原因,我必须使用 Nginx。不过我的问题是,我是否可以用 Apache 实现同样的功能?
是啊,我也在看那个。他讲的是 CentOS,不是 Ubuntu,有些部分我不太清楚。
如果你不熟悉这一点(也不想熟悉),我强烈建议放弃 Apache,仅在 VPS 上运行 Discourse。如果你需要运行更多内容,请为 Apache 相关服务申请一个 VPS,再为 Discourse 申请另一个 VPS。
所以我切换到了 Nginx,现在一切正常。我认为 SSL 配置正确,但在 Chrome 浏览器中,它会提示“您与该网站的连接并非完全安全”。强制 HTTPS 已开启。
SSL 已在容器内部通过 nginx 服务配置完成。如果容器直接暴露在互联网上,并且您直接从浏览器访问它(默认的 Discourse 安装方式),那么您将拥有 SSL 加密。
但是,如果您在它前面部署了反向代理(无论是 Apache、Nginx,还是像 Cloudflare 这样的第三方服务),则必须确保浏览器与反向代理之间的连接是安全的。
因此,在您的情况下,您需要为作为反向代理的 nginx 生成证书(我认为您不需要添加 Discourse 的 SSL 模板,因为容器并未直接暴露在互联网上;您可以添加,但并非必需)。
您可以参考如何使用 Let’s Encrypt 来实现这一点(免费,与 Discourse 默认安装中使用的相同,但在这种情况下用于容器外部的 nginx)。
TL;DR 作为反向代理的 nginx 需要 SSL。而容器内部的 nginx 不需要 SSL(假设您是从同一台机器访问)。
那么,为了实现浏览器与反向代理之间的安全通信,我需要在 nginx 配置文件中配置 SSL 吗?
谢谢
这是我的配置文件,我还需要添加什么?
server {
listen 80; listen [::]:80;
server_name a1rp.xyz; # ← 修改此处
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2; listen [::]:443 ssl http2;
server_name a1rp.xyz; # ← 修改此处
ssl on;
ssl_certificate /var/discourse/shared/standalone/ssl/a1rp.xyz.cer;
ssl_certificate_key /var/discourse/shared/standalone/ssl/a1rp.xyz.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; # 从默认的 3m 提升至 5m
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;
proxy_set_header X-Real-IP $remote_addr;
}
}
请确保:
templates 目录(在 app.yml 中)下所有的 SSL 模板。如果您使用 Let’s Encrypt,通常会有两个模板:# - "templates/web.ssl.template.yml"
# - "templates/web.letsencrypt.ssl.template.yml"
- "templates/web.socketed.template.yml"
# - "80:80" # http
# - "443:443" # https
(或者您也可以暴露其他端口,例如 8080:80 和 8443:443,然后在下一步中不使用 socket,而是将请求重定向到指向 localhost:80 和/或 localhost:443 的上游服务。)
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock;
我认为您需要在 socket 路径末尾添加冒号 ::
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
/var/discourse/shared/standalone/ssl/ 目录下拥有 SSL 证书文件。您有这些文件吗?我假设您已经拥有域名 a1rp.xyz,并且已经在 Let’s Encrypt 网站上了解了如何生成 SSL 证书。另外请注意,在默认安装中,Discourse 会自动为您处理证书续期,但在您的情况下,您需要自行处理(例如使用 cronjob),否则证书将在 3 个月后过期。参考:
是的,我在应用配置中已经包含了你提到的所有内容(包括修正某些问题的帖子)。至于冒号,我认为它没有影响。也有一个帖子说那里不应该有冒号。SSL 文件我也已经有了。
所以我解决了这个问题。有人提到 favicon 在 http 中显示,这就是导致错误的原因。我上传了其他内容并删除了它,现在网站已完全启用 https ![]()