服务器意外重启后redis启动失败或无法连接的问题解决办法

今天开发服务器因机房断电重启了,然后发现所有的PHP接口都报错:

session_write_close(): Failed to write session data using user defined save handler. (session.save_path...

但实际上我们一直是用redis来保存Session信息的,道理上不会用到这个save_path的配置项,在配置没改过的情况下报这个错,初步判断应该是redis服务器出了问题(redis服务器是在另一台机子上的),因为redis连不上所以框架自动切换到了使用文件系统存储Session的第二选项,所以根源还是在redis服务器上

用Redis的客户端工具(Redis Desktop Manager)尝试连接redis服务器,连接被拒绝了,看来确实是redis服务的问题,于是ssh连接上了redis服务器,用sytemctl status redis查看了状态,Active那里是绿色的,显示的是:Active: active(exited),貌似没问题(这里有坑,其实状态是不正常的,但因为之前没留意正常的状态是怎样的,以为绿色就是正常的,所以没及时发现这个问题,下面会具体说明情况),如下图所示:
运行结果
,但为什么连不上呢?

于是打算去看看redis的日志,如果你不知道日志保存的路径,可以去配置文件里面看,属性名是logfile,打开日志后确实看到了一个报错:Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>,看来是aof文件在意外断电时文件格式被损坏了,如果不知道redis-check-aof命令在哪里,可以通过whereis redis-check-aof查找,找到后复制下这个目录,然后进入到aof文件所在目录,执行命令将文件修复,如我执行的命令是这样的:/usr/local/bin/redis-check-aof --f appendonly.aof

接下来重启redis,本来以为能顺利连上了,但仍然连接失败,但有个变化是redis的日志里没有出现aof格式错误的记录了,于是用systemctl status redis看了一下redis的状态,显示的仍然是Active:active(exited),想了一下,这个exited可能是不正常的,于是找了另外一台装了redis的机子并正常运行的机子执行这个命令看了一下,原来active(running)才是正常的,如下图所示:
运行正常
在网上搜索了一下,这个问题将pid文件删掉,找到原来的进程杀死后再重新启动就行了,操作命令如下:

#删除pid文件

  cd /var/run

  rm redis_6379.pid 

#删除dump.rdb(内存快照)文件

  cd /var/lib/redis/6379

  mv dump.rdb dump.rdb_bak

#之后查看是否还有redis服务启动

  ps -ef |grep redis

  kill -9 进程id(如有)

  systemctl start redis

至此,原来redis里的数据顺利恢复,也能正常连接了。

### 可能的原因 当遇到错误信息“Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝无法连接”,这通常意味着客户端尝试访问位于本地主机(127.0.0.1),端口号为6379的Redis服务时遭到拒绝[^2]。 ### 解决方案概述 #### 验证Redis服务状态 确保Redis服务器已正确安装并正在运行。可以通过命令行工具检查Redis进程是否存在以及监听指定端口的情况: ```bash ps aux | grep redis netstat -anp | grep 6379 ``` 如果未找到任何关于`redis-server`的信息,则说明该服务尚未启动意外停止工作。 #### 启动/重启Redis服务 对于Linux系统而言,可以利用如下指令来开启重置Redis实例: ```bash sudo systemctl start redis # 对于采用systemd管理的服务 # 者 service redis-server restart # 对于其他类型的初始化脚本环境 ``` 另外,在某些情况下可能需要以管理员权限执行上述操作,因为默认配置下只有超级用户才有权绑定低编号端口(小于1024)[^3]。 #### 修改防火墙设置 确认操作系统自带的安全防护机制会阻止外部程序向内网发起TCP/IP请求;特别是针对Windows平台来说,应当允许特定的应用通过其内置的个人防火墙规则集。 #### 调整Redis配置文件参数 打开/etc/redis.conf (路径依具体版本而异),查找bind选项,默认值应设为127.0.0.1表示仅限局域网内部通信。如果是,请更改为localhost者注释掉此行以便接受来自任意地址的数据包。同时注意保护好生产环境中敏感数据的安全性! #### 用户权限问题排查 有时即使服务正常运作也可能因权限足而导致失败。建议先尝试切换至具有更高权限的角色再做测试,比如root账户,看能否顺利建立会话链接。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值