部署 用 Passenger Standalone 部署 Action Cable 过一段时间就断开然后就连不上了

hui_green · 2016年12月14日 · 最后由 mimosa 回复于 2016年12月17日 · 2237 次阅读

我在本地也架设了 passenger standalone 服务器,测试目前为止一切正常,但是部署到产品服务器以后,有 3 个奇怪的问题:

  1. chrome 一直连不上,提示 WebSocket is closed before the connection is established
  2. firefox 开始是正常连接并且传输数据的,但是过一段时间(貌似是在接收过数据以后,但不是马上就断)就自动断开,再连就连不上了,服务器运行正常,但是接收不到浏览器的连接请求
  3. 有一次服务器断开连接是因为 Request queue full (configured max. size: 100),这个我觉得不太可能,因为只是小范围测试没有这么多请求(而且我在客户端设置了如果连接三次不成功就放弃)

对服务器部署这方面知识欠缺,现在一头雾水,有没有明白的大神给个提示,感激不尽

需要调整 ulimit

因为一个服务器的连接数数有限的,你的网站跑起来以后可能存在许多未释放的连接,或用户关闭了,没有正常释放,但服务器那边可能需要等待一段时间才会释放,所以连接数被占用到一定量的时候,新的连接就进不去了。

https://ruby-china.org/topics/29346

passenger_force_max_concurrent_requests_per_process 0;

#1 楼 @huacnlee 十分感谢,这个帖子我看过,因为我的连接数只有几个,暂时不会是 ulimit 的问题,我不知道那天出了什么情况,但是昨天和今天服务器一直没断,没有出现第三个问题,第二个问题依然存在,但是重新连接就能连上了,断线很频繁,间隔时间从几秒到几十分钟不等,通常都是几分钟,难道是网络的问题?

#2 楼 @mimosa 就是这么配置的

  1. stop_all_streams 加在 stream_from 上面。
  2. ActionCable 需要独立运行。
passenger_enabled on;
passenger_app_env production;
passenger_app_type rack;
passenger_app_group_name websocket;
passenger_startup_file /home/deploy/ruby/rails/<appname>/current/cable/config.ru;
passenger_force_max_concurrent_requests_per_process 0

cable/config.ru

# -*- encoding: utf-8 -*-
require ::File.expand_path('../../config/environment', __FILE__)

Rails.application.eager_load!

require 'action_cable/process/logging'

# See https://www.phusionpassenger.com/library/config/tuning_sse_and_websockets/
if defined?(::PhusionPassenger)
  PhusionPassenger.advertised_concurrency_level = 0
end

run ActionCable.server
需要 登录 后方可回复, 如果你还没有账号请 注册新账号