很抱歉再次顶起这个话题,但它仍然相关。从 Discourse 的角度来看,一切安装都很顺利,看起来都没问题,但端口 80 和 443 却无法从公网访问。
更新:基本安装 确实可以在 Azure 上的 Ubuntu Server 上开箱即用。
这是我第二次尝试时所做的不同之处:
-
在创建虚拟机并运行
discourse-setup后,我没有中断该过程,因此所有步骤都一次性完成。第一次时,我意识到没有交换空间(swap),尽管
discourse-setup脚本会在缺失时自动设置,但我还是退出了 shell 去检查一些情况。随后,一些安装提示与 基本指南 中的不同,于是我再次退出了。+ 让我困惑的是 Let’s Encrypt 部分,它要求输入一个邮箱地址以接收相关通知,我当时误以为需要手动配置 HTTPS。实际上,该脚本会为 Discourse 实例自动配置 Let’s Encrypt 的 SSL 证书。
+ 另一个问题是 SMTP 用户名和密码部分;我仍不确定是否可以直接留空,但我只是填入了管理员邮箱地址及其密码。 -
手动设置交换空间,参考了 这篇 meta.discourse 帖子。
我不认为这与问题有关,但提一下以防万一。第二次操作时,我按照第一次的方式完成了所有步骤,除了:(1) 手动设置交换空间,以及 (2) 让
discourse-setupuninterrupted 运行。第一个实例或许还有救,但 Discourse 的架构对我来说仍然神秘,我不确定如何重启 HTTP/HTTPS 端点。对比
netstat -tulpn的输出可以清楚地看到,在第一个实例中,所有相关服务似乎都在运行并监听正确的端口(例如 PostgreSQL 在 5432,Redis 在 6379 等),唯独缺少端口 80 和 443 的条目(这表明 nginx 未运行):
第一个(失败的)实例:
$ sudo -s
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62396a99737c local_discourse/app "/sbin/boot" 14 hours ago Up 14 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp app
# docker exec -it 62396a99737c bash
(docker)# netstat -tulpn
Active Internet connections (only servers)
Proto Local Address Foreign Address State PID/Program name
tcp 127.0.0.1:3000 0.0.0.0:* LISTEN -
tcp 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp 0.0.0.0:6379 0.0.0.0:* LISTEN -
tcp6 :::5432 :::* LISTEN -
tcp6 :::6379 :::* LISTEN -
第二个实例:
(docker)# netstat -tulpn
Active Internet connections (only servers)
Proto Local Address Foreign Address State PID/Program name
tcp 0.0.0.0:6379 0.0.0.0:* LISTEN -
tcp 0.0.0.0:80 0.0.0.0:* LISTEN 2359/nginx: master
tcp 127.0.0.1:3000 0.0.0.0:* LISTEN -
tcp 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp 0.0.0.0:443 0.0.0.0:* LISTEN 2359/nginx: master
tcp6 :::6379 :::* LISTEN -
tcp6 :::5432 :::* LISTEN -
给未来的自己几点备注:
-
第一次操作时,我注意到缺少 80 和 443 的监听端口,但看到了
127.0.0.1:3000套接字(我记得这是默认的 Rails 端口)。当时我还没意识到可能是 nginx 没有运行,出于某种原因,我仍然怀疑是 Docker 端口映射的问题,于是我使用 netcat 做了一个简单的转发:在 Docker 内部:
nc -l -p 80 -c "nc 127.0.0.1 3000"
在 VM 的 Docker 外部:nc -zv localhost 80和curl localhost:80(这确认了 Docker 没有问题) -
我还曾怀疑 Azure 入站端口规则 有问题,因为
nc -zv一直返回Connection refused,但后来意识到这只意味着 端口是开放的,但另一端没有程序在监听。(如果端口被阻止,nc会一直挂起。)