Discourse 未提供页面

我在安装后运行 Discourse 时遇到了一些问题。

根据以下页面说明,运行 discourse-setup 脚本后,我应该能够访问配置的 URL。但看起来我还需要执行以下命令:
./launcher start app

不确定这是文档错误还是我操作有误?另外,我注意到执行上述命令后出现了以下现象:

  1. 访问配置的 URL 时能够加载网页。
  2. 加载的是“欢迎使用 Nginx”页面,而不是“恭喜,您已成功安装 Discourse!”页面。
  3. 稍等片刻(例如半分钟)后,“欢迎使用 Nginx”页面就无法加载了。
  4. 运行 ./launcher stop app 后再运行 ./launcher start app,发现“欢迎使用 Nginx”页面可以加载,但稍等片刻后同样无法加载。

此安装是在一台新的专用虚拟机上进行的,机器本身并未运行 Nginx,因此“欢迎使用 Nginx”页面来自运行 Discourse 的容器。

这些情况都不在预期之内。听起来你可能还运行着其他 nginx 实例?虚拟机上还有其他服务在运行吗?

1 个赞

这是不可能的,因为这是一个最简化的 CentOS 安装。我通过运行以下命令进行了检查:在没有运行容器的情况下,没有任何进程监听 80 或 443 端口。
lsof -i TCP

1 个赞

我目前的最佳猜测是,CentOS 与 discourse-setup 之间存在某些问题。最简单的办法是尝试使用 Ubuntu。否则,你需要密切关注脚本的执行过程,并尝试自行排查问题。

如果您遵循了以下安装指南(由一位不愿透露姓名的人推荐)::smiley:

您应该不会遇到任何问题。

https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md

1 个赞

唉,我其实试过了,但发现 19 和 20 LTS 的安装程序都在中途崩溃。两者都提示无法自动配置网络接口。如果禁用该接口,安装程序可以正常运行;但如果手动设置 IP,它们就会崩溃。

如果我禁用该接口以便继续安装,即使挂载了 ISO 并将其作为源,也无法安装网络工具来获取 ifconfig 命令。所以我有点束手无策了。

你好 @titusc

当你执行以下命令时看到了什么:

docker ps

你的意思是 Ubuntu 安装程序无法工作吗?

还是你正尝试用 IP 地址而不是域名来访问 Discourse?

1 个赞

我在安装 Discourse 时并没有使用 IP 地址,而是使用了一个在公共 DNS 上可解析的正规域名。

我的意思是,每当我在创建虚拟机时通过 Ubuntu ISO 镜像启动并尝试运行安装程序时,Ubuntu 安装程序总会崩溃。无论是 Ubuntu Server 19.10 还是 20.04 LTS 都会出现这种情况,并且在两次安装过程中,系统都会报告无法配置网络接口。如果就这样跳过,安装可以顺利完成,但我没有任何方法将网络接口启动起来以进行任何操作。我成功执行了以下命令:
ip address add <ip>/<mask> dev <interface>

但随后我无法通过运行以下命令将其启动:
ifup <interface>

之后,我将 ISO 挂载为回环设备并配置为软件源,然后尝试运行以下命令,但系统提示该命令在 ISO 中找不到:
apt install net-tools

如果在安装过程中手动设置带有网络详情的接口,这两个版本都会崩溃。

顺便提一下,我是在 ESXi 7.0 上执行此操作,使用的 ISO 文件如下:
ubuntu-20.04-live-server-amd64.iso
ubuntu-19.10-live-server-amd64.iso

这表明 Discourse 容器正在运行。每次我执行以下操作时:

  1. ./launcher start app
  2. 在浏览器中检查,会看到“欢迎使用 Nginx”页面,但大约半分钟后该页面就消失了。
  3. 运行 docker ps 以确认 Discourse 容器正在运行。
  4. 执行 ./launcher stop app./launcher start app
  5. 在浏览器中再次检查,会看到“欢迎使用 Nginx”页面,但大约半分钟后该页面又消失了。
  6. 运行 docker ps 以确认 Discourse 容器正在运行。

我还注意到,当我运行以下命令时,无法看到 Nginx 正在运行,但这可能是因为在我执行命令时它已经被停止了:
./launcher enter app
systemctl status nginx

@titusc

您尝试过重新构建应用吗?

/var/discourse/launcher rebuild app

通常情况下,根据容器完全启动所需的时间(取决于您的系统配置),它可能需要一段时间才能完全正常运行。

即使在我们拥有 64GB 内存和 8 个 CPU 核心的 Linux 机器上,我们也会等待大约整整一分钟,然后再切换到新容器。

1 个赞

你试过 18.04 吗?

这听起来像是一个环境问题,不过我们在这里无法为管理程序(hypervisors)和 Linux 发行版提供支持。推荐 DigitalOcean 的原因之一,就是其底层操作系统的安装具有一致性。如果你想从头构建虚拟机,需要提前自行解决相关问题。

一旦你拥有了一个可正常运行的操作系统,我们就可以协助你安装 Discourse 部分。

你好 @DBHacker,是的,我确实按顺序执行了以下操作:
./launcher rebuild app
./launcher start app

这是我意识到 ./discourse-setup 实际上只执行到 launcher 的重建部分之后做的。

@Stephen,是的,我需要先解决 Ubuntu 安装中的问题。老实说,我不太喜欢 Ubuntu,过去 15 年我一直使用 CentOS / RH。不过我想问的是,对于 CentOS / RH,你们是否期望我们进行某些特定的设置?

discourse-setup 脚本已在 Ubuntu 上经过测试并验证可用。

如果您使用的是其他发行版,可能需要手动执行部分或全部步骤。请查看该文件的内容,以了解其具体操作。

你好 @titusc

很抱歉你遇到了问题。

顺便提一下,你不需要在运行:

./launcher rebuild app

之后再运行:

./launcher start app

因为当你使用启动器脚本重建应用时(见下文),该脚本会在退出前重新启动容器。

以下是启动器代码的相关部分:

  rebuild)
      if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
        echo "Ensuring launcher is up to date"

        git remote update

        LOCAL=$(git rev-parse HEAD)
        REMOTE=$(git rev-parse @{u})
        BASE=$(git merge-base HEAD @{u})

        if [ $LOCAL = $REMOTE ]; then
          echo "Launcher is up-to-date"

        elif [ $LOCAL = $BASE ]; then
          echo "Updating Launcher..."
          git pull || (echo 'failed to update' && exit 1)

          echo "Launcher updated, restarting..."
          exec "$0" "${SAVED_ARGV[@]}"

        elif [ $REMOTE = $BASE ]; then
          echo "Your version of Launcher is ahead of origin"

        else
          echo "Launcher has diverged source, this is only expected in Dev mode"
        fi

      fi

      set_existing_container

      if [ ! -z $existing ]
        then
          echo "Stopping old container"
          (
            set -x
            $docker_path stop -t 60 $config
          )
      fi

      run_bootstrap

      if [ ! -z $existing ]
        then
          echo "Removing old container"
          (
            set -x
            $docker_path rm $config
          )
      fi

      run_start
      exit 0
      ;;

从脚本中你可以看到,rebuild 方法在退出前会尝试启动容器。

希望这能帮到你。

@neounix 你说得对。我会再次测试并检查这个问题。希望这就是原因。我不确定如果容器已经启动,而我再次运行 ./launcher start app 会有什么表现。

亲爱的 @titusc

抱歉无法详细回复,因为我得赶去进行一次长途旅行。

许多人在构建、重建 Docker 镜像和容器时容易出错,从而陷入麻烦。

你可以考虑在适当的时候清理(修剪)你“积累”的 Docker 镜像和未使用的容器。

例如(凭记忆快速列出):

docker ps -a
docker images
docker system prune -a

你应该停止所有“异常”容器,删除它们,并清除所有旧的 Docker 镜像。

我得先走了……

希望这能帮到你。

1 个赞

@neounix 同意检查 Docker 镜像。我确实已经做过这个检查,但让我详细展示给你看。如下所示,Discourse 已成功构建并开始在一个 Docker 容器中运行。在末尾你可以看到 Nginx 在容器中运行,但仅运行了大约 5 秒后就退出了。

在一切开始之前

[root@uat discourse]# pwd
/var/discourse
[root@uat discourse]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@uat discourse]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@uat discourse]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
discourse/base      2.0.20200724-1815   6ba1506bf822        9 days ago          2.38GB
centos              latest              831691599b88        6 weeks ago         215MB
alpine              latest              a24bb4013296        2 months ago        5.57MB

确认主机上没有运行 HTTP 服务器

[root@uat discourse]# systemctl status nginx
Unit nginx.service could not be found.
[root@uat discourse]# lsof -i TCP
COMMAND  PID    USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
systemd    1    root  181u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
systemd    1    root  183u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1070     rpc    4u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1070     rpc    6u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
sshd    1234    root    5u  IPv4   26444      0t0  TCP *:ssh (LISTEN)
sshd    1234    root    7u  IPv6   26446      0t0  TCP *:ssh (LISTEN)
cupsd   1240    root    9u  IPv6   27746      0t0  TCP localhost:ipp (LISTEN)
cupsd   1240    root   10u  IPv4   27747      0t0  TCP localhost:ipp (LISTEN)
dnsmasq 2094 dnsmasq    6u  IPv4   37419      0t0  TCP uat:domain (LISTEN)
sshd    7102    root    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)
sshd    7156    tech    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)

重新构建 Discourse

[root@uat discourse]# ./launcher rebuild app
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
cd /pups && git pull && /pups/bin/pups --stdin
Already up to date.
......................................................................
I, [2020-08-03T06:54:22.114365 #1]  INFO -- : > echo "Beginning of custom commands"
I, [2020-08-03T06:54:22.116739 #1]  INFO -- : Beginning of custom commands

I, [2020-08-03T06:54:22.116996 #1]  INFO -- : > echo "End of custom commands"
I, [2020-08-03T06:54:22.119862 #1]  INFO -- : End of custom commands

I, [2020-08-03T06:54:22.119983 #1]  INFO -- : Terminating async processes
I, [2020-08-03T06:54:22.120021 #1]  INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/12/bin/postmaster -D /etc/postgresql/12/main pid: 49
I, [2020-08-03T06:54:22.120086 #1]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 166
166:signal-handler (1596437662) Received SIGTERM scheduling shutdown...
2020-08-03 06:54:22.120 UTC [49] LOG:  received fast shutdown request
2020-08-03 06:54:22.121 UTC [49] LOG:  aborting any active transactions
2020-08-03 06:54:22.128 UTC [49] LOG:  background worker "logical replication launcher" (PID 58) exited with exit code 1
2020-08-03 06:54:22.128 UTC [53] LOG:  shutting down
2020-08-03 06:54:22.154 UTC [49] LOG:  database system is shut down
166:M 03 Aug 2020 06:54:22.176 # User requested shutdown...
166:M 03 Aug 2020 06:54:22.176 * Saving the final RDB snapshot before exiting.
166:M 03 Aug 2020 06:54:22.184 * DB saved on disk
166:M 03 Aug 2020 06:54:22.184 # Redis is now ready to exit, bye bye...
sha256:7b8e9281c49ba3dc37e0743a765cddc13ab73aae5486bd30722c696c2e1443b1
ce327c6e37246e63331f03b07d64f4882efa68e88cb1516c6343a9dddbbd59df

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=4 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e LETSENCRYPT_DIR=/shared/letsencrypt -e DISCOURSE_HOSTNAME=uat.xxxxxx.com -e DISCOURSE_DEVELOPER_EMAILS=support@xxxxxx.com -e DISCOURSE_SMTP_ADDRESS=smtp-relay.xxxxxx.com -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=support@xxxxxx.com -e DISCOURSE_SMTP_PASSWORD=support@xxxxxx.com -e LETSENCRYPT_ACCOUNT_EMAIL=me@example.com -h uat-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:fe:39:ba:65:e1 local_discourse/app /sbin/boot
44c604ccbda4bfb4d48722e1cbbf70e3b067531acda41175f6bdaaa013cc6d18

确认镜像已构建且 Docker 正在运行

[root@uat discourse]# docker container ls -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                      NAMES
44c604ccbda4        local_discourse/app   "/sbin/boot"        7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   app
[root@uat discourse]# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                      NAMES
44c604ccbda4        local_discourse/app   "/sbin/boot"        7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   app
[root@uat discourse]# docker image ls
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
local_discourse/app   latest              7b8e9281c49b        8 minutes ago       2.66GB
discourse/base        2.0.20200724-1815   6ba1506bf822        9 days ago          2.38GB
centos                latest              831691599b88        6 weeks ago         215MB
alpine                latest              a24bb4013296        2 months ago        5.57MB

确认主机上没有任何进程仍在运行,且 Docker 正在监听端口 80 和 443

[root@uat discourse]# systemctl status nginx
Unit nginx.service could not be found.
[root@uat discourse]#
[root@uat discourse]# lsof -i TCP
COMMAND     PID    USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
systemd       1    root  181u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
systemd       1    root  183u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
rpcbind    1070     rpc    4u  IPv4   19283      0t0  TCP *:sunrpc (LISTEN)
rpcbind    1070     rpc    6u  IPv6   19285      0t0  TCP *:sunrpc (LISTEN)
sshd       1234    root    5u  IPv4   26444      0t0  TCP *:ssh (LISTEN)
sshd       1234    root    7u  IPv6   26446      0t0  TCP *:ssh (LISTEN)
cupsd      1240    root    9u  IPv6   27746      0t0  TCP localhost:ipp (LISTEN)
cupsd      1240    root   10u  IPv4   27747      0t0  TCP localhost:ipp (LISTEN)
dnsmasq    2094 dnsmasq    6u  IPv4   37419      0t0  TCP uat:domain (LISTEN)
sshd       7102    root    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)
sshd       7156    tech    5u  IPv4 2072827      0t0  TCP uat:ssh->10.1.136.4:52229 (ESTABLISHED)
docker-pr 12991    root    4u  IPv6 2242261      0t0  TCP *:https (LISTEN)
docker-pr 13003    root    4u  IPv6 2242288      0t0  TCP *:http (LISTEN)

重启 Docker 并在 Nginx 停止后检查 Nginx

[root@uat discourse]# ./launcher stop app
+ /usr/bin/docker stop -t 10 app
app
[root@uat discourse]# ./launcher start app; ./launcher enter app

starting up existing container
+ /usr/bin/docker start app
app
root@uat-app:/var/www/discourse# date; ps -ef | grep nginx
Mon 03 Aug 2020 07:29:47 AM UTC
root        34     1  0 07:29 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/letsencrypt.conf
www-data    36    34  0 07:29 ?        00:00:00 nginx: worker process
www-data    37    34  0 07:29 ?        00:00:00 nginx: worker process
root      1091   398  0 07:29 pts/1    00:00:00 grep nginx
root@uat-app:/var/www/discourse# date; ps -ef | grep nginx
Mon 03 Aug 2020 07:29:50 AM UTC
root        34     1  0 07:29 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/letsencrypt.conf
www-data    36    34  0 07:29 ?        00:00:00 nginx: worker process
www-data    37    34  0 07:29 ?        00:00:00 nginx: worker process
root      1854   398  0 07:29 pts/1    00:00:00 grep nginx
root@uat-app:/var/www/discourse# date; ps -ef | grep nginx
Mon 03 Aug 2020 07:29:52 AM UTC
root      2043  2038  0 07:29 ?        00:00:00 runsv nginx
root      2080   398  0 07:29 pts/1    00:00:00 grep nginx
root@uat-app:/var/www/discourse#
1 个赞

你好 @titusc

感谢你的精彩帖子和详尽的故障排查信息。做得非常好。

你检查过应用中的 nginx 日志文件以寻找线索吗?

您的设置中存在一些问题。我推测,导致 Ubuntu 无法安装的问题同样也会干扰 CentOS 的安装。

在部署 Discourse(或任何其他软件)之前,您需要先解决这些问题。