安装编译相关依赖
- CentOS/Fedora
yum install gcc gcc-c++ cmake tcl
下载Redis源码包
curl -o redis-4.0.10.tar.gz http://download.redis.io/releases/redis-4.0.10.tar.gz
解压Redis源码包
tar -xzvf redis-4.0.10.tar.gz
编译
具体过程:
1# 进入解压目录, 默认在当前目录 2cd redis-4.0.10 3 4# 执行make 5make 6 7# 安装, 指定目录 8make PREFIX=/usr/local/redis install
Redis配置
1# 将配置文件放在/usr/local/redis/etc/下面, 放在/etc/redis/下也可以 2mkdir /usr/local/redis/etc/ 3 4# 将解压目录中的redis.conf拷贝到/usr/local/redis/etc/下面 5cp redis.conf /usr/local/redis/etc/ 6 7# 进入redis的执行文件目录 8cd /usr/local/redis/bin/ 9 10# 将redis-benchmark, redis-cli, redis-server复制到/usr/bin 11cp redis-benchmark redis-cli redis-server /usr/bin/
调整内存分配使用方式, 并使其生效:
1# 此参数可用的值为0,1,2 2# 0.表示当用户空间请求更多的内存时,内核尝试估算出可用的内存 3# 1.表示内核允许超量使用内存直到内存用完为止 4# 2.表示整个内存地址空间不能超过swap+(vm.overcommit_ratio)%的RAM值 5 6echo "vm.overcommit_memory=1" >> /etc/sysctl.conf 7sysctl -p
修改Redis配置和Redis加固
Redis配置
编辑配置文件vim /usr/local/redis/etc/redis.conf, 将其中的对应内容修改为:
1# redis以守护进程的方式运行, no表示不以守护进程的方式运行(会占用一个终端) 2daemonize yes 3 4# 密码 5requirepass password 6 7# 绑定ip 8# bind 127.0.0.1 9 10# 端口 11port 7480 12 13# 数据目录 14dir /data/redis 15 16# 客户端闲置多长时间后断开连接,默认为0关闭此功能 17timeout 300 18 19# 设置redis日志级别,默认级别:notice 20loglevel verbose 21 22# 设置日志文件的输出方式,如果以守护进程的方式运行redis 默认:"" 23# 并且日志输出设置为stdout,那么日志信息就输出到/dev/null里面去了 24logfile stdout
Redis加固
-
绑定127.0.0.1 如果只是本地通信, 就确保监听在本地, 修改配置文件的
bind 127.0.0.1 -
设置防火墙 如果需要其他机器访问,或者设置了slave模式,那就记得加上相应的防火墙设置,命令如下:
iptables -A INPUT -s x.x.x.x -p tcp --dport 6379 -j ACCEPT -
认证 添加密码, 修改配置文件
requirepass asdlkashdkj123123 -
低权限账户 创建一个redis用户, 使用这个用户执行
redis-serveruseradd -M -s /sbin/nologin redis setsid sudo -u redis /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf'
Redis启动脚本
-
CentOS 6的service服务cp /root/redis-4.0.10/utils/redis_init_script /etc/rc.d/init.d/redis
在文件的开头#!的下一行添加vim /etc/rc.d/init.d/redis:
1# chkconfig: 2345 90 10 2# description: Redis is a persistent key-value database
如果添加了密码, 请添加-a password在$CLIEXEC -a password -p $REDISPORT shutdown中.
再在stop的;;后添加:
1restart) 2 $0 stop 3 $0 start 4 ;; 5status) 6 PID=$(cat $PIDFILE) 7 if [ ! -x /proc/${PID} ] 8 then 9 echo 'Redis is not running' 10 else 11 echo "Redis is running ($PID)" 12 fi 13 ;;
例如:
1#!/bin/sh 2# 3# chkconfig: 2345 90 10 4# description: Redis is a persistent key-value database 5# Simple Redis init.d script conceived to work on Linux systems 6# as it does use of the /proc filesystem. 7 8### BEGIN INIT INFO 9# Provides: redis_7480 10# Default-Start: 2 3 4 5 11# Default-Stop: 0 1 6 12# Short-Description: Redis data structure server 13# Description: Redis data structure server. See https://redis.io 14### END INIT INFO 15 16REDISPORT=7480 17EXEC=/usr/local/redis/bin/redis-server 18CLIEXEC=/usr/local/redis/bin/redis-cli 19 20PIDFILE=/var/run/redis_${REDISPORT}.pid 21CONF="/usr/local/redis/etc/redis.conf" 22 23case "$1" in 24 start) 25 if [ -f $PIDFILE ] 26 then 27 echo "$PIDFILE exists, Process is already running or crashed" 28 else 29 echo "Starting Redis server..." 30 $EXEC $CONF 31 printf "Redis \033[1;32;32mStarted...\033[0m\n" 32 fi 33 ;; 34 stop) 35 if [ ! -f $PIDFILE ] 36 then 37 echo "$PIDFILE does not exist, Process is not running" 38 else 39 PID=$(cat $PIDFILE) 40 echo "Stopping ..." 41 $CLIEXEC -a password -p $REDISPORT shutdown >> /dev/null 2>&1 42 while [ -x /proc/${PID} ] 43 do 44 echo "Waiting for Redis to shutdown ..." 45 sleep 1 46 done 47 printf "Redis \033[1;32;32mStopped...\033[0m\n" 48 fi 49 ;; 50 restart) 51 $0 stop 52 $0 start 53 ;; 54 status) 55 if [ ! -f $PIDFILE ] 56 then 57 echo "$PIDFILE does not exist, Process is not running" 58 exit 6379 59 fi 60 PID=$(cat $PIDFILE) 61 if [ ! -x /proc/${PID} ] 62 then 63 printf "Redis is \033[1;31;31mnot running\033[0m\n" 64 else 65 printf "Redis is \033[1;32;32mrunning\033[0m ($PID)\n" 66 fi 67 ;; 68 *) 69 echo "Please use start or stop as first argument" 70 ;; 71esac 72 73 74# 如果没报错的话,说明成功,可以用 75chkconfig --add redis 76 77# 启动redis服务器 78service redis start 79# 开机自启 80chkconfig redis on 81# 查看是否启动成功 82ps -ef | grep redis
CentOS 7的systemd服务
在/usr/lib/systemd/system目录下创建redis.service文件, 权限为root.root 755, 输入以下内容, 将ExecStart后面的执行路径修改为自己的路径:
1[Unit] 2Description=Redis persistent key-value database 3After=network.target 4 5[Service] 6ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf --daemonize yes 7ExecStop=/usr/local/redis/bin/redis-cli -a password -p 6379 shutdown 8User=redis 9Group=redis 10RuntimeDirectory=redis 11RuntimeDirectoryMode=0755 12 13[Install] 14WantedBy=multi-user.target
然后创建/usr/libexec/redis-shutdown文件, 输入以下内容, 记得将REDIS_CLI和CONFIG_FILE修改为自己的路径:
1#!/bin/bash 2# 3# Wrapper to close properly redis and sentinel 4test x"$REDIS_DEBUG" != x && set -x 5 6REDIS_CLI=/usr/local/redis/bin/redis-cli 7 8# Retrieve service name 9SERVICE_NAME="$1" 10if [ -z "$SERVICE_NAME" ]; then 11 SERVICE_NAME=redis 12fi 13 14# Get the proper config file based on service name 15CONFIG_FILE="/usr/local/redis/etc/$SERVICE_NAME.conf" 16 17# Use awk to retrieve host, port from config file 18HOST=`awk '/^[[:blank:]]*bind/ { print $2 }' $CONFIG_FILE | tail -n1` 19PORT=`awk '/^[[:blank:]]*port/ { print $2 }' $CONFIG_FILE | tail -n1` 20PASS=`awk '/^[[:blank:]]*requirepass/ { print $2 }' $CONFIG_FILE | tail -n1` 21SOCK=`awk '/^[[:blank:]]*unixsocket\s/ { print $2 }' $CONFIG_FILE | tail -n1` 22 23# Just in case, use default host, port 24HOST=${HOST:-127.0.0.1} 25if [ "$SERVICE_NAME" = redis ]; then 26 PORT=${PORT:-6379} 27else 28 PORT=${PORT:-26739} 29fi 30 31# Setup additional parameters 32# e.g password-protected redis instances 33[ -z "$PASS" ] || ADDITIONAL_PARAMS="-a $PASS" 34 35# shutdown the service properly 36if [ -e "$SOCK" ] ; then 37 $REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdown 38else 39 $REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdown 40fi
修改/usr/libexec/redis-shutdown权限, chmod 755 /usr/libexec/redis-shutdown
重新载入systemd, 扫描新的或有变动的service, systemctl daemon-reload
开机自启, systemctl enable redis