Redis引发Action Cable报错导致Rails本地服务自动关闭,该如何解决?
解决方案
步骤1:验证Redis服务运行状态
- 执行命令查看Redis运行状态:
systemctl status redis- 若状态非active (running),执行
sudo systemctl start redis启动服务,如需开机自启可追加执行sudo systemctl enable redis
- 若状态非active (running),执行
- 测试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
相关产品推荐
相关产品推荐

