Rails - 操作电缆上的服务器阻塞

时间:2018-01-24 21:41:06

标签: ruby-on-rails actioncable

我有一个Rails应用程序,可以在开发中完美运行。我已经部署到服务器和应用程序加载并正确显示其登陆和页面。但是,当我转到带有Action Cable的页面时,服务器会阻塞。网页上的最后一个请求是Action Cable相关的,以及进一步的页面操作(表单提交,甚至是重新加载)而没有响应。

我已将其隔离到服务器,因为尝试从其他浏览器加载网站的主页无效。关闭首次发出Action Cable请求的选项卡会立即加载另一个页面(并且突然处理第一页中的所有待处理请求)。

我没有在production.log中看到任何错误,但这里是导致挂起的部分:

I, [2018-01-24T21:12:38.601260 #9840]  INFO -- : [86b3fcc1-cebd-4d70-99ff-b6f9f147bc00]   Rendered collection of skill_checks/_skill_check.html.erb [5 times] (16.7ms)
I, [2018-01-24T21:12:38.601352 #9840]  INFO -- : [86b3fcc1-cebd-4d70-99ff-b6f9f147bc00]   Rendered rooms/show.html.erb within layouts/application (26.6ms)
I, [2018-01-24T21:12:38.602314 #9840]  INFO -- : [86b3fcc1-cebd-4d70-99ff-b6f9f147bc00] Completed 200 OK in 32ms (Views: 26.7ms | ActiveRecord: 1.8ms)
I, [2018-01-24T21:12:38.740061 #9840]  INFO -- : [5a06a7d8-a4a5-4ab4-8287-377dfa3447fe] Started GET "/cable" for 65.99.102.74 at 2018-01-24 21:12:38 +0000
I, [2018-01-24T21:12:38.740860 #9840]  INFO -- : [5a06a7d8-a4a5-4ab4-8287-377dfa3447fe] Started GET "/cable/" [WebSocket] for 65.99.102.74 at 2018-01-24 21:12:38 +0000
I, [2018-01-24T21:12:38.740970 #9840]  INFO -- : [5a06a7d8-a4a5-4ab4-8287-377dfa3447fe] Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: websocket)
I, [2018-01-24T21:12:38.794498 #9840]  INFO -- : RoomsChannel is transmitting the subscription confirmation
I, [2018-01-24T21:12:38.795245 #9840]  INFO -- : RoomsChannel is streaming from room_helloworld

关闭违规标签后,继续加载(在这种情况下,是在页面重新加载时触发的javascript请求),如下所示:

I, [2018-01-24T21:15:55.109087 #9840]  INFO -- : Finished "/cable/" [WebSocket] for 65.99.102.74 at 2018-01-24 21:15:55 +0000
I, [2018-01-24T21:15:55.109342 #9840]  INFO -- : RoomsChannel stopped streaming from room_helloworld
I, [2018-01-24T21:15:55.110922 #9840]  INFO -- : [2cf5cc53-2f44-42a9-be30-496bb80646a0] Started GET "/rooms/helloworld?update=true" for 65.99.102.74 at 2018-01-24 21:15:55 +0000
I, [2018-01-24T21:15:55.112841 #9840]  INFO -- : [2cf5cc53-2f44-42a9-be30-496bb80646a0] Processing by RoomsController#show as HTML

我截断了剩下的部分;那里没有任何失败或任何其他感兴趣的东西。

我确实有一台redis服务器在同一台服务器上运行,并将其端口信息放在production:section下的config / cable.yml中。

我相信Rails可以看到它,因为我没有看到任何错误。另外,为了验证这一点,我通过redis-cli连接到redis并订阅了一个频道,然后通过Rails控制台向该频道发送了一条广播消息并验证了收据。

更新:我尝试了一些不同的版本来解决问题。这就是我现在所知道的:

  • 我删除了对ActionCable.server.broadcast的唯一调用,因此不是该块的来源。
  • 我将javascript控制台日志添加到已连接,已断开连接和已接收。客户端成功订阅。
  • 我尝试了一个构建,我从客户端删除了App.cable.subscriptions.create。虽然在这种情况下没有websocket连接(如您所料),但服务器不会阻塞/挂起。

鉴于上述情况,我确信这与ActionCable有关,但我不确定它是否与我的redis配置有关。

1 个答案:

答案 0 :(得分:1)

如果你没有在你的nginx conf文件中设置以下行(在服务器部分内),这就是你得到的行为:

location /cable {
    passenger_app_group_name your_app_websocket;
    passenger_force_max_concurrent_requests_per_process 0;
}

其中,如果您的应用名称是"聊天",则第一行会显示:

passenger_app_group_name chat_action_cable

坦率地说,我不确定在哪里定义,但它可能是Rails魔法的一部分。