具有 Elastic Beanstalk 和 Classic Load Balancer 499 NGINX 代码的 ActionCable

ActionCable With Elastic Beanstalk and Classic Load Balancer 499 NGINX Code

提问人:Daniel Willems 提问时间:11/16/2023 最后编辑:Daniel Willems 更新时间:11/16/2023 访问量:20

问:

在过去的 2 天里,这个问题已经丢失了。

我正在尝试在我的 Rails 7.0.4 应用程序中使用 ActionCable,其中与 /cable 的 WebSocket 连接在生产环境中意外关闭。

红宝石 3.0.5

64 位 Amazon Linux 2/3.6.3

使用 Turbo Streams 和 OpenAI 实现此聊天

https://gist.github.com/alexrudall/cb5ee1e109353ef358adb4e66631799d

在开发过程中不会出现此问题,一切都在那里完美运行。

Redis 电缆配置

production:
  adapter: redis
  url: <%= "redis://#{ENV.fetch('REDIS_HOST', 'localhost')}:6379/1"%>
  channel_prefix: fist_bump_production

REDIS_HOST 是 AWS Elasticache 服务终端节点,并且已经测试了该终端节点是否适用于 Sidekiq。

首先,我在生产中使用 /cable 遇到了 404 问题,但后来我将其添加到配置中。

location /cable {
  proxy_pass http://my_app;
  proxy_http_version 1.1;
  proxy_set_header Upgrade websocket;
  proxy_set_header Connection "upgrade";
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

不再有 404,但后来我开始收到 499,需要刷新页面才能看到更新。

我也在控制台中看到了这一点。

image of console output

在配置中尝试过此操作以允许所有 URL。

config.action_cable.allowed_request_origins = [ %r{http://*}, %r{https://*} ]
  • 我增加了 Classic Load Balancer 的粘性。
  • 在 80 和 443 上将侦听器更改为 TCP。
  • 阅读大约 3 页的 Google 结果。
  • 试图从AWS“专家”那里获得帮助(我不得不解释Rails是什么)

没有真正的帮助。关于如何在 Beanstalk 中让这个东西工作的任何建议?

Ruby-on-Rails 网络服务 NGINX 亚马逊弹性 Beanstalk 操作电缆

评论


答:

0赞 Max Visser 11/22/2023 #1

499 错误代码似乎指向客户端失去与 nginx 反向代理的连接。我在反向代理的 AWS elastic beanstalk 文档中找到了您。在示例配置中,我看到AWS建议添加超时。

尝试将其添加到您的 nginx conf 中:

      keepalive_timeout     60;

这将使连接保持打开 60 秒,如 nginx 文档中所述;

也许这也是:

      client_header_timeout 60;
      client_body_timeout   60;

希望这会有所帮助。

评论

0赞 Daniel Willems 11/28/2023
谢谢 Max,在尝试了多天后,我最终放弃了,实际上转向了直接在 AWS 上部署的不同方式。当然,一旦我这样做了,一切都很完美。我不确定该设置是否与ELB中的粘性设置相同,后者也根本不起作用。