我无法设置 nginx:[emerg] 无法加载证书 "/var/discourse/shared/standalone/ssl/ssl.crt":BIO_new_file() 失败

(SSL: error:02001002:system library:fopen:No such file or directory:fopen('/var/dis (…)
我正在按照指南操作,但找不到关于此错误的任何说明。

你好 @slivo

让我们看看这个命令的输出:

cd   /var/discourse/shared/standalone/ssl
ls -l

有什么线索吗?

cd ssl: 没有那个文件或目录

@slivo

这表明你上次重建容器时,Let’s Encrypt 设置未生成证书。

当然,我相信你早就知道了!

这周我也遇到过类似的安装失败情况。或许可以尝试运行

./launcher rebuild app

我重新构建了一次。我按照指南进行了设置。已配置受信任的 SSL(/etc/nginx/sites-enabled/discourse.conf),但我遇到了以下错误:

SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE

nginx 完全无法启动:

 nginx.service: 控制进程已退出,code=exited status=1
 nginx.service: 执行失败,结果 'exit-code'。

进程:3840 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
  进程:25108 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=1/FAILURE)

// 启动高性能 Web 服务器和反向代理服务器失败。

你好 @slivo

感谢你关于设置进展的更新。

你是在使用标准的 Docker 镜像部署 Discourse,且容器外部没有配置反向代理吗?

是的,而且我也在使用这份指南:Run other websites on the same machine as Discourse

你好 @slivo

上面那个链接描述的是在 Docker 容器中运行 Discourse,并通过 UNIX socket 将应用暴露给反向代理的配置方式。

在这种情况下,你不应该在容器的 yml 文件中启用 SSL;而应该在容器外部的反向代理上,使用 certbot 通过 Let’s Encrypt 来配置 SSL。

整体的高层架构大致如下:

WEB 用户 <-- HTTPS --> 反向代理 <-- HTTP --> Docker 容器

请将你的 yml 文件贴出来,记得把密码和邮箱地址用 xxxx 代替;让我们看看你现在的配置情况。

谢谢。

但现在我不明白了。然后我用 certbot 生成了一个新证书。我这里有这样的输出:

/etc/letsencrypt/live/myadress.com/fullchain.pem
您的密钥文件已保存至:
/etc/letsencrypt/live/myadress.com/privkey.pem

我是否需要修改这个文件中的地址,或者修改 /etc/nginx/sites-enabled/discourse.conf?还是我完全搞错了?

你好 @slivo

当你在另一个应用前配置 nginx 反向代理时:必须非常明确配置文件的位置,是在容器内还是容器外?

我不确定我是否完全理解。我只是想在 nginx 后面部署 Discourse。服务器上目前没有运行其他应用,但我这样做是为了从外部获得更好的保护。

你好 @slivo

我理解你的沮丧。让我为你详细解释一下。

在你之前的某条帖子中,你提到:

/etc/letsencrypt/live/myadress.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/myadress.com/privkey.pem

但你并未说明你是在 Docker 容器内还是容器外操作。

如你所知,nginx(在你的情况下)既在宿主机上直接运行,也在应用内部(即 Docker 容器内)运行。

当你发布:

/etc/letsencrypt/live/myadress.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/myadress.com/privkey.pem

如果我们作为外部人员,在你未提供完整信息的情况下,如何确切知道你所指的是什么?这个配置是在容器内还是容器外?我们可以“猜测”或“假设”你指的是容器外的配置,但由于你未提供这些细节,我们无法确定。根据我的经验,从问题到解决方案的最短路径是:绝不假设任何事,并密切关注细节。

此外,你尚未发布你的 yml 文件,也未发布容器外的 nginx 配置文件。因此,我们无法“看到”你实际在配置中做了什么。

希望这能帮到你。