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

您好,我正在尝试在一个全新的 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! ====================
1 个赞

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

1 个赞

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

$ 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) 有助于我们进行一些故障排除。目前,您要求我们在蒙着眼睛的情况下帮助诊断此问题,因此可能需要一段时间才能查明。

2 个赞

此实例是使用 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 操作的指南:

1 个赞

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

1 个赞

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

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

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

docker logs app

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

1 个赞

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

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

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

1 个赞

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

3 个赞

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

1 个赞

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

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

2 个赞