You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis引发Action Cable报错导致Rails本地服务自动关闭,该如何解决?

解决方案

步骤1:验证Redis服务运行状态

  • 执行命令查看Redis运行状态:systemctl status redis
    • 若状态非active (running),执行sudo systemctl start redis启动服务,如需开机自启可追加执行sudo systemctl enable redis
  • 测试Redis本地连通性:终端执行redis-cli ping,正常返回PONG代表Redis本身服务无异常;如果返回连接失败,检查/etc/redis/redis.conf配置文件中bind参数是否为127.0.0.1、port参数是否为默认6379,是否配置了访问密码未同步到Rails配置中。

步骤2:修正Rails Action Cable连接配置

打开项目下config/cable.yml文件,确认development环境的Redis连接配置正确,参考配置如下:

development:
  adapter: redis
  url: redis://localhost:6379/1

如果你的Redis设置了访问密码,需要将url调整为redis://:你的Redis密码@localhost:6379/1。

步骤3:修复Redis最大打开文件数配置

你之前修改配置未生效属于路径/格式问题,重装后按以下步骤配置即可:

  • 新建Redis服务限制配置文件:sudo nano /etc/systemd/system/redis.service.d/limit.conf,写入如下内容:
    [Service]
    LimitNOFILE=65535
    
  • 执行命令修改系统全局文件打开数限制:sudo sysctl -w fs.file-max=65535,并将fs.file-max=65535追加到/etc/sysctl.conf文件末尾,执行sudo sysctl -p使配置生效。
  • 重载系统服务配置并重启Redis:
    sudo systemctl daemon-reload
    sudo systemctl restart redis
    

步骤4:添加Action Cable异常捕获补丁

你使用的Rails 6.1.4.1版本内置的Action Cable Redis适配器未捕获IO::EINPROGRESSWaitWritable异常,会导致连接波动时服务直接崩溃。在项目config/initializers目录下新建action_cable_redis_patch.rb文件,写入以下内容即可修复:

require 'action_cable/subscription_adapter/redis'

module ActionCable
  module SubscriptionAdapter
    class Redis < Base
      alias_method :original_handle_exception, :handle_exception

      def handle_exception(e)
        if e.is_a?(IO::EINPROGRESSWaitWritable)
          logger.warn "Redis连接处理中,正在重试:#{e.message}"
          sleep 0.1
          @listener&.stop if @listener&.running?
          ensure_listener_running
        else
          original_handle_exception(e)
        end
      end
    end
  end
end

配置完成后重启Rails服务即可正常访问。后续升级Rails到6.1.5及以上版本时可删除该补丁,官方已修复该问题。

内容的提问来源于stack exchange,提问作者Ckt22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:36:03