我尝试在 Rails 7.0.4 应用程序中使用 ActionCable 和 Turbo Stream,其中与 /cable 的 WebSocket 连接在生产环境中意外关闭。
红宝石3.0.5
64位亚马逊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,需要刷新页面才能看到更新。
我也在控制台中看到了这一点。
已在配置中尝试过此操作以允许所有网址。
config.action_cable.allowed_request_origins = [ %r{http://*}, %r{https://*} ]
没有真正的帮助。关于如何让这个东西在 Beanstalk 中工作有什么建议吗?
499 错误代码似乎表明客户端与 nginx 反向代理失去了连接。我在 AWS elastic beanstalk 文档中查找了您的反向代理。在示例配置中,我看到 AWS 建议添加超时。
尝试将其添加到您的 nginx 配置中:
keepalive_timeout 60;
这将使连接保持打开状态 60 秒 如 nginx 文档中所述;
也许这也是:
client_header_timeout 60;
client_body_timeout 60;
希望这有帮助。