在cpanel中运行redis实例
这几天想搬迁一个用到redis站点到虚拟主机,这个站点是使用的是github上开源的程序,用到了队列,redis为必要条件,找了几个同类开源的程序也都要求redis,一开始在redis官网申请了免费的redis实例,使用时发现免费实例限制30连接数,不满足需求,于是便不报希望的尝试了一下在cpanel中运行redis实例,然后成功了.
条件
- cpanel的内存配额必须要够(编译时至少需要1G,运行看具体数据量)
- cpanel所在宿主机已经具备运行redis服务器的扩展和编译时的依赖
- 有ssh权限
- 没有进程限制(部分虚拟主机有kill进程的行为)
- 有cron权限
- 有端口监听权限
- 有足够的空间,大约需要1G左右
- 有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.