我的rails应用程序中的一个视图使用<%= turbo_stream_from session["_csrf_token"] %>
订阅了一个turbo流通道。(我使用csrf令牌作为通道名称,因为流是针对每个会话的。)在我的控制器中,有一个触发Turbo::StreamsChannel.broadcast_replace_to session["_csrf_token"], partial: "devise/registrations/creating", target: "registration_new_full_page"
的操作。该操作在重定向之前将注册表单替换为加载视图,假设注册成功。
在我使用http://127.0.0.1:3000访问的本地开发环境中,一切正常。当加载注册页面时,日志显示Turbo::StreamsChannel is streaming from TrJhUDOIuzZEKUER3tuC6qsNRsKovL6XEI63bKSuXrk
,这是我所期望的。
不幸的是,在我的临时环境中,不再显示确切的日志行。没有收到广播的更新,什么也没有发生。此外,浏览器中注册页面的HTML显示本地开发环境的<turbo-cable-stream-source channel="Turbo::StreamsChannel" signed-stream-name="..." connected=""></turbo-cable-stream-source>
,但在临时环境中,同一行缺少connected=""
。
我的staging环境使用nginx将请求代理到rails(运行在不同的机器上)。我的nginx配置包含以下内容:
map $http_host $rails {
myapp.com 123.123.123.123;
myapp-staging.com 234.234.234.234;
}
...
location /cable {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Ssl on; # Optional
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://$rails;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Ssl on; # Optional
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_read_timeout 120;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_pass http://$rails;
}
字符串
我在浏览器控制台中没有看到任何本地开发环境中没有出现的消息。
应用程序使用Rails 7.1.2。在Rails或nginx日志中没有显示任何错误。
我尝试用静态字符串而不是crsf-token订阅一个频道,但也不起作用。我真的不明白,看起来rails只是简单地忽略了频道订阅和广播。
我注意到开发环境和暂存环境之间的另一个区别是,在开发工具的浏览器网络选项卡中,每隔10秒就会向wss://myapp-staging.com/cable
发送一个新的keepalive get请求,返回101 http状态,并在rails日志中显示为Successfully upgraded to WebSocket
。在我看来这没问题,但我在本地开发环境中看不到这一点。这可能无关紧要,我不知道
我在这里错过了什么?任何想法,我可能做错了什么?任何帮助,这将是非常感谢。
1条答案
按热度按时间monwx1rj1#
把我自己的问题写下来,这样有同样问题的人就可以找到这个。
原来是cable没有正确连接到redis。在nginx配置中添加
proxy_http_version 1.1;
到/cable
位置块修复了这个问题。