一个软件在系统中的安装有很多种方式,但分析其原理,无非就是文件的拷贝和注册。这也是Linux中 Everything is file 理念的一种体现。若再进一步说,则大致可以分为如下几个步骤。
- 源码,通过源码获得软件,常用的指令是wget;
- 编译,通过编译使源码结合当前系统的环境生成相应的二进制文件和修改相应的配置文件,常用的指令是configure,make;
- 测试,使用预设的用例对编译后的结果进行测试,以检验是否编译完整,常用的指令是make test;
- 安装,将二进制文件、配置文件放入系统中约定俗成的目录下,并在环境变量中进行声明,常用的指令是make install,当然也有yum和apt,只是它们是把之前的过程交由其他公司完成;
- 配置,将一些常见的配置项进行配置;
- 服务启动,检验软件是否可以正常提供服务,常用的指令是service xxx start;
- 应用测试,通过应用用例进行测试服务可正常提供响应,如本文所使用的ping;
- 使用,正常使用软件吧;
在实际业务环境下,软件的安装往往受到公司的一些现实因素的约束,如技术策略、选型倾向、安全限制、人员能力、团队风格等。举个栗子来说,一个公司所使用的操作系统是确定的,像是 Redhat Enterprise Linux 64,甚至有时操作系统的版本也会做出相应的约定。所以在具体操作上,往往不会那么灵活,但也提供了一条捷径。那就是在预先拟定的一台服务器上进行满足所有条件的安装,在其他开发、测试、预投产、生产等环境下,直接采用拷贝的方式完成。这样在符合标准规范的同时,可以大幅减少人力投入。若是在容器的环境下,道理也是相通的,只是把软件写入指定的image中了。
拷贝版的安装方式还有一个好处是可以较容易的将一些开源软件作为自身软件的一个组件进行统一安装,以减少用户进行软件安装时的步骤。
安装标准
- redis软件要遵循以下安装标准:
- 软件目录为 /opt/app/redis
- 配置目录为 /opt/app/redis/config
- 服务脚本目录为 /opt/app/redis/sbin
- 能够支持以service指令启停
- 可以通过删除软件目录,从而卸载整个软件
- 尽可能简化安装步骤
预制软件
源码
从官网下载源代码
mkdir -p /opt/app/software/redis cd /opt/app/software/redis wget http://download.redis.io/releases/redis-5.0.8.tar.gz
编译
在编译时需要指定PREFIX,其实就是在make时进行声明环境变量。在 src/Makefile 中有如下代码 PREFIX?=/usr/local,含义是若PREFIX未被赋值,则采用 /usr/local 进行赋值。所以可以通过在make时声明环境变量进行修改。网上有不少攻略,是直接修改Makefile文件,不太规范和妥当。
redis目录中是没有 configure 文件的,所以不用执行 ./configure 来生成Makefile。
tar xvzf redis-5.0.8.tar.gz cd redis-5.0.8 make PREFIX=/opt/app/redis
测试
编译后的测试其实挺简单的,就是一条指令,具体的测试点在 /opt/app/software/redis/redis-5.0.8 下的 tests 系列文件中。通过指令 /usr/bin/tclsh8.5 tests/test_helper.tcl –single unit/moduleapi/commandfilter –single unit/moduleapi/testrdb 执行测试。
make test
安装
安装时注意两点,一是预先创建所需的安装目录,二是声明PREFIX。
mkdir -p /opt/app/redis make install PREFIX=/opt/app/redis mkdir -p /opt/app/redis/config cp redis.conf /opt/app/redis/config cp sentinel.conf /opt/app/redis/config mkdir -p /opt/app/redis/sbin mkdir -p /opt/app/redis/log mkdir -p /opt/app/redis/dump
配置文件
依据公司的规范标准,修改配置文件,进行常规性配置。
cd /opt/app/redis/config vi redis.conf daemonize yes pidfile /opt/app/redis/redis_6379.pid logfile "/opt/app/redis/log/redis_6379.log" bind 192.168.xx.xxx port 6379 dir /opt/app/redis/dump/
环境变量
此处创建环境变量,主要是为了方便使用redis-cli。
cd /opt/app/redis vi redis.env REDIS_HOME=/opt/app/redis export PATH=$PATH:$REDIS_HOME/bin # 指令 echo "# redis env" >> ~/.bashrc echo ". /opt/app/redis/redis.env" >> ~/.bashrc . ~/.bashrc
服务启动
使用/opt/app/redis/config/redis.conf作为配置文件启动redis服务。
cd /opt/app/redis ./bin/redis-server ./config/redis.conf & ps -ef|grep redis-server ll redis_6379.pid
停止
# 优雅 cd /opt/app/redis ./bin/redis-cli -p 6379 shutdown ll redis_6379.pid # 强制 ps -ef|grep redis-server kill -9 ${pid}
Service服务启动
若有root权限,则可以配置init.d下的文件实现service指令的启停。此处视具体情况决定是否配置。
创建redisd文件。
cd /opt/app/redis/bin touch redisd chmod +x redisd vi redisd REDIS_HOME=/opt/app/redis REDIS_PORT=6379 EXEC=$REDIS_HOME/bin/redis-server CONF=$REDIS_HOME/config/redis.conf PIDFILE=$REDIS_HOME/redis_$REDIS_PORT.pid REDIS_CLI=$REDIS_HOME/bin/redis-cli case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, redis is already running or crashed." else echo "Starting Redis server..." $EXEC $CONF fi if [ "$?" -eq "0" ] then echo "Redis is running..." fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE exists, redis is not running." else PID=$(cat $PIDFILE) echo "Stopping..." $REDIS_CLI -p $REDIS_PORT SHUTDOWN while [ -x $PIDFILE ] do echo "Waiting for Redis to shutdown..." sleep 1 done echo "Redis stopped" fi ;; status) $REDIS_CLI -p $REDIS_PORT PING 1>/dev/null if [ "$?" -eq "0" ] then echo "Redis is running." else echo "Redis is not running..." fi ;; restart|force-reload) ${0} stop ${0} start ;; *) echo "Usage: service redisd {start|stop|status|restart|force-reload}" >&2 exit 1 esac
复制redisd文件
使用root用户,将redisd文件复制至 /etc/init.d/
cd /etc/init.d/ cp /opt/app/redis/bin/redisd .
测试
service redisd start service redisd stop service redisd restart service redisd status service redisd force-reload service redisd others
应用测试
通过redis-cli执行 ping 指令进行测试。
cd /opt/app/redis/bin redis-cli -p 6379 ping redis-cli -p 6379 info
redis打包
通过将已可正常使用的redis打包,生成 redis.tar,实现拷贝安装。
cd /opt/app tar cvf redis.tar redis/ mv redis.tar software/redis/ cd software/redis/ ll redis.tar
拷贝安装
复制redis包
将redis包复制到所需安装的服务器中。
cd /opt/app scp prouser@127.0.0.1:/opt/app/software/redis/redis.tar . tar xvf redis.tar rm redis.tar
服务启动
启动redis服务。
cd /opt/app/redis ./bin/redis-server ./config/redis.conf & ps -ef|grep redis-server ll redis_6379.pid
停止
# 优雅 cd /opt/app/redis ./bin/redis-cli -p 6379 shutdown ll redis_6379.pid
Service服务启动
若有root权限,则可以配置init.d下的文件实现service指令的启停。
使用root用户,将redisd文件复制至 /etc/init.d/
cd /etc/init.d/ cp /opt/app/redis/bin/redisd .
- 测试
service redisd start service redisd stop service redisd restart service redisd status service redisd force-reload service redisd others