nginx 502错误

你好,

我刚运行了 ./launcher rebuild app,表面上没有报错。但当我尝试打开网站时,却收到了 502 错误。

Nginx 错误日志(shared/standalone/log/var-log/nginx/error.log)显示:

2020/08/12 05:47:43 [error] 653#653: *7 connect() failed (111: Connection refused) while connecting to upstream, client: [...], server: _, request: "GET / HTTP/2.0", upstream: "http://127.0.0.1:3000/", host: "[...]"

我已经查阅了所有关于 Discourse 和 Nginx 502 错误的相关帖子,但未能找到或理解任何与我的情况相符的内容。

这可能相关,这是在容器内运行的结果:

# netstat -plant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      644/nginx: master p 
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      644/nginx: master p 
tcp6       0      0 :::6379                 :::*                    LISTEN      -                   
tcp6       0      0 :::5432                 :::*                    LISTEN      -

是否应该有某个服务在 3000 端口运行?

能否请您指导我,应该从哪里入手查找更多信息以调试此问题?

pura vida :slight_smile:

最初会显示 502 错误,因为容器内的服务正在启动。该错误应在 30 秒内消失。如果未消失,可能是您的服务器 CPU 负载过高,导致响应变慢。

谢谢 @itsbhanusharma

我运行了 ./launcher restart app 并用 top 监控了负载,目前远低于 10%。

我认为 CPU 应该足以应对负载:

$ cat /proc/cpuinfo  | grep 'name' | uniq
model name      : Intel(R) Xeon(R) CPU E5-1650 v3 @ 3.50GHz
$ cat /proc/cpuinfo  | grep process | wc -l
4

有没有更好的方法来调试容器的启动过程?
还有其他建议吗?

安装了哪些插件?这台服务器使用的是 SSD 吗?

我刚克隆了仓库并运行了设置命令,所以我想它只包含默认插件?我不确定在哪里查看,但我肯定没有添加任何插件。

服务器不是 SSD。

@elopio

你能否发布你的‘yml’文件,但请去掉任何敏感信息?

好的,它在这里:

Discourse 需要 SSD,普通的机械硬盘无法提供足够的 IOPS。

这就是导致 502 错误的原因吗?还是说即使没有 SSD,网站也能正常运行,只是速度非常慢?

使用传统机械硬盘与 SSD 硬盘不应导致 502 错误。这不太可能,正如你的问题所示 @elopio

这里有一篇可能有帮助的简短说明:

在我看来,最好的做法是打开几个终端,对 Rails 和 nginx 的日志文件(包括错误日志和访问日志)运行 tail -f,然后尝试访问,确保在看到 502 错误时,你的注意力集中在日志文件的末尾。

你知道这些日志文件存放在哪里,以及如何在终端中对它们运行 tail -f 命令吗?


注意,你之前问过:

Rails 在 Docker 容器内的 3000 端口运行,且该端口未向容器外部暴露。这就是为什么你在容器外部运行 netstat 时看不到 3000 端口的原因。

希望这能帮到你。

根据经验,缓慢的 I/O 绝对会导致超时和 502 错误。

SSD 级别的 IOPS 是硬性要求。

哇,查看 Rails 日志时,我发现 Unicorn 日志非常大,抱怨了一些权限错误。我执行了 rm -rf tmp/cache/bootsnap-compile-cache/ 删除了该目录,现在我看到祝贺屏幕了!!!

谢谢大家。在决定将其重新部署到 SSD 服务器之前,我会再稍微玩一下这个环境。

不客气,@elopio

很高兴你从日志中找到了问题并成功解决。做得好。

祝你后续一切顺利!

好的,这运行得非常出色。我想展示一下我们正在做的事情:

https://bunqueer.jaquerespeis.org/

这是哥斯达黎加黑客空间从 Telegram 迁移到 Discourse 的项目 :slight_smile: 我们还有很多事情要做,但这次我确信我们一定能彻底告别聊天室。非常感谢 Discourse 团队!