在 haproxy 后运行 2 台主机时出现随机 404 错误

今天我尝试添加第二台服务器来托管我们的一个 Discourse 实例。该容器配置为使用外部 Redis、PostgreSQL 和存储服务器,仅作为 Web 应用运行。到目前为止,我们一直将单服务器站点部署在 HAProxy 后面,运行正常。当在 HAProxy 后面运行两台服务器时,我们观察到 Nginx 返回大量针对 JS 文件的 404 错误。从 HAProxy 中移除任意一台服务器后,问题即消失。这些返回 404 的文件 URL 看起来完全相同,因此我百思不得其解,为何两台服务器都无法提供这些文件。

开发者设置中没有进行任何覆盖。我们运行的是 2.4.3 稳定版。

1 个赞

如果您运行了多个 Web 容器,您需要某种机制来确保它们都能访问静态文件。

最简单的方案是 使用对象存储处理上传(S3 克隆)

4 个赞

@Falco 您好,感谢您的回复。这两个服务器通过 NFS 使用共享存储。在我的容器配置中,我有以下内容:

volumes:
  - volume:
      host: {{ discourse_nas_path }}/data
      guest: /shared
  - volume:
      host: {{ discourse_nas_path }}/logs
      guest: /var/log

不过,每个容器都存储由 assets:precompile 步骤生成的资产的独立副本。是否必须共享预编译后的资产?

1 个赞

除了添加和移除 Haproxy 后端之外,你还做了哪些测试?

你的 Haproxy 配置是随机选择后端还是保持会话亲和性?404 错误是由 Haproxy 记录的吗?是由 nginx 记录的吗?是第一个还是第二个后端报错?你的网站是否需要登录?你能否绕过代理服务器直接连接 nginx 来复现这些错误?请求的文件在磁盘上是否存在?是所有 JS 文件都报错,还是只有特定的几个?

3 个赞

感谢 @Falco 的提示,我在容器配置中添加了以下内容,现在一切按预期运行:

  - volume:
      host: {{ discourse_nas_path }}/assets
      guest: /var/www/discourse/public/assets
3 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.