提问人:Yoonjae Yoo 提问时间:7/26/2016 最后编辑:Yoonjae Yoo 更新时间:3/1/2018 访问量:4162
Rails5 + ActionCable:WebSocket 与“ws://{hostname}/cable”的连接失败:WebSocket 在建立连接之前关闭
Rails5 + ActionCable: WebSocket connection to 'ws://{hostname}/cable' failed: WebSocket is closed before the connection is established
问:
我在连接到我的 Rails 5 + ActionCable 应用程序时进入了我的 chrome 浏览器。在我的本地开发环境中,它不会发生。它只发生在我的暂存和生产环境中。WebSocket connection to 'ws://{hostname}/cable' failed: WebSocket is closed before the connection is established.
我使用 Amazon ElasticBeanstalk 来部署我的应用程序。在使用 chrome 开发人员工具监控请求后,我发现与开发环境不同,WebSocket 请求在暂存,生产环境没有得到响应(待处理),因此 ActionCable 不断尝试连接到 WebSocket 端点(ws://{hostname}/cable)。
问题是,在我的 puma.log 中,它说了这样的话:
I, [2016-07-26T13:45:53.921154 #32369] INFO -- : Registered connection (Z2lkOi8vYXNrLWNvLWRlL1VzZXIvMg)
I, [2016-07-26T13:46:05.775788 #32369] INFO -- : Finished "/cable/" [WebSocket] for 121.166.105.106 at 2016-07-26 13:46:05 +0000
I, [2016-07-26T13:46:18.074895 #32369] INFO -- : [917fd706-4f1a-4178-bd95-7a33c0c7b621] Started GET "/cable" for 121.166.105.106 at 2016-07-26 13:46:18 +0000
I, [2016-07-26T13:46:18.075764 #32369] INFO -- : [917fd706-4f1a-4178-bd95-7a33c0c7b621] Started GET "/cable/" [WebSocket] for 121.166.105.106 at 2016-07-26 13:46:18 +0000
I, [2016-07-26T13:46:18.075817 #32369] INFO -- : [917fd706-4f1a-4178-bd95-7a33c0c7b621] Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
也就是说,升级到 WebSocket 已成功,但其余部分未知。你对解决这个问题有任何线索吗?
答:
0赞
sebisnow
3/1/2018
#1
正如问题的作者已经评论的那样,websocket 连接中出现此故障的可能原因是由于在配置错误的 Loadbalancer 后面时请求重写。
例如,我遇到了一个配置错误的 Apache Server,其中重写规则已经到位,用于将使用的协议从 http 重写为 rails 应用程序的 ws。
如果它对其他人有帮助,这里是在这种情况下启用 websocket 的工作 Apache VHost 配置。
<VirtualHost domain.of.the.rails-app:80>
ServerName domain.of.the.rails-app
DocumentRoot /var/www/apps/rails-app/public
ProxyPreserveHost On
ProxyPass /error-documents !
ErrorDocument 503 /error-documents/503.html
Alias /error-documents /var/www/apps/rails-app/public
ProxyPass / http://0.0.0.0:3000/
ProxyPassReverse / http://0.0.0.0:3000/
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} websocket [NC]
RewriteRule /(.*) ws://localhost:3000/$1 [P]
</VirtualHost>
评论