欢迎使用 nginx!全新安装后

你好,

我是 Discourse 的新手,在安装过程中遇到了问题。我创建了一台 Ubuntu Server 18.04 虚拟机,然后大致遵循了 安装说明

所谓“大致”,是指我没有使用云服务器,而是使用了 Ubuntu Server。我没有手动安装 Docker,而是让 discourse-setup 自动为我安装。此外,我尚未配置邮件服务器,但在安装过程中提供了合理的回答。不确定这是否是导致问题的关键。DNS 已正确配置,服务器也分配了静态 IP 地址。

在引导过程结束后,当我访问服务器的完全限定域名(FQDN)时,看到的是“Welcome to nginx!”页面,而不是“Congratulations, you installed Discourse!”页面。

此安装仅用于实验室环境,不会对外公开访问。

Marc。

服务器上是否安装了 nginx?不应该安装。但 discourse-setup 应该能检测到这一点。你确定 DNS 配置正确吗?

服务器上未安装 Nginx。就 DNS 而言,我已为该服务器配置了 A 记录和 PTR 记录。还有哪些其他要求?

Marc。

唯一能看到该页面的情况是:你将 DNS 指向了错误的服务器,或者 NGINX 位于容器外部,占用了 80 端口,导致容器无法响应。

如果我将网络浏览器直接指向服务器的 IP 地址,也会看到 Nginx 欢迎页面。

在通过 SSH 登录到 Ubuntu 服务器后:
marc@community:~$ locate nginx
/var/discourse/image/base/install-nginx
marc@community:~$

此外,在 Ubuntu 服务器上执行:
sudo find / -iname "*nginx*"
…在 /var/lib/docker/overlay2 下找到了大量文件…
/var/discourse/image/base/install-nginx
/var/discourse/shared/standalone/letsencrypt/deploy/nginx.sh
/var/discourse/shared/standalone/log/var-log/nginx

请展示以下命令的结果:

lsof -i:80

命令 lsof -i:80 没有输出任何内容。

那么端口 80 上没有任何程序在监听?

如果 Docker 正在监听 :80 端口(任何成功的安装都会实现这一点,并且容器内的 nginx 需要此条件才能看到内容),您应该会看到类似以下内容:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 890 root    4u  IPv6 961922      0t0  TCP *:http (LISTEN)

如果容器外部未安装 nginx,且 Docker 也未监听该端口,那么您能看到 nginx 欢迎页面的唯一可能就是网络配置有误。

看起来您是对的。在您的笔记本电脑上对服务器 IP 地址运行 nmap 的输出结果:

Starting Nmap 7.01 ( https://nmap.org ) at 2020-04-10 23:34 AEST
Nmap scan report for community.aureus-group-sb.com (192.168.12.35)
Host is up (0.0010s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
22/tcp open ssh
MAC Address: 0C:8B:FD:CD:AF:EB (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 1.74 seconds

请记住,网络问题可能包括但不限于:

  • 虚拟机上的策略阻止了访问(如 ufw 或类似工具)
  • 虚拟服务器上的策略阻止了访问(网络模式配置不正确)
  • 网络策略配置不正确(子网间的访问控制列表 ACL)
  • DNS 配置错误

只有当以上情况均不存在时,才可能是 Discourse 本身的问题。您正在遵循标准安装流程,但据您自己所述,您部署的环境绝非标准环境。

如果您的组织可以承担每月 5 美元的费用,从时间成本角度来看,将服务部署到云端,并将云 VPS 防火墙限制为仅向您的环境返回页面,可能更为划算。

目前,我主要关注的是学习如何搭建这套系统。一旦掌握,我们肯定会考虑托管选项。

关于您列出的网络方面:

  • ufw 处于非活动状态,而 iptables 正在运行:我对 Ubuntu 服务器的默认安装未做任何更改。
  • 查看 iptables 配置,input 链的策略是接受所有流量,output 链也是如此。forward 链包含一些与 Docker 相关的引用(见下文)。
  • 虚拟机的唯一 vNIC 配置为桥接模式——直接连接到物理网络。
  • 我工作的笔记本电脑和虚拟机位于同一子网。
  • 我不确定 DNS 的具体要求是什么。我尝试查找相关规范,但未能找到明确的文档。就 DNS 而言,我可以通过主机名、FQDN 和 IP 地址 ping 通服务器。我不确定是否还需要配置其他与 DNS 相关的内容。

VM 与外部世界之间存在哪些网络策略?

如果 git pull 成功,并且您能够运行 discourse-setup,那么有什么会阻止它连接到 GitHub 以下载容器内容吗?

如果服务器无法通过公网地址访问,Let’s Encrypt 将会失败,那么您是否修改了 YML 文件以禁用 HTTPS?

虚拟机可以连接互联网,且访问 GitHub 没有任何限制。在运行 discourse-setup 时,我留空了选项 Let’s Encrypt 账户邮箱?(按 ENTER 跳过)[me@example.com]:。我没有修改任何 YML 文件。

将该字段留空意味着您将不会收到有关证书问题的警报,但这并不会阻止容器尝试启用 Let’s Encrypt。

好的,我们已经指出了一些较大的问题,但它们与原始发帖人无关。您的网络中某处有 nginx 在运行并显示一个页面,但根据您的虚拟机测试,您并未安装 nginx,也没有 Docker 在监听。

在弄清楚这是如何发生的之后,第二步将是正确配置 YML 文件。目前,您需要找到该页面的来源。

我也这么想。让我查一下,看看那个页面是从哪儿来的。

以下是我所了解的情况。如果我关闭服务器,则无法 ping 通它(IP 地址、主机名和 FQDN)。当我在浏览器中访问该 IP 地址时,Firefox 会显示标准的“无法连接”页面。

因此,我得出结论:不存在 IP 地址冲突。

在启动虚拟机后,我现在也无法通过浏览器连接,再次看到标准的“无法连接”页面。此行为现在与 lsof -i:80 输出所预期的结果一致。

我通过 docker exec -it <cont.id> /bin/bash 进入容器内部,并检查了 ps aux 的输出。其中包含以下行:

root 2030 0.2 0.0 2160 1328 ? Ss 14:10 0:01 runsv nginx

因此看起来 nginx 正在容器内运行,但 nsenter -t 1446 -n netstat -plnt 的输出显示:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      3606/unicorn master 
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      3590/postmaster     
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      3591/redis-server * 
tcp6       0      0 :::5432                 :::*                    LISTEN      3590/postmaster     
tcp6       0      0 :::6379                 :::*                    LISTEN      3591/redis-server *

这是否表明该容器没有在端口 80 和 443 上监听?