MENU

在cpanel中运行redis实例

这几天想搬迁一个用到redis站点到虚拟主机,这个站点是使用的是github上开源的程序,用到了队列,redis为必要条件,找了几个同类开源的程序也都要求redis,一开始在redis官网申请了免费的redis实例,使用时发现免费实例限制30连接数,不满足需求,于是便不报希望的尝试了一下在cpanel中运行redis实例,然后成功了.

条件

  1. cpanel的内存配额必须要够(编译时至少需要1G,运行看具体数据量)
  2. cpanel所在宿主机已经具备运行redis服务器的扩展和编译时的依赖
  3. 有ssh权限
  4. 没有进程限制(部分虚拟主机有kill进程的行为)
  5. 有cron权限
  6. 有端口监听权限
  7. 有足够的空间,大约需要1G左右
  8. 有nohup执行权限

编译

首先通过ssh登录,然后选一个位置创建一个目录,例如redis,这个目录不要放在临时目录或可被通过web访问的目录中
然后将redis的代码clone下来并运行编译.

git clone https://github.com/redis/redis.git
cd redis
make

如果编译报错则需要根据错误信息自行查找是否有可行的解决方案,因为每个虚拟主机的环境和对用户的限制都不一样,基本没有通用的解决方法.

编译好之后将二进制文件和配置文件复制出来,然后测试一下是否可以运行.

cp src/redis-server ../
cp src/redis-cli ../
cp redis.conf ../
cd ../
./redis-server

如果看到redis的启动页面则说明redis可以正常运行,然后删除redis源码以节约空间

rm -rf redis

修改redis配置

下面假设编译时创建的目录的绝对路径为/home/test/redis

打开redis.conf对其做如下修改

  • 找到bind,将地址改为其它本地回环地址,例如127.0.0.2
  • 找到port将其改为其它任意高位端口,例如11451
  • 找到protected-mode将其改为no(如果设置auth则不需要修改,本文为了方便不设置auth)
  • 找到dir将其路径改为/home/test/redis
  • 找到pidfile将其改为/home/test/redis/redis.pid

保存后再次通过./redis ./redis.conf运行,查看是否可以正常运行(主要检查地址和端口监听是否有问题),如果可以正常运行,使用nohup运行redis-server,然后通过./redis-cli -h 127.0.0.2 -p 11451连接到redis,如果没有报错则代表redis实例已经正常运行了,然后退出redis-cli.
通过执行ps -ef | grep 'redis-server'找到redis-server的pid然后使用kill将其杀死,以便后续通过保活脚本执行.

通过cron保活

由于没有systemctl权限,无法通过正常的方式运行进程守护,只能通过cron方式保活
首先创建一个保活脚本,原理是通过cron检测redis是否正在运行,如果没有运行则执行,可以直接用下面现成的修改

#!/bin/bash
cd `dirname $0`

ps -ef | grep 'redis-server' | grep -v grep
if [ $? -ne 0 ]
then
    echo "启动redis"
    nohup /home/test/redis/redis-server /home/test/redis/redis.conf >> ./redis.log 2>&1 &
else
    echo "redis监听中"
fi

此脚本可以存放到任意目录,redis的运行日志也会在同目录生成,这里将其存放到/home/test/redis/redis.sh

然后到cpanel的cron页面添加定时任务,每分钟一次内容为bash /home/test/redis/redis.sh

其它说明

这种方式运行的实例有如下缺点

  • 随时被可能被kill,无法连续运行
  • 可用线程/io/ram都受cpanel的限制
  • 被kill的时候数据可能会丢失或者损坏
  • 受cpanel的io,限制性能不佳(纯内存虽然不会受硬盘io限制,但是会因随时被kill的原因丢失所有数据)
  • 可能会被清退
  • 同宿主机别的用户也可以连接到这个redis实例,占用配额算redis运行用户的(所以,推荐设置auth)

基于以上缺点,慎重考虑这种方式运行的redis实例是否能满足当前的需求和能够承受一位问题带来的后果

如果没有ssh可用,或内存/空间之类的限制导致无法运行编译,可以找个web探针查看一下宿主机的系统,然后找相同或者相似系统的vm编译,然后将编译的文件上传到虚拟主机通过cron执行.

如果没有端口监听权限,可以尝试使用unix socket方法解决.

cpanel官方文档中有对redis在EasyApache容器下设置的介绍,可以先问下服务商是否支持,如果支持建议优先使用cpanel提供的redis.

996.icu 996.icu