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

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

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

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

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

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

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

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

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

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

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

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