nginx 为什么turbo_stream_from没有连接到我的staging环境中的rails后端?

qlfbtfca  于 5个月前  发布在  Nginx
关注(0)|答案(1)|浏览(54)

我的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。在我看来这没问题,但我在本地开发环境中看不到这一点。这可能无关紧要,我不知道
我在这里错过了什么?任何想法,我可能做错了什么?任何帮助,这将是非常感谢。

monwx1rj

monwx1rj1#

把我自己的问题写下来,这样有同样问题的人就可以找到这个。
原来是cable没有正确连接到redis。在nginx配置中添加proxy_http_version 1.1;/cable位置块修复了这个问题。

相关问题