未安装子域时无法正常工作

您好,我正在尝试在一个全新的 Ubuntu 20.04 测试虚拟机上安装 Discourse(我也尝试过 CentOS Stream 9、Ubuntu 22.04 和 openSUSE MicroOS)。我对 Discourse 项目的早期就有一些经验,现在我正在评估它用于迁移。在这种情况下,它将是 mydomain.tld(生产域名只是一个论坛,并且名称中包含“forum”,并且众所周知,所以我绝对不想要 discourse.mydomain.tld)。我最近所有不带子域名的 Discourse 安装尝试都失败了。我知道以前是可能的,因为大约 6 年前我曾不带子域名运行过一个 Discourse 论坛。现在安装似乎成功完成了,但网站无法加载。在 Ubuntu 中,即使我明确指定 http://,它也会自动切换到 https://,并且根本无法加载。在 CentOS 和 MicroOS 中,它会加载 http:// Nginx 欢迎页面,而 https:// 根本无法加载。

在我尝试过的上述操作系统上,当 Discourse 安装到子域名 discourse.mydomain.tld 时,所有尝试都运行正常,包括 Let’s Encrypt 自动配置。据我所知,我的 DNS 记录在域名注册商处是正确的,并且我具有正确的 rDNS 解析。服务器在 /etc/hosts 中的主机名显示 127.0.1.1 mydomain.tld mydomain,并且 discourse-install 脚本在域名解析检查时会成功。

这是 discourse-doctor 的输出,如果您需要,我也有完整的 discourse-install 日志:

DISCOURSE DOCTOR Sun Oct 9 13:32:47 UTC 2022
OS: Linux mydomain 5.4.0-125-generic #141-Ubuntu SMP Wed Aug 10 13:42:03 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux


Found containers/app.yml

==================== YML SETTINGS ====================
DISCOURSE_HOSTNAME=mydomain.tld
SMTP_ADDRESS=mail.mydomain.tld
DEVELOPER_EMAILS=REDACTED
SMTP_PASSWORD=REDACTED
SMTP_PORT=587
SMTP_USER_NAME=admin@mydomain.tld
LETSENCRYPT_ACCOUNT_EMAIL=REDACTED

==================== DOCKER INFO ====================
DOCKER VERSION: Docker version 20.10.12, build 20.10.12-0ubuntu2~20.04.1

DOCKER PROCESSES (docker ps -a)

CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS         PORTS                                                                      NAMES
d6f7f53a81db   local_discourse/app   \"/sbin/boot\"   10 minutes ago   Up 4 minutes   0.0.0.0:80-\u003e80/tcp, :::80-\u003e80/tcp, 0.0.0.0:443-\u003e443/tcp, :::443-\u003e443/tcp   app


Discourse container app is running


==================== PLUGINS ====================
          - git clone https://github.com/discourse/docker_manager.git

No non-official plugins detected.

See https://github.com/discourse/discourse/blob/main/lib/plugin/metadata.rb for the official list.

========================================
Discourse version at mydomain.tld: NOT FOUND
Discourse version at localhost: NOT FOUND


==================== MEMORY INFORMATION ====================
OS: Linux
RAM (MB): 2029

              total        used        free      shared  buff/cache   available
Mem:           1935         823         547          30         564         934
Swap:          2047           0        2047

==================== DISK SPACE CHECK ====================
---------- OS Disk Space ----------
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        38G  8.0G   28G  23% /

==================== DISK INFORMATION ====================
Disk /dev/sda: 38.15 GiB, 40961572864 bytes, 80003072 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 6643DB1B-E542-4DE1-A04C-C8EB4DAAD77E

Device      Start      End  Sectors  Size Type
/dev/sda1  528384 80003038 79474655 37.9G Linux filesystem
/dev/sda14   2048     4095     2048    1M BIOS boot
/dev/sda15   4096   528383   524288  256M EFI System

Partition table entries are not in disk order.

==================== END DISK INFORMATION ====================

==================== MAIL TEST ====================
For a robust test, get an address from http://www.mail-tester.com/
Mail test skipped.

==================== DONE! ====================

在不知道域名的情况下很难提供帮助。当您尝试从互联网上的另一台计算机向您的 domain.tld 发出详细的 curl 请求时,会发生什么?

您好,感谢您的回复。好的,这是一个好主意,看起来它不接受连接:

$ curl -v mydomain.tld
*   Trying 1.2.3.4:80...
* connect to 1.2.3.4 port 80 failed: Connection refused
* Failed to connect to mydomain.tld port 80: Connection refused
* Closing connection 0
curl: (7) Failed to connect to mydomain.tld port 80: Connection refused

$ curl -v https://mydomain.tld
*   Trying 1.2.3.4:443...
* connect to 1.2.3.4 port 443 failed: Connection refused
* Failed to connect to mydomain.tld port 443: Connection refused
* Closing connection 0
curl: (7) Failed to connect to mydomain.tld port 443: Connection refused

这是否可能是由于 Discourse 设置逻辑中的某些限制,它期望 .tld 是像 .com.org 这样的常见后缀?我只是一个用于测试的 5 美元的 .tech 域名。

不太可能。

服务器托管在哪里?它与客户端之间有什么?

提供完全限定域名 (FQDN) 有助于我们进行一些故障排除。目前,您要求我们在蒙着眼睛的情况下帮助诊断此问题,因此可能需要一段时间才能查明。

此实例是使用 discourse-setup 安装的,还是您手动创建了 YML 文件?

您是否已验证 Hetzner 上的 80/443 端口已打开?

Let’s encrypt 现在是标准配置,因此会重定向到安全端口。

我使用了 discourse-setup。是的,端口已打开。安装到子域工作正常,并且我在同一虚拟机上设置了一个带有 Web 前端的邮件服务器的 Docker 安装(但后来我重新格式化了它)。

你读过:

了吗?

不,不是。注册商是 Hover,他们通常做得很好。这很奇怪,在我 20 年的服务器设置经验中,我从未在域根目录的网站上遇到过问题……

我不记得它在我曾经在Hover拥有的那个域上起作用,但那已经是过去的事了。

您可以尝试将您的NS切换到CloudFlare,然后免费测试DNS是否是问题所在。

非常感谢您指出这一点。

您可以尝试将您的 NS 切换到 Cloudflare,然后测试 DNS 是否是问题所在,这无需任何费用。

抱歉问了愚蠢的问题,您的意思是将我的本地 DNS 服务器设置为 Cloudflare 吗?(我现在使用的是 8.8.8.8)还是为我的域名使用不同的 DNS 服务?

我问了 Hover,他们指向了这里:

你可以尝试使用 Glue 记录。这将使你的服务器成为 DNS 管理器,并将域名路由到你可以使用 Glue 记录设置的名称服务器。基本上,你的服务器就成了名称服务器。

Connecting your domain using private nameservers (Glue records) : Hover Customer Support

对我来说,这仍然像是一个红鲱鱼。我不明白为什么在 WordPress 或 Drupal 可以工作的相同情况下,Discourse 不能在域名的根目录工作?

不,我的意思是您不需要将域名从一个注册商转移到另一个注册商,但您需要更新 Hover 上域名的 NS 记录,将其指向不同的提供商的 DNS 以测试此理论。目前它们设置为 ns1.hover.comns2.hover.com

这是一个非常快速且几乎无痛的过程。如果您注册 CloudFlare,然后在那里尝试添加域名,他们会为您提供两个新的名称服务器,需要输入到 Hover。这里有一个关于 Hover 操作的指南:

我用 CloudFlare 以外的东西在 apex 上已经有一段时间了。我稍后会自己测试一下,看看是否能发现其他陷阱。大多数关于 apex 的问题都适用于 cname,但我现在看到你正在使用 a 记录。

我最好的猜测是,你进行了一些错误的配置重建,现在 Let’s Encrypt 由于速率限制而无法颁发证书。

如果是这种情况,你可以等一周,或者尝试使用 www 作为子域名,这在如今确实是个好主意。

你可以在 /var/discourse/shared/log/var-log/nginx/access.log 中查看日志,或者:

docker logs app

我预计你会看到证书不存在或无效的问题。

目前,我在 app.yml 中禁用了 SSL 并进行了重建,Discourse 现在可以在端口 80 上加载而无需子域。

我也正在使用 Hetzner DNS 作为权威 DNS。我不确定这是否是造成差异的原因,还是 Let’s Encrypt 证书失败的问题。在能够再次创建 Let’s Encrypt 证书并重新启用 SSL 后,我将再次进行重建并汇报。

如果您尝试重建的次数超过两次,您可能会被 Let’s Encrypt 限制。您可以通过在证书中添加另一个主机名来解决此问题。

是的,但我认为那些方向不再起作用了。
您无法连接到端口 443 的原因是证书已损坏,这会在 nginx 中导致错误。

感谢大家迅速回复。看起来确实只是 Let’s Encrypt 的速率限制问题。我在 Hover 上创建了一个新域名,这次 Discourse 安装顺利完成,没有使用子域名。

你好,@pfaffman 或其他任何人,有个愚蠢的问题:每次我运行 ./launcher rebuild app 时,Let’s Encrypt 证书都会更新吗?换句话说,如果我进行一些试错并连续多次重建(但不是完全从头开始)我的 Discourse 实例,我是否会遇到更多的速率限制?非常感谢。

我相当确定,如果您拥有有效的证书,它不会在每次重建时都请求它们。