
暂无个人介绍
暂时未有相关通用技术能力~
阿里云技能认证
详细说明目前公司的业务是php语言开发,使用的是laravel开源框架。laravel框架使用predis连接redis,但是目前predis不支持主从式redis集群,这点很坑。 看了看目前网上的解决方案,国内豌豆荚开源的codis很不错。这篇文章,我们主要介绍codis集群的安装。 一、codis介绍 codis是一个分布式redis集群解决方案,对于上层的应用来说, 连接到codis-proxy和连接原生的redis-server没有明显的区别。 上层应用可以像使用单机的redis一样使用,codis底层会处理请求的转发,不停机的数据迁移等工作。所有后边的一切事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的redis服务。 codis由四部分组成: codis proxy(codis-proxy) codis dashboard(codis-config) codis redis(codis-server) zookeeper/etcd codis-proxy是客户端连接的redis代理服务,codis-proxy本身实现了redis协议,表现得和一个原生的redis没什么区别(就像twemproxy),对于一个业务来说,可以部署多个codis-proxy,codis-proxy本身是无状态的。 codis-config是codis的管理工具,支持包括:添加/删除redis节点,添加/删除proxy节点,发起数据迁移等操作。 codis-config本身还自带了一个http-server,会启动一个dashboard,用户可以直接在浏览器上观察codis集群的运行状态。 codis-server是codis项目维护的一个redis分支,基于redis2.8.21开发,加入了slot的支持和原子的数据迁移指令。codis上层的codis-proxy和codis-config只能和这个版本的redis交互才能正常运行。 codis依赖zookeeper来存放数据路由表和codis-proxy节点的元信息,codis-config发起的命令都会通过zookeeper同步到各个存活的codis-proxy。 codis支持按照namespace区分不同的产品,拥有不同的product name的产品,各项配置都不会冲突。 codis架构图如下: 二、环境准备 codis集群的搭建,需要zookeeper集群,有关zookeeper集群的搭建,可以参考这篇文章《烂泥:zookeeper集群搭建》。 除了zookeeper集群之外,我们还需要安装go语言环境,因为codis是基于go语言开发的。 2.1 安装基础依赖 安装基础依赖,使用如下命令: yum install -y git gcc make g++ gcc-c++ automake openssl-devel zlib-* 基础依赖安装往后,我们现在开始配置go语言环境。 2.2 go语言环境搭建 codis是基于go语言开发的,所以我们要在所有服务器上都配置go语言环境。 下载go语言包,如下: wget http://www.golangtc.com/static/go/1.4.2/go1.4.2.linux-amd64.tar.gz 下载完毕后,解压到/usr/local,如下: tar -C /usr/local -xf go1.4.2.linux-amd64.tar.gz 把go加入到系统的环境变量,如下: vim /etc/profile export PATH=$PATH:/usr/local/go/bin export GOPATH=/usr/local/ 让刚刚加入的环境变量生效,并查看go是否配置成功,如下: source /etc/profile env go version 通过上图,我们可以很明显的看出go语言环境配置成功。 三、安装codis codis的安装,我们可以通过三种不同的方式进行:通过go下载安装、通过git方式和通过源码方式,下面分别介绍下。 3.1 通过go下载安装 官方github地址为:https://github.com/CodisLabs/codis 官方使用文档地址为:https://github.com/CodisLabs/codis/blob/master/doc/tutorial_zh.md 按照官方github介绍,codis首选方式是通过go下载安装的。命令如下: go get -u -d github.com/CodisLabs/codis 注意:由于众所周知的原因,这一步比较慢,需要耐心等待。 上一步执行完毕后,我们切换到/usr/local/src/github.com/CodisLabs/codis目录下,进行编译,如下: cd /usr/local/src/github.com/CodisLabs/codis make 注意:这一步也比较慢,需要耐心等待。 make编译执行完毕后后,会在bin目录下生成codis-config、codis-proxy、codis-server三个可执行文件以及assets目录。 其中assets是codis-config的dashboard http 服务需要的前端资源,需要和codis-config放置在同一目录下。如下: ll bin/ 编译完毕后,我们现在来测试编译的结果,使用如下命令: make gotest 通过上图,我们可以看到codis已经安装成功。 3.2 通过git方式 上一章节,我们介绍了codis通过go下载安装的方法,这一章节,我们通过git方式进行安装。 首先下载codis最新的git仓库,使用如下命令: git clone https://github.com/CodisLabs/codis.git git仓库下载完毕后,我们接下来进行如下的操作。如下: mkdir -p /usr/local/src/github.com/CodisLabs/ cp -r codis /usr/local/src/github.com/CodisLabs/ cd /usr/local/src/github.com/CodisLabs/codis/ 以上操作完毕后,就和通过go下载安装方式一样了。执行make命令进行编译,然后执行make gotest命令进行测试。 3.3 通过下载源码 下面我们来介绍下,通过源码方式的安装。下载codis源码文件,如下: wget https://github.com/CodisLabs/codis/archive/3.0.3.tar.gz 解压源码包,如下: tar -xf 3.0.3.tar.gz cd codis-3.0.3/ 然后进行编译,使用make命令,如下: 这一步很慢,需要下载各种依赖,然后是make gotest。 基本和go下载安装方式一样,不过需要说明下,我通过源码方式一直没有安装成功。报如下错误: 所以以上三种安装的方法,建议使用第一、二种,尽管有点慢。 四、配置codis集群 codis安装完毕后,我们现在来配置codis集群。在正式配置集群之前,先创建相关的目录,然后复制相关文件到新的目录下。使用如下命令: cd /usr/local/src/github.com/CodisLabs/codis/ mkdir -p /usr/local/codis/{log,redis_conf} cp -rf bin/ /usr/local/codis/ cp config.ini /usr/local/codis/ cp extern/redis-test/conf/6379.conf /usr/local/codis/redis_conf/20189.conf cp extern/redis-test/conf/6380.conf /usr/local/codis/redis_conf/20190.conf 4.1 编辑codis配置文件 上述操作完毕后,我们来修改codis的配置文件config.ini,在此我们只需要修改相关的选项即可。如下: vim /usr/local/codis/config.ini coordinator=zookeeper zk=192.168.1.9:2181,192.168.1.124:2181,192.168.1.231:2181 product=test dashboard_addr=192.168.1.9:18087 password= backend_ping_period=5 session_max_timeout=1800 session_max_bufsize=131072 session_max_pipeline=1024 zk_session_timeout=30000 proxy_id=proxy_9 该配置文件中,我们需要注意三个参数:zk、dashboard_addr、proxy_id。 其中zk是表示zookeeper集群的服务器IP地址,dashboard_addr表示codis web管理的IP地址及端口,proxy_id表示codis的id,注意每台codis服务器该值要唯一。 另外两台服务器的codis配置文件,内容如下: 到此codis配置文件修改完毕。 4.2 编辑redis配置文件 codis配置文件修改完毕后,我们现在来修改redis配置文件。 每台codis服务器上,我们要启动两个redis实例(也可以启动多个redis实例),所以我们要配置两个redis。如下: vim /usr/local/codis/redis_conf/20189.conf daemonize no pidfile /var/run/redis20189.pid port 20189 tcp-backlog 511 timeout 0 tcp-keepalive 0 loglevel notice logfile /var/log/redis/20189.log databases 16 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump20189.rdb dir /usr/local/codis/ slave-serve-stale-data yes slave-read-only yes repl-disable-tcp-nodelay no slave-priority 100 appendonly no appendfilename “appendonly.aof” appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events “” hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes 配置第二个redis实例,如下: yes|cp /usr/local/codis/redis_conf/20189.conf /usr/local/codis/redis_conf/20190.conf sed -i ‘s/20189/20190/g’ /usr/local/codis/redis_conf/20190.conf mkdir -p /var/log/redis/ 每台codis服务器上redis配置完毕后,我们来启动redis实例,如下: /usr/local/codis/bin/codis-server /usr/local/codis/redis_conf/20189.conf & /usr/local/codis/bin/codis-server /usr/local/codis/redis_conf/20190.conf & ps -ef |grep codis-server 注意:我们每台codis服务器上的redis实例都需要启动。 4.3 启动codis dashboard redis实例全部启动后,我们现在来启动codis的dashboard。 注意,我们一定要在192.168.1.9这台codis服务器上启动该命令,这是因为我们在4.1章节codis配置文件中配置的dashboard地址就是192.168.1.9。 使用如下命令启动dashboard: nohup /usr/local/codis/bin/codis-config -c config.ini dashboard & netstat -tunlp codis dashboard访问端口是18087,如下: http://codis.ilanni.com:18087/admin/ 通过上图,我们可以很明显的看出codis dashboard已经正常启动。 4.4 创建redis server分组 codis dashboard已经正常启动后,我们现在来创添加redis server分组。如下: 这样我们第一个redis server分组就创建完毕了,可以使用同样的方法创建第二、三个分组。如下: 这样三组redis server分组就创建完毕了。 当然我们也可以通过命令进行创建,如下: /usr/local/codis/bin/codis-config server add-group 1 /usr/local/codis/bin/codis-config server add-group 2 /usr/local/codis/bin/codis-config server add-group 3 /usr/local/codis/bin/codis-config server list 注意:上述命令在三台codis服务器上任意一台上执行。 到此codis的redis server分组添加完毕。 4.5 添加redis实例 redis server分组添加完毕后,我们现在来为每一个分组添加redis实例。先为group_1添加redis实例,如下: 这个里面可以填写任何一个codis服务器上的redis实例(哪怕不是codis服务器的redis实例),在此我们填写的是192.168.1.9这台服务器上的redis实例。 可以看到group_1组的第一个redis实例,被自动配置为master类型。 现在我们来添加第二个redis实例,如下: 通过上图,我们可以很明显的看到第二个添加的redis实例被默认配置为slave类型。 注意:redis官方的支持的集群也是master-slave主从式的集群。 group_2组和group_3组的redis实例添加和上面的操作一样,如下: 这样三组redis实例就全部添加完毕。 当然我们也可以通过命令进行添加,如下: /usr/local/codis/bin/codis-config server add 1 192.168.1.9:20189 master /usr/local/codis/bin/codis-config server add 1 192.168.1.9:20190 slave /usr/local/codis/bin/codis-config server add 2 192.168.1.124:20189 master /usr/local/codis/bin/codis-config server add 2 192.168.1.124:20190 slave /usr/local/codis/bin/codis-config server add 3 192.168.1.231:20189 master /usr/local/codis/bin/codis-config server add 3 192.168.1.231:20190 slave 注意:上述命令中的数字,表示的是哪一个分组,master/slave表示的是所属类型。 我们也可以通过命令查看,各个redis server组的信息,如下: /usr/local/codis/bin/codis-config server list 注意:每组添加的第一个redis实例不能被删除,因为codis默认把该redis实例设置为master。 到此redis server分组的redis实例添加完毕。 4.6 分配slot范围 codis采用pre-sharding的技术来实现数据的分片,默认分成1024个slot(0-1023)。对于每个key来说,可以通过以下公式确定所属的slot id:slotid=crc32(key)%1024。 每一个slot都会有一个且必须有一个特定的server group id来表示这个slot的数据由哪个server group来提供。 在分配slot之前,我们需要初始化slot。 在codis服务器任意一台上执行bin/codis-config slot init命令,该命令会在zookeeper上创建slot相关信息。如下: cd /usr/local/codis /usr/local/codis/bin/codis-config -c config.ini slot init slot初始化完毕后,我们现在来分配slot范围。如下: 上图中的New Group Id是自定义的。 通过上图,我们可以看到第一组slot分配成功。 现在来查看slot分配信息,如下: 通过上图,我们可以很明显的看出组1分配的slot是0-334,335以后还没有分配。现在来分配剩下的slot,如下: 这样slot已经全部分配完毕。 当然我们也可以通过命令进行分配,如下: /usr/local/codis/bin/codis-config slot range-set 0 334 1 online /usr/local/codis/bin/codis-config slot range-set 335 669 2 online /usr/local/codis/bin/codis-config slot range-set 670 1023 3 online 查看slot信息,如下: /usr/local/codis/bin/codis-config slot info 1 /usr/local/codis/bin/codis-config slot info 2 /usr/local/codis/bin/codis-config slot info 3 4.7 启动codis-proxy 以上全部配置完毕后,我们来启动codis-proxy,使用如下命令: nohup /usr/local/codis/bin/codis-proxy -c /usr/local/codis/config.ini –log-level=error -L/usr/local/codis/log/proxy.log –cpu=8 –addr=0.0.0.0:19000 –http-addr=0.0.0.0:11000 & 下面对以上命令中的参数进行解释: -c 配置文件地址。 -L 日志输出文件地址。 –log-level=<loglevel> 输出日志级别(debug<info (default)<warn<error<fatal)。 –cpu=<cpu_num> proxy占用的cpu核数,默认1,最好设置为机器的物理cpu数的一半到2/3左右。 –addr=<proxy_listen_addr> proxy的redis server监听的地址, 格式<ip or hostname>:<port>, 如: localhost:9000, :9001。 –http-addr=<debug_http_server_addr> proxy的调试信息启动的http server,可以访问 http://debug_http_server_addr/debug/vars。 codis-proxy启动后,我们可以在dashboard上进行查看,如下: 到此codis集群就搭建完毕。 五、连接codis集群 codis集群搭建完毕后,现在我们来连接codis集群。要连接codis集群,我们只需要连接codis-proxy即可。即连接4.7章节中的codis-proxy服务器地址,然后加19000端口。使用redis-cli命令连接,如下: redis-cli -h 192.168.1.9 -p 19000 info 通过上图,我们可以很明显的看到连接codis集群是ok的。 我们现在对codis集群做一些压力测试,同时在dashboard上观察键值对的情况。如下: redis-benchmark -h 192.168.1.9 -p 19000 -c 10000 -d 100 -t set -n 100000 -r 100000 上述命令的意思是,使用redis-benchmark压力测试命令连接codis集群,同时并发10000个(-c),测试set操作(-t),每个测试数据集是100字节(-d),请求数是100000(-n),使用使用随机数插入数值(-r)。 通过上图,可以很明显的看到codis集群的性能还是很不错的呢。 而我们laravel框架中redis的配置直接填写codis-proxy的连接地址即可。如下: 六、其他 在codis搭建和使用过程中,我们还是会碰到一些其他问题的,下面就稍微提下。 6.1 报zk节点不存在错误 如果要kill的dashboard的话,强烈建议通过kill -15 pid来关闭。 如果是直接使用kill -9进行kill的话,可能会报zk节点不存在错误的话。 这样的话,我们需要通过连接zookeeper集群,删除相关节点,然后再进行操作。删除节点操作,操作如下: cd /usr/local/zookeeper/ ./bin/zkCli.sh -server 127.0.0.1:2181 ls /zk/codis/db_test rmr /zk/codis/db_test 6.2 与阿里云slb集成 在这里我们大致介绍下,codis在与阿里云的slb(负载均衡)进行集成的线上生产环境的案例。 目前我们连接codis集群是通过单个codis-proxy来进行的,如果这个节点挂了,就会出现了单点故障的危险。 所以我们这边在codis集群每台服务器上,都启动一个codis-proxy。然后前端使用slb进行统一接入,slb后端就有三台codis-proxy服务器。 codis集群的搭建和前面是一样的,只是在此我们的codis所在ecs(服务器)只有内网IP(省钱),而且slb我们是要的也是内网(省钱)。如下: 这样的话,客户端连接slb的地址就是连接codis整个集群了,同时也避免了单点故障的问题。 注意:阿里云slb后端的ecs,不能telnet通其前端的slb。
因为公司的业务发展,需要搭建codis集群(一个由国内豌豆荚开发的redis集群解决方案),但是codis集群是依赖与zookeeper集群的。所以这篇文章,我们主要介绍有关zookeeper集群的搭建。 一、zookeeper介绍 zookeeper是一个分布式的开源框架,它能很好的管理集群,而且提供协调分布式应用的基本服务。 它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。 zookeeper本身可以以standalone模式(单节点状态)安装运行,不过它的长处在于通过分布式zookeeper集群(一个leader,多个follower),基于一定的策略来保证zookeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。 1.1、zookeeper集群角色介绍 zookeeper集群中主要有两个角色:leader和follower。 领导者(leader),用于负责进行投票的发起和决议,更新系统状态。 学习者(learner),包括跟随者(follower)和观察者(observer)。 其中follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票。 而observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度。 1.2 zookeeper集群节点个数 一个zookeeper集群需要运行几个zookeeper节点呢? 你可以运行一个zookeeper节点,但那就不是集群了。如果要运行zookeeper集群的话,最好部署3,5,7个zookeeper节点。本次实验我们是以3个节点进行的。 zookeeper节点部署的越多,服务的可靠性也就越高。当然建议最好是部署奇数个,偶数个不是不可以。但是zookeeper集群是以宕机个数过半才会让整个集群宕机的,所以奇数个集群更佳。 你需要给每个zookeeper 1G左右的内存,如果可能的话,最好有独立的磁盘,因为独立磁盘可以确保zookeeper是高性能的。如果你的集群负载很重,不要把zookeeper和RegionServer运行在同一台机器上面,就像DataNodes和TaskTrackers一样。 PS:本次实验所使用的OS有centos6、centos7和ubuntu15,如下: 为什么本次实验会使用到两种三个不同的OS,主要是刚好趁这个机会学习下最新的OS。 二、zookeeper安装 zookeeper介绍完毕后,我们现在就来安装zookeeper。而zookeeper运行需要java的支持,所以我们要首先安装jdk。 注意:zookeeper、jdk需要在每台服务器上都要安装和运行。 2.1 安装jdk 如果是centos系统,使用如下命令安装jdk: yum search jdk yum -y install java-1.6.0-openjdk 如果是ubuntu系统,使用如下命令安装jdk: apt-cache search jdk |grep openjdk apt-get -y install java-1.6.0-openjdk jdk安装完毕后,我们来查看下java版本,使用如下命令: java -version 2.2 安装zookeeper zookeeper的安装很简单,我们只需要下载zookeeper压缩包,然后解压、配置、执行就可以了。如下: wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz zookeeper下载完毕后,我们进行如下操作: tar -C /usr/local/ -xf zookeeper-3.4.8.tar.gz cd /usr/local/ mv zookeeper-3.4.8 zookeeper chown root:root -R zookeeper/ cd zookeeper cp conf/zoo_sample.cfg conf/zoo.cfg 把zookeeper加入到环境变量,如下: vim /etc/profile export PATH=$PATH:/usr/local/zookeeper/bin 执行source命令使刚刚修改的环境生效,如下: source /etc/profile env 现在我们在其中任意一台服务器上启动zookeeper,使用如下命令: bin/zkServer.sh start 查看zookeeper端口、状态和zookeeper日志,如下: netstat -tunlp bin/zkServer.sh status cat zookeeper.out 通过上图,我们可以很明显的看到zookeeper监听的是TCP的2181端口,是以standalone单机模式运行的,而且通过zookeeper日志也可以看到目前zookeeper是正常运行的。 三、zookeeper集群搭建 zookeeper搭建完毕后,我们现在来配置zookeeper集群。 注意:在搭建zookeeper集群时,一定要停止已经启动的zookeeper。 3.1 修改zookeeper配置文件 zookeeper集群的搭建很简单,我们只需要修改每台服务器的zoo.cfg配置文件然后进行相关的操作即可。 先来修改zookeeper的配置文件zoo.cfg,如下: vim /usr/local/zookeeper/conf/zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 clientPort=2181 dataLogDir=/usr/local/zookeeper/logs dataDir=/usr/local/zookeeper/data server.1= 192.168.1.9:2888:3888 server.2= 192.168.1.124:2888:3888 server.3= 192.168.1.231:2888:3888 配置文件参数说明: tickTime这个时间是作为zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是说每个tickTime时间就会发送一个心跳。 initLimit这个配置项是用来配置zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。 当已经超过10个心跳的时间(也就是tickTime)长度后 zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20秒。 syncLimit这个配置项标识leader与follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。 dataDir顾名思义就是zookeeper保存数据的目录,默认情况下zookeeper将写数据的日志文件也保存在这个目录里; clientPort这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求; server.A=B:C:D中的A是一个数字,表示这个是第几号服务器,B是这个服务器的IP地址,C第一个端口用来集群成员的信息交换,表示这个服务器与集群中的leader服务器交换信息的端口,D是在leader挂掉时专门用来进行选举leader所用的端口。 3.2 创建相关目录 配置文件修改完毕后,我们来创建zookeeper数据目录和日志目录,使用如下命令: mkdir -p /usr/local/zookeeper/logs mkdir -p /usr/local/zookeeper/data 3.3 创建ServerID标识 除了修改zoo.cfg配置文件外,zookeeper集群模式下还要配置一个myid文件,这个文件需要放在dataDir目录下。 这个文件里面有一个数据就是A的值(该A就是zoo.cfg文件中server.A=B:C:D中的A),在zoo.cfg文件中配置的dataDir路径中创建myid文件。 在192.168.1.9服务器上创建myid文件,并设置为1,同时与zoo.cfg文件里面的server.1对应,如下: echo “1” > /usr/local/zookeeper/data/myid 在192.168.1.124服务器上创建myid文件,并设置为2,同时与zoo.cfg文件里面的server.2对应,如下: echo “2” > /usr/local/zookeeper/data/myid 在192.168.1.231服务器上创建myid文件,并设置为3,同时与zoo.cfg文件里面的server.3对应,如下: echo “3” > /usr/local/zookeeper/data/myid 四、查看zookeeper集群 经过第三章节配置,在每台服务器上都操作完毕后,我们现在来启动每台服务器上的zookeeper。如下: cd /usr/local/zookeeper bin/zkServer.sh start 注意:在启动第一台zookeeper的时候可能会报错,等三台zookeeper全部启动完成之后就不会报错了。 zookeeper启动完毕后,我们来查看各个服务器上zookeeper的状态。如下: bin/zkServer.sh status 通过上述三幅图,我们可以很明显的看出192.168.1.9和192.168.1.124这两台服务器zookeeper的状态是follow模式,192.168.1.231这台服务器zookeeper的状态是leader模式。 这说明zookeeper集群已经成功搭建。 五、连接zookeeper集群 zookeeper集群搭建完毕后,我们可以通过客户端脚本,连接到zookeeper集群上。 对于客户端来说,zookeeper集群是一个整体,连接到zookeeper集群实际上感觉在独享整个集群的服务,所以,你可以在任何一个结点上建立到服务集群的连接,例如: bin/zkCli.sh -server 192.168.1.9:2181 通过上图,我们可以很明显的看出在192.168.1.124这台机器上连接192.168.1.9服务器上的zookeeper是正常的,而且当前根路径为/zookeeper。 到此有关zookeeper集群搭建就完全结束。
这个月又快过完了,最近也比较忙,没时间写文章,今天挤点时间把zabbix3.0安装与配置的文章写下来。 其实zabbix3.0的安装很简单,但是由于个人比较懒,所以一直不喜欢使用源码方式进行安装,而且管理的服务器多了,源码安装也感觉不方便,所以现在大部分安装软件我都会首先选择yum或者apt-get方式进行。 本篇文章,我也不多介绍zabbix3.0安装的详细步骤了,只列出centos、ubuntu下zabbix3.0的相关安装命令以及zabbix的基本配置。 zabbix3.0对OS的要求:mysql5.0以上版本、apache1.3以上版本、php5.4以上版本。 注意:这个要求很重要。 一、zabbix server3.0在centos 7上安装 根据zabbix server3.0官方要求,目前zabbix server3.0在centos6 OS上不能进行yum安装。如果一定要在centos6 OS上进行安装zabbix server3.0的话,强烈建议通过源码方式进行编译安装,同时还需要注意PHP的版本。 考虑到这些因素,所以在此我们是在centos7 OS上进行yum安装zabbix server3.0。 注意:尽管zabbix server3.0在centos6 OS上不能yum方式进行安装,但是zabbix-agent3.0在centos6 OS上是可以进行yum安装的。 1.1 搭建lamp环境 在centos7上安装zabbix server3.0之前,我们首先搭建zabbix所需要的lamp环境。 下载最新的yum源,如下: wget -P /etc/yum.repos.d http://mirrors.aliyun.com/repo/Centos-7.repo 在开始安装之前,还需要说明下centos7自带的mysql是mariadb,我们可以通过如下命令查看: yum search mysql|tac 现在开始安装lamp环境,使用如下命令: yum -y install mariadb mariadb-server php php-mysql httpd 通过上图,我们可以很明显的看出centos7默认安装的是php5.4、httpd2.4和maradb5.5,这个完全符合zabbix3.0对软件版本的要求。 lamp安装完毕后,我们现在来配置mysql数据库。 设置开机自启动mysql,并启动mysql,使用如下命令: systemctl enable mariadb systemctl start mariadb 初始化mysql数据库,并配置root用户密码。使用如下命令: mysql_secure_installation 注意:在上图中的Enter current passwdord for root处,我们直接敲回车键即可。因为centos7上mysql的默认root用户密码为空。 上图中主要是为root用户配置密码,并刷新相关权限。 上图中主要是配置匿名用户、test用户以及root用户远程连接等相关配置。 mysql初始化完毕后,我们现在来创建zabbix数据库及其用户,使用如下命令: mysql -uroot -p’ilanni’ -e “create database zabbix default character set utf8 collate utf8_bin;” mysql -uroot -p’ilanni’ -e “grant all on zabbix.* to ‘zabbix’@’%’ identified by ‘zabbix’;” 现在来测试刚刚创建的zabbix用户,是否可以连接mysql数据库,如下: mysql -uzabbix -pzabbix show databases; 通过上图,我们可以很明显的看出zabbix用户是可以正常连接数据库的。 启动apache以及开放80端口,如下: systemctl start httpd netstat –tunl firewall-cmd –zone=public –add-port=80/tcp –permanent firewall-cmd –reload 注意:centos7的防火墙和centos6的防火墙很不一样。 到此lamp环境已经全部搭建完毕。 1.2 安装zabbix server3.0 lamp环境搭建完毕后,我们现在开始正式安装zabbix3.0。 安装zabbix3.0所需要EPEL源和zabbix的yum源,如下: rpm -ivh http://mirrors.aliyun.com/epel/7/x86_64/e/epel-release-7-6.noarch.rpm rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm 以上安装完毕后,我们现在来正式安装zabbix3.0,使用如下命令: yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-get 通过上图,我们可以很明显的看出目前zabbix server是3.0.2版本的。 以上安装完毕后,我们现在开始进行zabbix的相关配置。 导入zabbix数据库结构,如下: cd /usr/share/doc/zabbix-server-mysql-3.0.2/ zcat create.sql.gz | mysql -uroot -pilanni zabbix 数据库导入完毕后,我们现在来修改zabbix sever的配置文件,如下: vim /etc/zabbix/zabbix_server.conf LogFile=/var/log/zabbix/zabbix_server.log LogFileSize=0 PidFile=/var/run/zabbix/zabbix_server.pid DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=zabbix SNMPTrapperFile=/var/log/snmptrap/snmptrap.log Timeout=4 AlertScriptsPath=/usr/lib/zabbix/alertscripts ExternalScripts=/usr/lib/zabbix/externalscripts LogSlowQueries=3000 上述配置文件中,我们只需要关注DBHost、DBName、DBUser、 DBPassword几项即可。这几项是配置zabbix server连接mysql数据库的参数。 以上修改完毕后,我们再来修改下zabbix.conf文件。如下: vim /etc/httpd/conf.d/zabbix.conf Alias /zabbix /usr/share/zabbix <Directory “/usr/share/zabbix”> Options FollowSymLinks AllowOverride None Require all granted <IfModule mod_php5.c> php_value max_execution_time 300 php_value memory_limit 128M php_value post_max_size 16M php_value upload_max_filesize 2M php_value max_input_time 300 php_value always_populate_raw_post_data -1 php_value date.timezone Asia/Chongqing </IfModule> </Directory> 其中php_value date.timezone Asia/Chongqing主要是定义php的时区。 以上修改完毕后,我们把把zabbix-server加入开机启动,并启动zabbix-server,如下: systemctl enable zabbix-server systemctl start zabbix-server 最后重启apache,如下: systemctl restart httpd 然后访问http://192.168.1.9/zabbix/setup.php这个地址,如下: 通过上图,我们可以很明显的看出zabbix3.0已经被正确安装。 当然上述的访问地址也是可以自定义的,我们只需要修改zabbix.conf文件中的alias即可,如下: vim /etc/httpd/conf.d/zabbix.conf 修改完毕后,记得重启apache,如下: systemctl restart httpd 此时访问地址已经更改为http://192.168.1.9/ilanni/setup.php,如下: 到此有关centos7上安装zabbix server 3.0的上半部分已经完毕,下半部分见第三章《配置zabbix3.0》。 二、zabbix server3.0在ubuntu 15上安装 在ubuntu 15上安装zabbix server 3.0就简单的多了,我们也是直接使用apt-get方式进行的。注意:zabbix server3.0在 ubuntu 15与ubuntu 14上安装方法是一样的。 首先安装相关的软件,如下: sudo apt-get -y install gettext unzip rar 下载zabbix server3.0仓库文件,并安装如下: wget http://mirrors.aliyun.com/zabbix/zabbix/3.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.0-1%2btrusty_all.deb dpkg -i zabbix-release_3.0-1+trusty_all.deb 开始安装zabbix server,使用如下命令: sudo apt-get update sudo apt-get -y install zabbix-server-mysql zabbix-frontend-php zabbix-get 以上是设置mysql数据库root用户的密码。 以上安装完毕后,我们现在来创建zabbix数据库及其用户,如下: mysql -uroot -p’ilanni’ -e “create database zabbix default character set utf8 collate utf8_bin;” && mysql -uroot -p’ilanni’ -e “grant all on zabbix.* to ‘zabbix’@’%’ identified by ‘zabbix’;” 现在来测试刚刚创建的zabbix用户,是否可以连接mysql数据库,如下: mysql -uzabbix -pzabbix show databases; 以上安装及测试完毕后,我们现在开始进行相关的配置。 导入zabbix数据库结构,如下: cd /usr/share/doc/zabbix-server-mysql zcat create.sql.gz | mysql -uroot -p’ilanni’ zabbix 数据库导入完毕后,我们现在来修改zabbix sever的配置文件,如下: vim /etc/zabbix/zabbix_server.conf LogFile=/var/log/zabbix/zabbix_server.log LogFileSize=0 PidFile=/var/run/zabbix/zabbix_server.pid DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=zabbix SNMPTrapperFile=/var/log/snmptrap/snmptrap.log Timeout=4 AlertScriptsPath=/usr/lib/zabbix/alertscripts ExternalScripts=/usr/lib/zabbix/externalscripts LogSlowQueries=3000 上述配置文件中,我们只需要关注DBHost、DBName、DBUser、 DBPassword几项即可。这几项是配置zabbixserver连接mysql数据库的参数。 以上修改完毕后,我们再来修改下zabbix.conf文件。如下: vim /etc/apache2/conf-enabled/zabbix.conf <IfModule mod_alias.c> Alias /zabbix /usr/share/zabbix </IfModule> <Directory “/usr/share/zabbix”> Options FollowSymLinks AllowOverride None Order allow,deny Allow from all <IfModule mod_php5.c> php_value max_execution_time 300 php_value memory_limit 128M php_value post_max_size 16M php_value upload_max_filesize 2M php_value max_input_time 300 php_value always_populate_raw_post_data -1 php_value date.timezone Asia/Chongqing </IfModule> </Directory> 其中php_value date.timezone Asia/Chongqing主要是定义php的时区。这个和centos7下的配置基本一致。 以上修改完毕后,我们把把zabbix-server加入开机启动,并启动zabbix-server,如下: sudo systemctl enable zabbix-server sudo systemctl start zabbix-server 最后重启apache,如下: sudo systemctl restart apache2.service 然后访问http://192.168.1.231/zabbix/setup.php这个地址,如下: 通过上图,我们可以很明显的看出zabbix server 3.0已经被正确安装。 到此有关ubuntu上安装zabbix server 3.0的上半部分已经完毕,下半部分见第三章《配置zabbix3.0》。 三、配置zabbix 在第一、二章节中,我们已经安装zabbix server3.0的上半部分,这个章节我们来继续安装和配置zabbix。 注意:本章节我们不再进行文字解释,全部都是图片。 打开前面的显示的zabbix3.0的网页,点击下一步,如下: 上图中需要填写的是,我们前面创建的zabbix数据库已经用户和密码。 四、安装zabbix agent 前面我们安装了zabbix server3.0,本章节我们介绍安装zabbix agent端。zabbix agent的安装比较简单,我们只需要安装相应的仓库,然后执行安装命令即可。 4.1 安装zabbix agent 在centos os上安装agent,使用如下命令: rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm yum clean all yum -y install zabbix zabbix-agent 在ubuntu os上安装agent,使用如下命令: wget http://mirrors.aliyun.com/zabbix/zabbix/3.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.0-1%2btrusty_all.deb dpkg -i zabbix-release_3.0-1+trusty_all.deb sudo apt-get -y install zabbix-agent 4.2 配置zabbix agent zabbix agent的配置很简单,只需要修改zabbix agent配置文件中的Server、ServerActive和Hostname这三项即可。 其中Server、ServerActive是zabbix server服务器的IP地址,Hostname是被监控端的IP地址,如下: vim /etc/zabbix/zabbix_agentd.conf PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 Server=192.168.1.231 ServerActive=192.168.1.231 Hostname=192.168.1.124 Include=/etc/zabbix/zabbix_agentd.d/ 以上配置完毕后,我们在zabbix web端添加该监控机器时,只需要把honst name与该配置文件中的hostname对应即可。如下: 到此zabbix agent就已经安装完毕。 五、zabbix web中文显示与优化 本章节分为两部分,第一部分是配置zabbix web中文显示,第二部分是优化显示的中文。 5.1 zabbix web中文显示 默认情况下zabbix web显示的是英文,实际上zabbix是支持中文的,我们可以通过修改web端源文件来开启中文。 修改/usr/share/zabbix/include/locales.inc.php文件,把zh_CN所在行的false改为true即可,如下: vim /usr/share/zabbix/include/locales.inc.php +55 最后后点击zabbix web监控网页端右上角人头头像,在弹出的选项卡选择中文语言即可。如下: 注意:如果是在ubuntu OS上面配置文件修改完毕后,在zabbix web后台还是会显示,不支持中文的话,说明ubuntu OS没有安装中文语言包。如下: 我们只需要按照以下三步进行操作,即可解决上述问题。 第一步,安装中文包,如下: sudo apt-get -y install language-pack-zh-hant language-pack-zh-hans 第二步,配置相关环境变量: vim /etc/environment 在环境变量文件中增加语言和编码的设置: LANG=”zh_CN.UTF-8″ LANGUAGE=”zh_CN:zh:en_US:en” 第三步,重新设置本地配置: dpkg-reconfigure locales 现在重启下apache和zabbix-server两个服务就可以,如下: sudo systemctl restart apache2.service sudo systemctl restart zabbix-server.service 更换语言后,如果发现图形出现乱码,我们做如下修改即可。 修改/usr/share/zabbix/include/defines.inc.php文件的第45行和第93行,如下: vim /usr/share/zabbix/include/defines.inc.php define(‘ZBX_GRAPH_FONT_NAME’,’mysh’); define(‘ZBX_FONT_NAME’, ‘mysh’); 然后下载自己喜欢的字体,改名为msyh放到/usr/share/zabbix/fonts目录下即可。 5.2 中文显示优化 以上做完之后,你会发现尽管zabbix web支持中文,但是有些地方翻译的很不到位。如下: 据小道消息,zabbix官方的中文翻译是一位使用繁体中文的华人工程师进行翻译的。 所以在github上有大神对此进行了重新翻译,github连接地址如下:https://github.com/duanzhanling/zabbix-zh_CN 安装方法如下: wget https://github.com/echohn/zabbix-zh_CN/archive/master.zip unzip master.zip rm /usr/share/zabbix/locale/zh_CN/LC_MESSAGES/frontend.mo cp zabbix-zh_CN-master/frontend.mo /usr/share/zabbix/locale/zh_CN/LC_MESSAGES/frontend.mo 现在重启下apache和zabbix_server两个服务就可以,如下: sudo systemctl restart apache2.service sudo systemctl restart zabbix-server.service 通过上图可以看到,最新的翻译比以前好多了。
今天打算分析下nginx日志,要分析nginx日志,我们可以通过shell脚本和第三方软件awstats进行分析,在此我们选择的是通过第三方软件awstats进行分析。 要使用awstats分析nginx日志,我们要安装awstats,而在安装awstats之前,我们需要先来介绍下awstats是什么? 一、awstats是什么 awstats是一个免费非常简洁而且强大有个性的基于Perl语言的WEB日志分析工具。 它可以统计网站的如下信息: 1):访问量、访问次数、页面浏览量、点击数、数据流量等。 2):精确到每月、每日、每小时的数据。 3):访问者国家以及IP。 4):Robots/Spiders的统计。 5):访客持续时间。 6):对不同files type的统计信息。 7):Pages-URL的统计。 8):访客操作系统浏览器等信息。 9):其它信息(搜索关键字等等) 二、准备工作 在介绍完awstats是什么之后,我们再来介绍下安装awstats之前的准备工作。 2.1 安装GeoIP GeoIP主要用于定位访问者所属的国家以及城市的数据库,可以使用如下命令进行安装: yum -y install GeoIP GeoIP-devel perl-Geo-IP 查看GeoIP安装的相关组件,如下: rpm -ql GeoIP-GeoLite-data rpm -ql GeoIP-GeoLite-data-extra 如果是ubuntu系统,我们可以使用如下命令进行安装: sudo apt-get -y install geoip-bin geoip-database-contrib php5-geoip python-geoip python-geoip-dbg libgeoip1 libgeoip-dev 在上述截图的安装的文件中,我们只需要关注GeoIP.dat和GeoLiteCity.dat这两个文件即可,其中GeoIP.dat用于定位访问者所属的国家,而GeoLiteCity.dat用于定位访问者所属的城市。 2.2 安装httpd-tools 一般站长都不愿随便让其他人知道自己网站的真实流量,所以要把awstats统计结果页面进行密码保护。 因为nginx使用的是跟apache一样的密码加密格式,所以这里需要用到apache自带的工具htpasswd,而htpasswd包含在httpd-tools组件中的,所以我们要安装httpd-tools。 安装httpd-tools,使用如下命令: yum -y install httpd-tools 安装httpd-tools时,会自动安装httpd,所以我们需要把httpd禁用。如下: /etc/init.d/httpd stop chkconfig httpd off 生成密码文件,使用如下命令: htpasswd -c -m /usr/local/htpasswd.pass ilanni 三、安装awstats 准备工作做完后,我们现在来安装awstats。 3.1 下载awstats awstst官网是http://www.awstats.org/,下载最新版本de awstats。如下: wget http://www.awstats.org/files/awstats-7.5.tar.gz 3.2 安装awstats awstats下载完毕后,我们现在来安装awstats。解压安装包,并进行相关操作,如下: tar -C /usr/local/ -xf awstats-7.5.tar.gz mv /usr/local/awstats-7.5/ /usr/local/awstats chown root:root -R /usr/local/awstats/ mkdir -p /var/www/awstats/ cd /usr/local/awstats/tools/ chmod +x /usr/local/awstats/tools/*.pl chmod +x /usr/local/awstats/wwwroot/cgi-bin/*.pl 开始安装awstats,如下: ./awstats_configure.pl 因为在此我们使用的是nginx,所以以上截图填写none。 创建一个新的统计配置文件。 在这输入自己的网站域名,也可以进行自定义。 使用默认配置,生成配置文件。 安装程序执行结束后,会在/etc/awstats/目录下生成相应的配置文件。如下: ll /etc/awstats/awstats.www.ilanni.com.conf 3.3 编辑配置文件 awstats安装完毕后,我们现在来修改其配置文件awstats.www.ilanni.com.conf。在该配置文件中,我们主要修改的是awstats分析nginx日志的路径,以及日志格式,当然还有其它的一些插件。如下: vim /etc/awstats/awstats.www.ilanni.com.conf LogFile=”/var/log/nginx/ilanni.com_%YYYY-24%MM-24%DD-24.log” #配置显示国家和地区 LoadPlugin=”geoip GEOIP_STANDARD /usr/share/GeoIP/GeoIP.dat” LoadPlugin=”geoip_city_maxmind GEOIP_STANDARD /usr/share/GeoIP/GeoLiteCity.dat” #解决搜索关键字的乱码 LoadPlugin=”decodeutfkeys” 注意:LogFile路径中日志文件中的日期格式“%YYYY-24%MM-24%DD-24”,是指24小时之前的年月日,也就是昨天的日期。-24表示一天前的,-0表示当前。 3.4 安装纯真IP数据库插件 如果要详细显示国内访客的具体来源信息,我们可以使用纯真IP数据库插件。 纯真IP地址数据库下载地址:http://update.cz88.net/soft/setup.zip 在windows机器上下载安装后,安装目录下的qqwry.dat文件即是最新版IP地址数据库。 下载awstats纯真IP数据库解析插件,下载地址如下: http://down.51cto.com/data/1888530 注意,附件qqhostinfo.pm、qqwry.pl里的文件路径已经修改好。 下载完毕后,把qqhostinfo.pm、qqwry.pl、qqwry.dat这三个文件,放到awstats的wwwroot/cgi-bin/plugins目录下,并且给予qqhostinfo.pm文件可执行权限。如下: 最后修改awstats的配置文件awstats.www.ilanni.com.conf添加LoadPlugin=”qqhostinfo”选项,如下: 到此awstats安装和配置已经全部完成。 四、配置nginx日志格式 awstats安装完毕后,我们要配置nginx日志的格式,因为awstats是按照指定的格式对nginx日志文件进行分析的,所以我们要进行对应的配置。 nginx日志的配置方法如下: vim /etc/nginx/nginx.conf log_format site ‘$remote_addr – $remote_user [$time_local] “$request” ‘ ‘$status $body_bytes_sent “$http_referer” ‘ ‘”$http_user_agent” $http_x_forwarded_for’; 五、awstats与nginx进行web集成 Nginx日志格式配置完毕后,我们现在要把awstats与nginx进行集成。 为什么awstats与nginx进行集成?因为awstats的访问是通过web方式进行的。这个集成也分为两种情况 ,一个是awstats单独以nginx虚拟主机的形式存在,一种是awstats与现有nginx虚拟主机进行集成。下面分别把这两种方式的nginx配置贴出来,如下: awstats单独作为nginx的一个虚拟主机,配置文件: server { listen 80; server_name www.ilanni.com; root /var/www/awstats/; index index.html; #或者 #index awstats.test.haiyn.com.html; location ~ ^/cgi-bin/.*.(cgi|pl|py|rb) { gzip off; include fastcgi_params; fastcgi_pass unix:/tmp/php-cgi.sock; # fastcgi_pass 127.0.0.1:9000; #注意配置fastcgi_pass为你的php-fpm server. fastcgi_index cgi-bin.php; fastcgi_param SCRIPT_FILENAME /usr/local/awstats/wwwroot/cgi-bin/fcgi.php; #注意文件路径 fastcgi_param SCRIPT_NAME /cgi-bin/fcgi.php; fastcgi_param X_SCRIPT_FILENAME /usr/local/awstats/wwwroot$fastcgi_script_name; #注意文件路径 fastcgi_param X_SCRIPT_NAME $fastcgi_script_name; fastcgi_param REMOTE_USER $remote_user; } # Static awstats files: HTML files stored in DOCUMENT_ROOT/awstats/ location /classes/ { alias /usr/local/awstats/wwwroot/classes/; } location /css/ { alias /usr/local/awstats/wwwroot/css/; } location /js/ { alias /usr/local/awstats/wwwroot/js/; } location /icon/ { alias /usr/local/awstats/wwwroot/icon/; } } awstats与现有nginx虚拟主机进行集成。 注意:一定要把awstats相关的配置存放到最前面,这是因为nginx的匹配规则是从上到下进行匹配的。 server { listen 80; server_name www.ilanni.com ilanni.com; charset utf-8; access_log /var/log/nginx/ilanni.com.log main; location ~ ^/icon/ { #图标目录 root /usr/local/awstats/wwwroot; index index.html; access_log off; charset gb2312; } location ~ ^/cgi-bin/.*.(cgi|pl|py|rb) { root /usr/local/awstats/wwwroot; gzip off; include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_param X_SCRIPT_NAME $fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root/cgi-bin/fcgi.php; fastcgi_param X_SCRIPT_FILENAME $document_root$fastcgi_script_name; #fastcgi_param REMOTE_USER $remote_user; auth_basic “Restricted”; auth_basic_user_file /usr/local/awstats/htpasswd.pass; } location / { root /www/ilanni.com; index index.php index.html index.htm; } location ~ \.php$ { root /www/ilanni.com/; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } 六、生成awstats数据库 现在开始使用awstats分析日志,使用如下命令: /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www.ilanni.com 生成静态文件,使用如下命令: /usr/local/awstats/tools/awstats_buildstaticpages.pl -update -config=www.ilanni.com -lang=cn -dir=/var/www/awstats -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl 为了看到每一天更新的数据,我们可以通过crontab在每天凌晨00:01定时更新静态页面。如下: vim /etc/crontab 1 0 * * * /usr/local/awstats/tools/awstats_buildstaticpages.pl -update -config=www.ilanni.com -lang=cn -dir=/var/www/awstats -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl 七、访问awstats awstats数据库生成完毕后,我们现在来通过web页面访问下。在此我使用的是第二种方式awstats与nginx进行集成。 如下: http://www.ilanni.com/cgi-bin/awstats.pl 上输入的是我们在第二章准备工作中htpasswd生成的用户名和密码。 上图就是awstats对nginx日志文件分析后,所得到的相关信息。 上图是我们安装的GeoIP和纯真IP数据库显示的用户访问的国家、城市以及来源地址。 上图是awstats根据nginx日志文件分析出来用户是搜索哪些关键词过来的。
这几天自己看了下博客的nginx日志,发现日志文件发现越来越大。 因为nginx自己不会对日志文件进行切割,所以打算通过其他方式进行切割,而且为了后续能对nginx日志文件里面记录的数据进行分析,所以打算按照天对其进行切割。 PS:本篇文章所以的操作是在centos6.5 OS 64bit上进行。 切割nginx日志,我们可以通过两种不同的方式进行,分别是:通过logrotate和通过shell脚本。 如果是yum方式安装的nginx,系统默认会自动通过logrotate这个日志管理软件,按天进行分割。但是经过多次测试发现logrotate切割日志不会按照自己设置的时间点进行分割,这点有点失望。 所以无论是yum方式安装,还是源码方式安装,都建议使用shell脚本方式进行切割日志。 为了更深入的学习linux系统,在此也会介绍下logrotate相关的知识点。 下面分别对这两种方法进行介绍下: 一、使用logrotate切割 前面说了yum或者apt-get方式安装的nginx会自动使用logrotate这个日志管理软件进行切割,所以本章节我们主要介绍有关logrotate相关的知识点。 1.1 logrotate介绍 logrotate是什么呢?它是一个linux系统日志的管理工具。它可以切割、压缩等其他软件的日志文件软件。 logrotate是基于crontab运行的,所以这个时间点是由crontab控制的,具体可以查询crontab的配置文件/etc/anacrontab。 我们可以通过如下命令安装logrotate,如下: yum -y install logrotate 如果是ubuntu系统,可以使用如下命令进行安装: apt-get -y install logrotate 查看logrotate的配置文件,使用如下命令: rpm -ql logrotate 通过上图,我们可以很明显的看到logrotate的配置文件是/etc/logrotate.conf,而/etc/logrotate.d/是用于存储其他配置文件的目录。该目录里的所有文件都会被主动的读入 /etc/logrotate.conf中执行。 1.2 logrotate配置文件详解 logrotate配置选项相对来说比较少,为了切合本篇文章,在此我们以切割nginx的配置文件为例,如下: cat /etc/logrotate.d/nginx /var/log/nginx/*.log { daily missingok rotate 7 dateext # compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript } 在该配置文件中,每个参数作用如下: /var/log/nginx/为nginx日志的存储目录,可以根据实际情况进行修改。 daily:日志文件将按天轮循。 weekly:日志文件将按周轮循。 monthly:日志文件将按月轮循。 missingok:在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。 rotate 7:一次存储7个日志文件。对于第8个日志文件,时间最久的那个日志文件将被删除。 dateext:定义日志文件后缀是日期格式,也就是切割后文件是:xxx.log-20160402.gz这样的格式。如果该参数被注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式。 compress:在轮循任务完成后,已轮循的归档将使用gzip进行压缩。 delaycompress:总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。 notifempty:如果是空文件的话,不进行转储。 create 640 nginx adm:以指定的权限和用书属性,创建全新的日志文件,同时logrotate也会重命名原始日志文件。 postrotate/endscript:在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd进程将立即再次读取其配置并继续运行。注意:这两个关键字必须单独成行。 1.3 查看logrotate默认执行时间 logrotate切割时间默认是在每天的3:22。这个时间点可以通过crontab配置文件查看到。如下: cat /etc/anacrontab SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly 其中START_HOURS_RANGE参数就是配置logrotate切割的时间点。 如果你想在指定时间点,让logrotate切割日志的话,可以修改此配置文件的START_HOURS_RANGE参数。 但是经过多次实验,我发现logrotate没有按照我指定的时间进行切割日志。 所以最后我还是选择了使用shell脚本来切割nginx日志。 二、使用shell脚本切割 使用shell脚本切割nginx日志很简单,shell脚本内容如下: vim /usr/local/cut_del_logs.sh #!/bin/bash #初始化 LOGS_PATH=/var/log/nginx YESTERDAY=$(date -d “yesterday” +%Y%m%d) #按天切割日志 mv ${LOGS_PATH}/ilanni.com.log ${LOGS_PATH}/ilanni.com_${YESTERDAY}.log #向nginx主进程发送USR1信号,重新打开日志文件,否则会继续往mv后的文件写数据的。原因在于:linux系统中,内核是根据文件描述符来找文件的。如果不这样操作导致日志切割失败。 kill -USR1 `ps axu | grep “nginx: master process” | grep -v grep | awk ‘{print $2}’` #删除7天前的日志 cd ${LOGS_PATH} find . -mtime +7 -name “*20[1-9][3-9]*” | xargs rm -f #或者 #find . -mtime +7 -name “ilanni.com_*” | xargs rm -f exit 0 该shell脚本有两个功能,第一个是切割nginx日志,第二个是删除7天之前的nginx日志。 在切割nginx日志的功能中,我们要注意该shell脚本命名切割的日志是以切割时,是以前一天的时间就行命名该日志文件的。 所以我们在把该shell脚本放在crontab中执行时,建议在每天的0点0分执行。如下: vim /etc/crontab 0 0 * * * root /bin/sh /usr/local/cut_del_logs.sh 查看nginx切割的日志文件,如下: ll –full-time /var/log/nginx/ 通过上图,我们可以很明显的看到,切割shell脚本确实按照我们设想的进行切割和命名切割日志文件的。
前几篇文章,我们介绍了有关postfix的相关安装与配置,这篇文章我们再来介绍下,在web下管理postfix的软件roundcube webmail。 注意:本篇文章所需的基础环境都是根据《烂泥:Postfix邮件服务器搭建之准备工作》这篇文章准备的。 一、下载roundcube webmail软件包 要安装roundcube webmail,我们先要下载roundcube webmail,如下: wgethttp://jaist.dl.sourceforge.net/project/roundcubemail/roundcubemail/1.1.4/roundcubemail-1.1.4-complete.tar.gz 解压roundcube webmail软件包,并移动到apache根目录下,如下: tar -xf roundcubemail-1.1.4-complete.tar.gz mv roundcubemail-1.1.4 /var/www/html/webmail/ chown -R apache:apache /var/www/html/webmail/ chmod -R 755 /var/www/html/webmail/ ll /var/www/html/webmail/ 二、配置roundcube webmail基础环境 roundcube webmail依赖php的相关模块比较多,所以我们先要对其进行安装下。 安装php相关模块,首先更新php的软件源,如下: pear channel-update pear.php.net 安装php相关模块,如下: pear install Auth_SASL Net_SMTP Net_IDNA2-0.1.1 Mail_Mime 修改php.ini时区,如下: vim /etc/php.ini +889 date.timezone = Asia/Chongqing 以上修改完毕后,重启apache,使用如下命令: /etc/init.d/httpd restart 创建roundcube webmail所需要的数据库,如下: mysql -uroot -p’123456′ -e “create database webmail default character set utf8 collate utf8_bin;” && mysql -uroot -p’123456′ -e “grant all on webmail.* to ‘webmail’@’%’ identified by ‘webmail’;” mysql -uwebmail -pwebmail 三、安装roundcube webmail 以上全部操作完毕后,我们可以访问如下连接: http://mail.ilanni.com/webmail/installer/index.php 通过以上截图,我们可以很明显的看出roundcube webmail所需要的基础环境已经全部正确配置。 下面我们开始配置roundcube webmail,如下: 注意:以上我们可以默认,也可以进行自定义,在此我自定义了product_name选项。 该选项主要配置roundcube webmail连接mysql数据库相关的配置,这个只需要填写我们在基础环境中配置的数据库名称、用户名、密码即可。 这个界面,主要配置imap相关的一些信息,其中default_host和username_domain根据自己的实际情况进行填写,其他保持默认即可。 这个界面主要配置和smtp相关的一些信息,其中smtp_server根据自己的实际情况进行填写,其他保持默认即可。 这个界面主要配置roundcube webmail显示的一些信息,中language填写zh_CN,其他保持默认即可。 四、配置roundcube webmail 以上填写完毕后,我们基本上就把roundcube webmail安装完毕。现在我们来配置roundcube webmail,其实roundcube webmail的配置基本上也是在这个界面进行操作的。如下: 配置文件测试没有问题了,我们就可以初始化roundcube webmail数据库,如上操作。 初始化完毕后,我们来数据库中查看下,如下: 通过上图,我们可以很明显的看出roundcube webmail数据库已经初始化完毕。现在我们来测试下roundcube webmail相关功能,如下: 通过上图,我们可以很明显的看出roundcube webmail发送邮件功能是正常的。 通过上图,我们可以很明显的看出roundcube webmail的imap收件功能是正常的。 五、登录roundcube webmail 以上配置完毕后,我们现在来登录roundcube webmail,如下: http://mail.ilanni.com/webmail/ 通过上图,我们可以很明显的看出roundcube webmail已经可以正常登录,并且收发邮件。
Postfix邮件服务器的搭建需要使用到几个软件,分别是cyrus-sasl、postfix、dovecot、postfixadmin、roundcubemail,只有这几个软件相互配合才能搭建一套完整的邮件服务器。 PS:本次实验在centos6.5 64bit上进行。 一、软件功能介绍 cyrus-sasl、postfix、dovecot、postfixadmin、roundcubemail,这五款软件,分别有各自的功能。下面就分别一一介绍各自的功能。 1.1 cyrus-sasl功能介绍 cyrus-sasl(Simple Authentication Security Layer)简单认证安全层, SASL主要是用于SMTP认证。而cyrus-sasl在OS里面,saslauthd是其守护进程。 1.2 postfix功能介绍 postfix是一个电子邮件服务器,它为了改良sendmail邮件服务器而产生的,并且它的配置文件比sendmail简单得多,配置相当容易。 postfix作为发送邮件服务器。 1.3 dovecot功能介绍 dovecot是一个开源的IMAP和POP3邮件服务器,支持Linux/Unix系统。 POP/IMAP是MUA从邮件服务器中读取邮件时使用的协议。其中,与POP3是从邮件服务器中下载邮件存起来,IMAP则是将邮件留在服务器端直接对邮件进行管理、操作。 dovecot可以被其他具有相同功能的软件替代,比如:cyrus-imapd。 dovecot作为接收邮件服务器。 1.4 postfixadmin功能介绍 postfixadmin是一个基于web的postfix邮件发送服务器的管理工具,可以直接管理postfix的虚拟域名和邮件用户,前提是这些数据是存储在mysql或者是PostgreSQL数据库中。 postfix的邮件用户和虚拟域名的管理都是通过postfixadmin来进行的。 1.5 roundcubemail功能介绍 roundcubemail是一个基于浏览器,支持多国语言的IMAP客户端,它的操作界面看起像一个桌面应用程序。它提供一个email客户端应该具备的所有功能,包括MIME支持,地址薄,文件夹操作,信息搜索和拼写检查等。 roundcubemail采用PHP+Ajax开发并且需要MySQL数据库来存储数据。 用户界面采用XHTML+CSS2设计。 roundcubemail可以被其他具有相同功能的软件替代,比如:openwebmail、squireelmail。 roundcubemail作为web端的邮件客户端。 这几个软件中除了postfixadmin是通过单独下载安装的,其他的几个软件都是直接使用yum方式进行安装。但是yum方式安装的不是各个软件的最新版本,所以在下面的介绍中,我们还会介绍到最新版本的软件。 二、cyrus-sasl安装与配置 在本章节会介绍cyrus-sasl的安装和配置,先来介绍cyrus-sasl的安装。 2.1 cyrus-sasl安装 cyrus-sasl的安装很简单,使用如下命令: yum -y install cyrus-sasl 查看版本cyrus-sasl,使用如下命令: /usr/sbin/saslauthd -v 前面我们介绍了saslauthd是认证服务cyrus-sasl的守护进程,所以我们就可以通过saslauthd查看cyrus-sasl的版本。 2.2 cyrus-sasl配置 cyrus-sasl安装完毕后,我们现在来配置cyrus-sasl。 修改saslauthd文件把MECH的值修改为shadow,如下: vim /etc/sysconfig/saslauthd SOCKETDIR=/var/run/saslauthd MECH=shadow FLAGS= 修改smtpd.conf文件,添加如下代码: vim /etc/sasl2/smtpd.conf pwcheck_method: saslauthd mech_list: plain login log_level: 3 saslauthd_path:/var/run/saslauthd/mux 2.3 测试cyrus-sasl cyrus-sasl配置完毕后,我们来测试其是否正常。创建系统用户ilanni,并修改其密码,如下: useradd ilanni &&echo ‘ilannimail’| passwd –stdin ilanni su – ilanni mkdir -p ~/mail/.imap/INBOX 用户创建完毕后,要启动cyrus-sasl,如下: /etc/init.d/saslauthd start chkconfig saslauthd on 现在来使用刚刚创建的用户进行认证测试,如下: testsaslauthd -u ilanni -p ‘ilannimail’ 通过上图,我们可以很明显的看出cyrus-sasl已经正常启动,并且我们的配置也是完全正确的。 三、postfix安装与基本配置 在本章节会介绍postfix的安装和基本配置,先来介绍postfix的安装。 3.1 postfix安装 安装postfix,使用如下命令: yum -y install postfix Centos6.5默认安装的是postfix2.6.6版本,所以以下的所有配置都是在postfix2.6.6版本上进行的。 如果你想使用稍微新版本的话,可以通过如下的方式进行安装,如下: wget -P /etc/yum.repos.d https://repos.fedorapeople.org/repos/mstevens/postfix/epel-postfix.repo yum -y install postfix postconf -d | grep mail_version 注意:postconf是检查posftix配置的命令。 如果想安装最新版本的postfix的话,我们也可以通过如下连接下载安装,如下: wget http://repos.oostergo.net/6/postfix-3.1/postfix-3.1.0-1.el6.x86_64.rpm rpm -ivh postfix-3.1.0-1.el6.x86_64.rpm postconf -d | grep mail_version Posftxi安装完毕后,我们现在来开始postfix的基本配置。 3.2 postfix基本配置 为什么说是postfix的基本配置呢?因为postfix的配置选项特别多,其他的功能我们在下一篇文章中进行介绍,在此只先介绍基本的发送邮件配置。 postfix的配置文件是main.cf,main.cf文件配置选项很多,下面我们就给出最常使用的配置,红色部分是要根据自己的实际情况修改的,如下: vim /etc/postfix/main.cf queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix mail_owner = postfix myhostname = mail.ilanni.com mydomain = ilanni.com myorigin = $mydomain inet_interfaces = all mydestination = $myhostname, localhost.$mydomain, localhost local_recipient_maps = unknown_local_recipient_reject_code = 550 alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix-2.6.6/samples readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES 3.3 测试postfix配置 postfix配置完毕后,我们需要测试postfix是否可以正常发送邮件。 现在来启动postfix,使用如下命令: /etc/init.d/postfix start chkconfig postfix on netstat -tunlp ps -ef |grep postfix 通过上图,我们可以很明显的看到postfix已经正常启动,并且监听的是tcp的25端口。 postfix启动后,我们也可以通过postfix的日志进行查看。postfix的日志文件为/var/log/maillog。如下: tail -f /var/log/maillog 现在我们来测试postfix是否可以发送邮件,如下: telnet mail.ilanni.com 25 mail from:admin@ilanni.com rcpt to:xxxx36022@qq.com data . quit 注意:上述命令中mail from:admin@ilanni.com中的admin@ilanni.comn是随便填写的,而rcpt to:xxxx36022@qq.com中的邮箱则是确实存在的。 现在我们再切换到那个QQ邮箱的收件箱,查看是否收到刚刚发送的邮件,如下: 通过上图,我们可以很明显的看出postfix已经可以正常发送邮件了。 四、dovecot安装与基本配置 在本章节会介绍dovecot的安装和基本配置,先来介绍dovecot的安装。 4.1 dovecot安装 安装dovecot,使用如下命令: yum -y install dovecot dovecot-devel dovecot-mysql pam-devel dovecot –version Centos6.5安装的dovecot版本为2.0.9,如有要安装最新版的话,我们可以通过如下命令。 wget -P /etc/yum.repos.d/ http://repos.fedorapeople.org/repos/mstevens/dovecot/epel-dovecot.repo yum -y install dovecot dovecot-devel dovecot-mysql pam-devel dovecot –version 4.2 dovecot基本配置 dovecot安装完毕后,我们现在来配置dovecot。dovecot的配置选项也是很多,在此只先介绍基本的功能。 dovecot的配置文件都在/etc/dovecot/目录下。 vim /etc/dovecot/dovecot.conf protocols = imap pop3 listen = * !include conf.d/*.conf vim /etc/dovecot/conf.d/10-auth.conf disable_plaintext_auth = no auth_mechanisms = plain login !include auth-system.conf.ext 禁用ssl认证,如下: vim /etc/dovecot/conf.d/10-ssl.conf ssl = no 启用dovecot的日志,如下: vim /etc/dovecot/conf.d/10-logging.conf 现在我们来启动dovecot,使用如下命令: /etc/init.d/dovecot start chkconfig dovecot on /etc/init.d/portreserve stop chkconfig portreserve off 注意:上述命令中的portreserve服务相关的两行,这个如果启动的话,你会发现系统重启后dovecot会无法启动,这是因为portreserve占用了dovecot的端口,所以在此我们禁用portreserve服务。 4.3 测试dovecot Dovecot启动完毕后,我们现在来测试dovecot,使用如下命令: telnet mail.ilanni.com 110 telnet mail.ilanni.com 143 出现+Ok Dovecot ready,则表示dovecot配置正确。 下面我们来测试使用邮件客户端工具foxmail来连接测试,注意这个用户就是我们第2.3章节中创建的ilanni用户,具体过程如下: 注意:在此我们选择的服务器类型是POP3类型,而不是IMAP类型。如果选择IMAP类型的话,会提示权限错误。 通过上图,我们可以很明显的看到系统用户ilanni,已经正确连接到邮件服务器,这也说明了dovecot配置成功了。
说实话,Postfix邮件服务器的搭建是一件很麻烦的事情,需要各种软件之间的配置和调试。在写这篇文章之前,我也是搭建测试了不下于10次才算把整个流程给走通,今天刚好有时间把整个搭建过程记录下来。 在正式安装postfix之前,我们先来介绍在搭建之前所需要做的准备工作。 一、域名解析 因为邮件服务器牵涉到域名的问题比较多,所以在此我们先来介绍有关域名解析的相关配置。 我们需要在域名解析控制台添加MX、TXT和相关的A记录,在平时的域名解析过程中,使用最多的是DNSPod以及万网,下面分别一一介绍下。 DNSPod配置,如下: 如果对于DNSPod的MX和TXT配置记录,不清楚的话,可以查看如下连接: MX记录配置https://support.dnspod.cn/Kb/showarticle/tsid/33 TXT记录配置https://support.dnspod.cn/Kb/showarticle/tsid/34 万网配置,如下: 注意:我们现在是主域名ilanni.com解析到A服务器,mail解析到B服务器上,所以我们现在不能按照dnspod和万网的教程进行配置。 测试MX和TXT记录是否解析正确,如下: 二、lamp环境安装 为了更好的使用postfix,我们还需要安装php、mysql、apache等相关软件,我们现在进行安装。 在Centos6上执行以下命令: rpm -ivh http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm yum -y install mysql-server mysql mysql-devel php56w php56w-fpm php56w-mysql php56w-common php56w-gd php56w-mbstring php56w-mcrypt php56w-devel php56w-xml php56w-imap php56w-pear php56w-snmp 在Centos7上执行以下命令: rpm -ivh http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm&& rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm yum -y install –enablerepo=remi –enablerepo=remi-php56 mysql-server mysql mysql-devel php php-opcache php-pecl-apcu php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof php-pdo php-pear php-fpm php-cli php-xml php-bcmath php-process php-gd php-common 以上安装完毕后,我们还要做其他的操作。 启动mysql数据库,修改mysql的root用户密码。如下: /etc/init.d/mysqld start /usr/bin/mysqladmin -u root password ‘123456’ 创建postfix数据库和postfix用户,如下: mysql -uroot -p’123456′ -e “create database postfix default character set utf8 collate utf8_bin;” && mysql -uroot -p’123456′ -e “grant all on postfix.* to ‘postfix’@’%’ identified by ‘postfix’;” 删除用户名为空的主机,如下: mysql -uroot -p’123456′ mysql -e “delete from user where user=”;” 刷新mysql权限,如下: mysql -uroot -p’123456′ -e “flush privileges;” 测试postfix用户是否可以链接mysql,如下: mysql -upostfix -ppostfix 设置mysql、apache开机启动,如下: chkconfig mysqld on chkconfig httpd on 三、主机名修改 lamp配置完毕后,我们现在开始修改主机名如下: vim /etc/sysconfig/network NETWORKING=yes HOSTNAME=mai.ilanni.com NETWORKING_IPV6=no PEERNTP=no GATEWAY=121.196.247.247 以上修改需要我们重启服务器才能生效,为了更快的显示最新的主机名。我们可以通过如下命令进行修改,如下: hostname mai.ilanni.com 查看修改后的主机名,如下: hostname 四、创建邮件专用用户 为了后续的管理方便,我们使用系统的一个用户映射为对邮件服务器的用户,该用户对于postfix来说是一个虚拟用户。 所在在此之前,我们需要添加一个不能登录到系统的,并且指定用户组和用户ID的特殊用户vmail,该用户也可以自行定义。 使用如下命令进行创建,如下: groupadd -g 5000 vmail useradd -g vmail -u 5000 -s /sbin/nologin vmail 到此为止postfix的准备工作已经做完毕了。
公司目前使用的数据库是阿里云的RDS,目前RDS的版本为mysql5.6。如下: 现在要求把RDS的数据,在公司内部本地进行恢复。 如何把RDS在本地进行恢复呢?这个阿里云官网给出了相关的操作教程,连接如下:《RDS备份文件恢复到自建数据库》。 看了官网的教程,感觉很是麻烦,而且也有几个比较特殊的地方没有点出来,下面是我对RDS本地恢复的步骤。 一、安装mysql数据库 在进行RDS本地恢复数据之前,我们需要先在本地服务器上安装mysql的5.6版本,因为RDS是5.6版本,所以我们本地的mysql数据库要与RDS版本对应。 rpm -ivh http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm && yum -y install mysql-server mysql mysql数据库安装完毕后,我们现在来下载RDS备份。 二、下载RDS备份 RDS本身是有备份,而且是可以在RDS的管理后台自定义备份策略,如下: 我们可以在RDS备份列表中下载已经备份好的RDS文件,如下: 通过上图,我们可以很明显的看到RDS的备份是全量备份的,而且是物理备份的。 三、解压RDS备份文件 RDS备份文件下载完毕后,我们需要对其进行解压。按照阿里云官方文档,我们需要下载阿里云专门的脚本进行解压,而且必须是在linux OS 64bit上使用。 必须说明:RDS的备份文件只能在linux OS上进行的。在windows OS上使用第三方软件解压的话,你会发现看不到任何的文件。 下载RDS解压脚本,使用如下命令: wget http://oss.aliyuncs.com/aliyunecs/rds_backup_extract.sh 使用RDS解压脚本,解压RDS备份文件,如下: sh rds_backup_extract.sh -f /root/hins1035007_xtra_20160220031920.tar.gz -C /data 解压完毕后,我们切换到/data目录下查看RDS备份解压的文件,如下: 通过上图,可以很明显的看出,RDS是通过percona-Xtrabackup进行全量备份的。 四、修改/data目录的所有者 RDS解压完毕后,我们需要修改/data目录的所有者。如下: chown mysql:mysql -R /data/ 五、修改my.cnf配置文件 现在我们在/data目录下创建mysql的配置文件my.cnf,如下: vim /data/my.cnf [mysqld] datadir = /data/ port = 3306 server_id = 3 socket = /data/mysqld.sock max_allowed_packet=32M log-error = /data/error.log default-storage-engine=INNODB 六、启动mysql并操作 my.cnf文件创建完毕后,我们现在来启动mysql。 注意:RDS备份数据库中的root用户是没有密码的,而且此时RDS备份数据库中只有root这一个用户。 启动命令如下: /usr/bin/mysqld_safe –defaults-file=/data/my.cnf & 注意:在此mysql启动命令,是根据mysql多实例进行的,可以查看《烂泥:mysql5.5多实例部署》。 通过上图,我们可以很明显的看出mysql已经正常启动。现在我们再来测试,是否可以正常连接mysql。如下: mysql -h127.0.0.1 –uroot -p 通过上图,我们可以很明显的看出mysql是可以正常连接的。 现在我们再来创建root用户密码,并赋予其连接权限。如下: use mysql; update user set password=password(‘123456′) where user=’root’; update user set host=’%’ where user=’root’ && host=’127.0.0.1′; flush privileges; 对mysql操作完毕后,我们现在来测试mysql客户端。 七、客户端连接mysql mysql正常启动后,我们现在通过客户端连接数据库。如下: 通过上图,我们可以很明显的看到RDS数据库已经在本地正常恢复了。 注意:在此有两点和官方教程不一样的地方需要说明: 1、没有安装percona-Xtrabackup数据恢复软件进行数据恢复 2、数据库root用户是没有密码的
想要获得更多的文章,可以关注我的微信ilanniweb 公司的业务现在已经扩展到海外,对外提供的统一接口都是通过域名来解析的,但是海外用户访问国内接口的话,你懂的,很慢的。为了提高域名解析的速度,打算使用智能DNS功能,来解决海外用户域名解析慢的问题。 PS:以下所有实验,都是使用我的博客www.ilanni.com域名来进行的测试。 国内用户访问www.ilanni.com解析到121.40.187.200这个IP。 国外用户访问www.ilanni.com解析到47.88.30.33这个IP。 一、业务需求 如果是国内用户访问www.ilanni.com的话,那么则解析到我的国内阿里云服务器上,显示的内容是我博客内容。如下: 如果是国外用户访问www.ilanni.com的话,那么则解析到我的国外阿里云服务器上,显示的内容是另外一个购物网站内容。如下: 二、DNS解析配置 由于我的ilanni.com域名使用的是DNSPOD进行解析,所以需要我们登陆到DNSPOD后台进行相关配置。 配置如下: 通过上图,我们可以很容易的看到如果是国外用户的话,我们直接解析到47.88.30.33这个国外的服务器上。如果是国内用户的话,我们直接解析到121.40.187.200这个国内的服务器上。 如果是使用万网的DNS的话,是这样配置的,如下图: 三、nginx配置 DNS解析配置完毕后,我们需要配置国内国外的nginx监听域名。统一配置如下: 四、测试实际访问效果 DNS和Nginx全部配置完毕后,我们来实际测试效果。 先测试国内用户访问,如下: 通过上图,我们可以看到使用国内访问的话,确实是显示我的博客内容。 下面我们来测试使用国外访问,如下: 通过上图,我们可以很容易的看到,使用国外IP访问www.ilanni.com域名的话,显示的确实是一个购物网站的内容。 这个完全达到了我们预期的效果,也确实达到了智能DNS的功能,根据不同地区访问的IP地址,解析到不同的服务器。
一、业务需求 目前一台服务器上,部署了4个tomcat,也就相当于4个节点。平时在维护业务时,需要我们一个一个tomcat实例进行单独的维护,感觉很不方便,所以就有了这篇文章。 但是为了更方便的管理这4个tomcat,我这边做了两方面的工作,一是把所有的tomcat工作目录都指向另外单独的一个目录下,二是通过shell来启动、关闭和重启tomcat。 PS:本次实验的测试OS为centos6.5 64bit,但是shell脚本也可以在ubuntu下使用。 二、修改tomcat工作目录 为了不一个一个单独的维护tomcat实例,首先我们来修改tomcat实例的工作目录。所有的tomcat配置文件位于conf目录下的server.xml文件。 我们只需要修改server.xml文件的appBase配置项,这样就可以指定tomcat实例的工作目录。如下: 我们需要把每一个tomcat实例server.xml配置文件的appBase配置项,修改为/app/tomcat/apiwebapps。 以上修改完毕后,我们需要创建/app/tomcat/apiwebapps目录。 mkdir -p /app/tomcat/apiwebapps tree -L 3 /app/ 现在我们可以查看node1为例,查看该tomcat实例的目录结构,如下: tree -L 1 ./node1 注意:这4个tomcat所监听的端口是不同的,否则无法启动tomcat。 有关tomcat的单机多实例,可以看我的下一篇文章《烂泥:学习tomcat之tomcat单机多实例》。 三、创建shell脚本 现在我是把4个tomcat实例都放到/app/tomcat目录下, 这4个tomcat实例目录名称分别为node1、node2、node3、node4。 可以看出这4个tomcat实例的命名规则为node${i}。现在开始编写shell脚本。 3.1 新建ilanni.sh脚本 新建一个shell文件命名为 ilanni.sh,内容如下: #!/bin/bash # Apache Tomcat daemon # chkconfig: 345 10 10 # description: Apache Tomcat daemon # processname: tomcat echo ” ______ __ “ echo ” /_ __/___ ____ ___ _________ _/ /_ “ echo ” / / / __ \/ __ __ \/ ___/ __ / __/ “ echo ” / / / /_/ / / / / / / /__/ /_/ / /_ “ echo “/_/ \____/_/ /_/ /_/\___/\__,_/\__/ “ echo ” “ #定义JAVA_HOME export JAVA_HOME=/usr/local/java/jdk1.7.0_80 #定义多个tomcat的总目录,/app/tomcat目录下有node1、node2、node3、node4 四个tomcat实例。 tom=”/app/tomcat/node” #定义启动脚本路径 startup_bin=”bin/startup.sh” #定义tomcat的启动方式,启动方式为tomcat.sh p1 start类似的命令 usage=”{p1|p2|p3|all} {start|stop|restart|status}” dev=”/dev/null” #定义如何启动tomcat,在此我们是通过个数tomcat以及前面定义的tomcat的命令,来操作tomcat #judge $1 $2 whether null if [ “$1” == “” -o “$2” == “” ];then echo echo “Usage: $0 $usage” echo exit 1 fi #judge $1 case $1 in “p1”) tomcats=”1″ ;; “p2”) tomcats=”1 2″ ;; “p3”) tomcats=”1 2 3″ ;; “all”) tomcats=”1 2 3 4″ ;; *) echo “Usage: $0 $usage” ;; esac #定义tomcat的启动 #define start function tomcatstart() { for i in $tomcats do tom_home=”$tom$i” run_status=$(ps -ef | grep -v ‘grep’ | egrep “java.*=${tom_home}”) if [ “${run_status}X” != “X” ];then echo “node$i is already running…” else ${tom_home}/${startup_bin} &>$dev echo “node$i starting,Please wait 2s…” sleep 2 fi done } #定义tomcat的关闭 #define stop function tomcatstop() { for j in $tomcats do tom1_home=”$tom$j” tomcat_pid=$(ps -ef | grep ${tom1_home} | grep “org.apache.catalina.startup.Bootstrap start” | awk ‘{printf $2}’) if [ “${tomcat_pid}X” == “X” ];then echo “node$j is not running…” else kill -9 ${tomcat_pid} & >$dev echo “node$j stopping,Please wait 1s…” sleep 1 echo “delte node$j cache,Please wait 1s…” rm -rf ${tom1_home}/work/* fi done } #定义tomcat的重启 #define restart function tomcatrestart() { for m in $tomcats do tom2_home=”$tom$m” run2_status=$(ps -ef | grep -v ‘grep’ | egrep “java.*=${tom2_home}”) if [ “${run2_status}X” == “X” ];then echo “node$m is not running…” ${tom2_home}/${startup_bin} &>$dev echo “node$m starting,Please wait 2s…” sleep 2 else ps -ef | grep ${tom2_home} | grep “org.apache.catalina.startup.Bootstrap start” | awk ‘{printf $2}’| xargs kill -9 >$dev echo “node$m stopping,Please wait 2s…” sleep 1 ${tom2_home}/${startup_bin} &>$dev echo “node$m starting,Please wait 2s…” sleep 2 fi done } #定义tomcat的状态 #define status function tomcatstatus() { for n in $tomcats do tom3_home=”$tom$n” run3_status=$(ps -ef | grep -v ‘grep’ | egrep “java.*=${tom3_home}”) if [ “${run3_status}X” == “X” ];then echo “node$n is not running…” else echo “node$n is running” fi done } #judge $2 case $2 in “start”) tomcatstart ;; “stop”) tomcatstop ;; “restart”) tomcatrestart ;; “status”) tomcatstatus ;; *) echo “Usage: $0 $usage” ;; esac 3.2 修改ilanni.sh文件权限 ilanni.sh脚本创建完毕后,现在我们来修改ilanni.sh的执行权限。如下: chmod +x ilanni.sh 四、启动与关闭tomcat ilanni.sh权限修改完毕之后,我们就可以来启动这4个tomcat实例了。比如现在想启动node1和node2这两个实例,我们可以通过以下命令来启动。 ./ilanni.sh p2 start ./ilanni.sh p2 status 通过上图,可以很明显的看出实例node1、node2已经启动了。 tomcat启动后,如果要停止的话,我们可以使用如下命令: ./ilanni.sh p2 stop 通过上图,我们可以看到,我们已经把实例node1、node2停掉了,而且我们也删除了实例node1、node2的缓存。 以上我们是以启动两个tomcat实例为例的,如果启动或者关闭是一个、三个以及所有tomcat实例的话,我们可以使用如下命令。 ./ilanni.sh p1 start ./ilanni.sh p3 start ./ilanni.sh all start 当然相应的关闭、重启和查看状态命令,分别如下。 关闭命令: ./ilanni.sh p1 stop ./ilanni.sh p3 stop ./ilanni.sh all stop 查看状态命令: ./ilanni.sh p1 status ./ilanni.sh p3 status ./ilanni.sh all status 注意:该shell脚本只能按照node1、node2、node3、node4等依次执行下去,不能单独的停止和启动tomcat实例,除node1外。 五、把ilanni脚本加入系统服务 为了操作更方便,我们可以把ilanni.sh这个脚本加入到系统服务中。具体操作方法如下: cp ilanni.sh /etc/init.d/ilanni chkconfig –add /etc/init.d/ilanni chkconfig ilanni on 查看是否已添加进服务列表 chkconfig –list |grep ilanni 添加到服务以后, 就可以这样以服务方式来启动和停止、重启tomcat实例了。如下: /etc/init.d/ilanni p2 start /etc/init.d/ilanni p2 status 通过上图,我们可以出,ilanni.sh脚本已经就加入到系统服务之中了。 到此有关通过shell批量管理tomcat的文章就结束了。 ilannishell脚本下载。
昨天介绍了haproxy的手机匹配规则,今天再来介绍下haproxy与nginx、zabbix的集成。接下来我会详细介绍haproxy与nginx目录浏览功能的集成,与zabbix集成我会把haproxy配置贴出来。 一、业务需求 由于业务需求,现在要把服务器上的部分目录暴露出去,让其它系统来调用暴露出去的文件,但是现在要求对外提供的还是80端口的http服务。 分析: 要达到上述的要求,首先我们要提供目录浏览的功能,这个我们可以使用apache或者nginx的目录浏览功能。在此,我们使用的是nginx的目录浏览功能(即nginx的目录索引功能)。 然后让haproxy反向代理到nginx,就可以实现业务的需求。 二、nginx配置 nginx的安装在此就不列出了,下面我们直接看nginx的配置文件。如下: user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘ ‘$status $body_bytes_sent “$http_referer” ‘ ‘”$http_user_agent” “$http_x_forwarded_for”‘; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; gzip on; server { listen 8088; server_name 127.0.0.1; charset utf-8; access_log /var/log/nginx/log/host.access.log main; location /testnginx/ { root /data/; autoindex on; } } } nginx现在我们定义的是监听8088这个端口,而且对外开放的是/data下的是testnginx这个目录。 注意:这个对外的目录名称一定要记住,这个名称我们在haproxy匹配规则中会使用到。 nginx配置完毕后,我们选择来查看下起目录浏览功能。如下: http://http.ilanni.com:8088/testnginx/ 通过上图,我们可以很明显的看出nginx的目录浏览已经完全没有问题。 三、haproxy配置 nginx配置完毕后,我们现在来配置haproxy。haproxy的配置就很简单了。 只需要根据客户端请求的url中匹配目录的名称即可。具体配置文件如下: global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 uid 188 gid 188 daemon tune.ssl.default-dh-param 2048 defaults log global mode http option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.1 option redispatch retries 3 option redispatch maxconn 2000 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen admin_stats bind 0.0.0.0:1080 mode http option httplog maxconn 10 stats refresh 30s stats uri /stats stats auth admin:admin stats hide-version frontend weblb bind *:80 acl is_nginx url_beg /testnginx acl is_http hdr_beg(host) http.ilanni.com use_backend nginxserver if is_nginx is_http use_backend httpserver if is_http backend httpserver balance source server web1 127.0.0.1:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 backend nginxserver balance source server web1 127.0.0.1:8088 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 在haproxy配置文件中,我们定义了一个is_nginx规则,该规则匹配的是以testnginx目录开始的url,然后把该规则转发到后端的nginxserver服务器组,而nginxserver服务器组就是nginx服务器。 这样就完成了nginx与haproxy集成。 注意:在这有一点一定要注意啦,haproxy匹配目录的时候,后端的服务器组一定要存在该目录,否则会报404错误的。这个是我踩过很多坑后才知道的。 四、测试集成功能 nginx与haproxy集成配置完毕后,我们选择来访问http://http.ilanni.com/testnginx/测试其功能,如下: 通过上图,我们可以很明显的看出haproxy已经完美的和nginx目录浏览功能集成了。 五、haproxy与zabbix集成 前几章节我们讲解了haproxy与nginx进行集成的功能,在这一章节,我们再来介绍下haproxy与zabbix集成的功能。 zabbix在此我们是使用的yum方式进行安装的,安装完毕后apache监听的是8099端口。访问形式如下: http://zabbix.ilanni.com:8099/zabbix/ 现在要求直接使用80端口访问zabbix,haproxy具体配置如下: global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 uid 188 gid 188 daemon defaults log global mode http option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.1 option redispatch retries 3 option redispatch maxconn 2000 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen admin_stats bind 0.0.0.0:1080 mode http option httplog maxconn 10 stats refresh 30s stats uri /stats stats auth admin:admin stats hide-version frontend weblb bind *:80 acl is_lianzhou hdr_beg(host) zabbix.ilanni.com acl is_zabbix url_beg /zabbix use_backend zabbix if is_zabbix backend zabbix balance source server web1 192.168.1.22:8099 maxconn 1024 weight 1 check inter 2000 rise 2 fall 3 haproxy配置很简单,只需要定义一个is_zabbix的url匹配规则,然后分发到后端的服务器组即可。 还是需要注意的,匹配的目录在后端服务器是存在的。 配置完毕后,访问如下: http://zabbix.ilanni.com/zabbix/ 通过上图,我们可以很明显的看出haproxy与zabbix已经完美集成。
一、业务需要 现在根据业务的实际需要,有以下几种不同的需求。如下: 1.1 转发所有手机请求 所有通过手机端访问http.ilanni.com域名的话,全部转发到http://www.ilanni.com这个地址,而PC端不受此限制。 1.2 根据url进行转发 如果手机端请求http.ilanni.com这个域名的url中,以docs或者manager这两个关键词开头的话,把该请求转发到后端的服务器,而PC端不受此限制。 也就是说手机端访问具体的url地址的话,可以正常访问。如果是直接访问http.ilanni.com域名的话,直接把该请求转发到http://www.ilanni.com这个地址。 二、haproxy配置 下面根据不同的业务需求进行配置haproxy,如下。 2.1 转发所有手机请求配置 要把所有的手机端请求转到www.ilanni.com这个地址,需要我们首先把访问的终端匹配出来,haproxy可以通过hdr_sub(user-agent)这个参数把手机端匹配出来。 手机端匹配出来后,我们就可以定义相应的规则,把手机端的请求转发到www.ilanni.com这个地址了。 haproxy具体配置文件如下: global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 uid 188 gid 188 daemon tune.ssl.default-dh-param 2048 defaults log global mode http option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.1 option redispatch retries 3 option redispatch maxconn 2000 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen admin_stats bind 0.0.0.0:1080 mode http option httplog maxconn 10 stats refresh 30s stats uri /stats stats auth admin:admin stats hide-version frontend weblb bind *:80 acl is_http hdr_beg(host) http.ilanni.com acl ua hdr_sub(user-agent) -i android iphone redirect prefix http://www.ilanni.com if ua use_backend httpserver if is_http backend httpserver balance source server web1 127.0.0.1:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 在以上配置文件中,有以下两行需要注意: acl ua hdr_sub(user-agent) -i android iphone redirect prefix http://www.ilanni.com if ua 这两行,第一行是第一个ua规则,该规则是判断是否是手机端。 注意:在此手机端,我们只匹配了安卓手机和iphone。 第二行是跳转规则,如果匹配是手机端的话,那么直接跳转到http://www.ilanni.com这个地址。 如果是PC端的话,默认跳转到httpserver这个后端服务器组。 以上配置是一台服务器对外只提供一个域名访问的请求,如果有两个域名的话,就要进行如下配置: global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 uid 188 gid 188 daemon tune.ssl.default-dh-param 2048 defaults log global mode http option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.1 option redispatch retries 3 option redispatch maxconn 2000 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen admin_stats bind 0.0.0.0:1080 mode http option httplog maxconn 10 stats refresh 30s stats uri /stats stats auth admin:admin stats hide-version frontend weblb bind *:80 acl is_http hdr_beg(host) http.ilanni.com acl is_haproxy hdr_beg(host) haproxy.ilanni.com acl ua hdr_sub(user-agent) -i android iphone redirect prefix http://www.ilanni.com if ua !is_haproxy use_backend haproxyserver if ua is_haproxy use_backend haproxyserver if is_haproxy use_backend httpserver if is_http backend httpserver balance source server web1 127.0.0.1:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 backend haproxyserver balance source server web1 127.0.0.1:7070 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 2.2 测试转发所有手机请求 现在我们来测试该跳转功能,如下: 通过测试你会发现,在手机浏览器中输入http.ilanni.com会自动跳转到http://www.ilanni.com这个地址。 2.3 根据url进行转发配置 根据手机端请求的url进行转发的话,首先也是需要匹配出手机端,然后定义url路径规则。最后结合手机端和url路径规则,进行跳转。 haproxy具体配置文件,如下: global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 uid 188 gid 188 daemon tune.ssl.default-dh-param 2048 defaults log global mode http option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.1 option redispatch retries 3 option redispatch maxconn 2000 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen admin_stats bind 0.0.0.0:1080 mode http option httplog maxconn 10 stats refresh 30s stats uri /stats stats auth admin:admin stats hide-version frontend weblb bind *:80 acl is_http hdr_beg(host) http.ilanni.com acl is_docs url_beg /docs /manager acl ua hdr_sub(user-agent) -i android iphone redirect prefix http://www.ilanni.com if ua !is_docs use_backend httpserver if ua is_docs use_backend httpserver if is_http backend httpserver balance source server web1 127.0.0.1:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 在上述配置文件中,需要以下几行解释下。 acl is_docs url_beg /docs /manager 定义一个is_docs规则。如果url以/docs或者/manager开头的,则全部属于该规则。 acl ua hdr_sub(user-agent) -i android iphone redirect prefix http://www.ilanni.com if ua !is_docs 这两行首先是匹配出手机端,然后如果是手机端访问,并且访问的不是is_docs规则的话,则直接跳转到http://www.ilanni.com这个地址。 use_backend httpserver if ua is_docs 这条命令是,如果是手机端访问,并且访问的是is_docs规则的话,则直接跳转到httpserver这个后端服务器组。 如果是PC端的话,默认跳转到httpserver这个后端服务器组。 2.4 测试根据url进行转发 根据url转发配置完毕后,我们现在来测试。如下: 通过上图,我们可以看到手机端访问http://http.ilanni.com/docs/这个连接的话,是可以直接访问的。 三、其他haproxy配置 在前面我们讲解了有关手机的相关配置,在实际的生产环境中,有时候我们会碰到一些奇奇怪怪的要求。 要求所有手机端访问的http.ilanni.com,转到指定的页面。 haproxy主要配置文件如下: frontend weblb bind *:80 acl is_http hdr_beg(host) http.ilanni.com acl ua hdr_sub(user-agent) -i android iphone redirect prefix http://www.ilanni.com/?p=10624 if ua use_backend httpserver if is_http backend httpserver balance source server web1 127.0.0.1:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 以上配置是所有手机端访问的,都跳转到http://www.ilanni.com/?p=10624这个页面。测试如下: 通过上图,我们可以看到手机端的访问确实跳转到了我们指定的页面。 类似这样的要求,一般会在升级公司相关业务时提出,对公司的公网IP可以正常,但是外部访问时,跳转到指定的维护页面。 这个我们可以根据源IP地址进行匹配,在此就不进行详细的讲解了。 通过上图,我们可以看到手机端访问http://http.ilanni.com/manager/status这个连接的话,是可以直接访问的。 通过上图,我们可以看到如果手机端访问的不是is_docs这个规则中定义的url话,则会全部跳转到http://www.ilanni.com这个地址的。
在前一段时间,我写了几篇有关学习haproxy的文章。今天我们再来介绍下haproxy的https配置,https协议的好处在此,我们就不就作介绍了。 我们只介绍如何配置https,以及https在实际生产环境中的应用。 PS:本实验全部在haproxy1.5.4版本进行测试通过。haproxy1.3版本以下haproxy配置参数可能不能使用,需要注意版本号。 以下haproxy配置是线上生产环境直接使用的。 一、业务要求 现在根据业务的实际需要,有以下几种不同的需求。如下: 1.1 http跳转https 把所有请求http://http.ilanni.com的地址全部跳转为https//:http.ilanni.com这个地址。 1.2 http与https并存 服务器同时开放http://http.ilanni.com和https://http.ilanni.com的访问形式。 1.3 同台服务器不同域名之间的https与http 同一台服务器对http.ilanni.com域名访问的全部跳转为https://http.ilanni.com,而对haproxy.ilanni.com访问走http协议,也就是跳转到http://haproxy.ilanni.com这个地址。 1.4 同台服务器多域名均使用https 同一台服务器对http.ilanni.com和haproxy.ilanni.com访问走http是协议。 二、配置haproxy并测试业务需求 现在我们根据业务的需求,我们来配置haproxy一一达到其需求。 2.1 http跳转https配置 说实话haproxy的https配置要比nginx配置简单的多了,我们只需要加入几行代码即可实现https的功能。 http跳转https的haproxy配置文件内容,如下: global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 uid 188 gid 188 daemon tune.ssl.default-dh-param 2048 defaults log global mode http option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.1 option redispatch retries 3 option redispatch maxconn 2000 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s listen admin_stats bind 0.0.0.0:1080 mode http option httplog maxconn 10 stats refresh 30s stats uri /stats stats auth admin:admin stats hide-version frontend weblb bind *:80 acl is_http hdr_beg(host) http.ilanni.com redirect scheme https if !{ ssl_fc } bind *:443 ssl crt /etc/haproxy/ilanni.com.pem use_backend httpserver if is_http backend httpserver balance source server web1 127.0.0.1:7070 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 在以上配置文件中,需要注意的选项如下: tune.ssl.default-dh-param 2048因为我们的SSL密钥使用的是2048bit加密,所以在此进行声明。 acl is_http hdr_beg(host) http.ilanni.com redirect scheme https if !{ ssl_fc } bind *:443 ssl crt /etc/haproxy/ilanni.com.pem 这三行表示把所有访问http.ilanni.com这个域名的请求,全部转发到https://http.ilanni.com这个连接。 2.2 测试http跳转https http跳转https配置完毕后,我们选择来测试其跳转。如下: 你会发现在浏览器中,无论你输入的是http.ilanni.com,还是http://http.ilanni.com亦或是https://http.ilanni.com,都会自动跳转到https://http.ilanni.com。 这样就达到了,把所有的http请求跳转到https的目的。 2.3 http与https并存配置 haproxy要实现http和https并存的话,配置也很简单,只需要把haproxy分别监控不同的端口就行,配置文件如下: global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 user haproxy group haproxy daemon tune.ssl.default-dh-param 2048 defaults log global mode http option httplog option dontlognull retries 3 option redispatch maxconn 2000 timeout connect 5000ms timeout client 50000ms timeout server 50000ms listen admin_stats bind 0.0.0.0:1080 mode http option httplog maxconn 10 stats refresh 30s stats uri /stats stats auth admin:admin stats hide-version frontend weblb bind *:80 acl is_http hdr_beg(host) http.ilanni.com use_backend httpserver if is_http backend httpserver balance source server web1 127.0.0.1:7070 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 frontend weblb443 bind *:443 ssl crt /etc/haproxy/ilanni.com.pem acl is_443 hdr_beg(host) http.ilanni.com use_backend httpserver443 if is_443 backend httpserver443 balance source server web1 127.0.0.1:7070 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 在以上配置文件中,我们定义了两个前端,一个前端用于监听80端口,也就是http协议。另外一个前端监听443端口,也就是https协议。 此时haproxy会根据客户端请求的协议进行分发,如果发现客户端请求的是http协议,则把该请求分发到监听80端口的前端。如果发现客户端请求的是https协议,则把该请求分发到监听443端口的前端。如此就达到了haproxy让http和https并存的要求。 2.4 测试http与https并存 http与https并存配置完毕后,我们选择来测试其跳转。如下: 通过测试你会发现,在浏览器中如果你输入的是http://http.ilanni.com或者是http.ilanni.com都会直接跳转到http://http.ilanni.com,而输入的是https://http.ilanni.com,则只会跳转到https://http.ilanni.com。 如此就到达了,我们业务的要求实现http和https并存。 2.5 同台服务器不同域名之间的https与http配置 同台服务器不同域名之间的http和https配置比较复杂,第一需要监听两个端口,第二还要根据不同的域名进行分发。 haproxy配置文件如下: global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 uid 188 gid 188 daemon tune.ssl.default-dh-param 2048 defaults log global mode http option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.1 option redispatch retries 3 option redispatch maxconn 2000 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s listen admin_stats bind 0.0.0.0:1080 mode http option httplog maxconn 10 stats refresh 30s stats uri /stats stats auth admin:admin stats hide-version frontend weblb bind *:80 acl is_haproxy hdr_beg(host) haproxy.ilanni.com acl is_http hdr_beg(host) http.ilanni.com redirect prefix https://http.ilanni.com if is_http use_backend haproxyserver if is_haproxy backend haproxyserver balance source server web1 127.0.0.1:9090 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 frontend weblb443 bind *:443 ssl crt /etc/haproxy/ilanni.com.pem acl is_443 hdr_beg(host) http.ilanni.com use_backend httpserver443 if is_443 backend httpserver443 balance source server web1 127.0.0.1:7070 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 同台服务器不同域名之间的https与http配置,我们配置了两个前端一个用于监听80端口,并且根据不同的域名进行跳转。在80端口的规则中,如果客户端请求的是http.ilanni.com,这个域名的话,则haproxy会把该请求直接跳转到https://http.ilanni.com。如果是haproxy.ilanni.com,这个域名的话,则分发到后端的服务器。 另外一个前端用于监听443端口,用于分发客户端https://http.ilanni.com的请求。 2.6 测试同台服务器不同域名之间的https与http配置 同台服务器不同域名之间的https与http配置配置完毕后,我们现在来进行测试。如下: 通过上图,我们可以发现在浏览器中输入haproxy.ilanni.com会跳转到http://haproxy.ilanni.com这个地址,而如果输入的是http.ilanni.com或者是http://http.ilanni.com,亦或是https://http.ilanni.com的话,都会跳转到https://http.ilanni.com。 如此就达到了我们的业务要求,同台服务器上访问haproxy.ilanni.com直接跳转到80端口,如果访问的是http.ilanni.com域名的话则跳转到https://http.ilanni.com这个地址。 2.7 同台服务器多域名均使用https配置 要使同台服务器的两个设置多个域名都使用https协议的话,配置很简单。只需要在haproxy中启用各自的https配置即可。 haproxy配置文件,如下: global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 uid 108 gid 116 daemon tune.ssl.default-dh-param 2048 defaults log global mode http option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.1 option redispatch retries 3 option redispatch timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen admin_stats bind 0.0.0.0:1080 mode http option httplog maxconn 10 stats refresh 30s stats uri /stats stats auth admin:admin stats hide-version frontend web80 bind *:80 acl is_http hdr_beg(host) http.ilanni.com redirect scheme https if !{ ssl_fc } bind *:443 ssl crt /etc/haproxy/ilanni.com.pem acl is_haproxy hdr_beg(host) haproxy.ilanni.com redirect scheme https if !{ ssl_fc } bind *:443 ssl crt /etc/haproxy/ilanni.com.pem use_backend httpserver if is_http use_backend haproxyserver if is_haproxy backend httpserver balance source server web1 127.0.0.1:6060 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 backend haproxyserver balance source server web1 127.0.0.1:9090 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 配置文件比较简单,在此就不做进一步的讲解了。 2.8 测试同台服务器多域名均使用https 同台服务器多域名均使用https,配置完毕后,现在我们来测试下。 通过上图,我们可以看到在浏览中无论是输入http.ilanni.com、http://http.ilanni.com,还是haproxy.ilanni.com、http://haproxy.ilanni.com,都会跳转到相应的https地址。 这也达到了我们业务的要求。
一、dnsmasq简介 dnsmasq是一款小巧且方便地用于配置DNS服务器和DHCP服务器的工具,适用于小型网络,它提供了DNS解析功能和可选择的DHCP功能。 dnsmasq可以解决小范围的dns查询问题,如果业务是跨机房、跨地区的话不建议使用dnsmasq做为dns解析服务器。 dnsmasq官网如下: http://www.thekelleys.org.uk/dnsmasq/doc.html 下载dnsmasq地址如下: http://www.thekelleys.org.uk/dnsmasq/ 通过上图,我们可以看到dnsmasq目前还在持续性更新。 二、安装dnsmasq dnsmasq的安装我们可以源码安装,也可以直接通过yum和apt-get方式进行安装,下面对此分别介绍下。 2.1 源码安装 源码安装dnsmasq,从dnsmasq官网下载,如下: wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.75.tar.gz yum -y install gcc tar -xf dnsmasq-2.75.tar.gz cd dnsmasq-2.75 make install 安装完毕后,查看下dnsmasq的版本。如下: dnsmasq -v 2.2 yum和apt-get方式安装 yum方式安装,如下: yum -y install dnsmasq dnsmasq -v apt-get方式安装,如下: sudo apt-get -y install dnsmasq dnsmasq -v dnsmasq安装完毕后,现在我们来配置dnsmasq。 三、dnsmasq配置 dnsmasq配置选项比较多,我们可以根据实际需求来进行配置。下面介绍下,平时最常使用的配置方法。 vim /etc/dnsmasq.conf resolv-file=/etc/resolv.dnsmasq.conf strict-order listen-address=192.168.1.24 address=/ilanni.com/192.168.1.24 server=223.5.5.5 bogus-nxdomain=223.5.5.5 resolve-file定义dnsmasq从哪里获取上游DNS服务器的地址, 默认是从/etc/resolv.conf获取。 在此我们定义的是从/etc/resolv.dnsmasq.conf文件中获得。 strict-order表示严格按照resolv-file文件中的顺序从上到下进行DNS解析,直到第一个解析成功为止。 listen-address定义dnsmasq监听的地址,默认是监控本机的所有网卡上。 如果想让局域网内的其他机器使用dnsmasq解析域名的话,需要添加本机的IP地址。 address自定义域名解析的IP地址,在此已ilanni.com这个域名为例。注意dnsmasq是支持泛域名解析的,以上配置就是一个典型的泛域名解析实例。 address也可以过滤某些网站,比如如果不想让客户端解析youk.com这个域名的话,我们这个把该域名解析到一台不存在的服务器上或者解析到127.0.0.1这个地址。如下: address=/ilanni.com/127.0.0.1 为了防止DNS污染,我们使用bogus-nxdomain定义DNS解析的服务器。 注意:如果在阿里云服务器上配置dnsmasq,一定要启用此项。 server这行告诉dnsmasq使用DNS服务器进行解析 我们也可以通过server对不通的网站使用不通的DNS服务器进行解析。如下: server=/google.com/8.8.8.8 以上表示对于google的服务,使用谷歌的DNS解析。 以上配置完毕后,需要重启dnsmasq服务,重启完毕后局域网中的其他机器,就可以通过该DNS服务器解析公网的域名。 四、客户端测试 现在我们切换到客户端,修改客户端的dns配置文件。在此已centos6为例进行讲解,如下: cat /etc/resolv.conf nslookup ilanni.com nslookup wwww.ilanni.com nslookup www.baidu.com 通过上图,我们可以很明显的看出www.ilanni.com、ilanni.com都解析到了192.168.1.24这台服务器上,而www.baidu.com已经解析到公网的IP地址。
想要获得更多的文章,可以关注我的微信ilanniweb。 为什么要学习gpg呢?因为要在Linux下把一个邮箱的密码加密,不让其他人看到该邮箱真正的密码。 为了不让其他人看到真正的邮箱密码,我们需要对其进行加密。 加密的方式是先把密码先写到一个文件A中,然后使用相关的加密软件对该文件A进行加密生成新的文件B。此时再删除文件A。 其他程序调用邮箱密码时,只调用加密后的文件B,同时对文件B进行解密。 加密我们使用的是gpg这个工具,下面我们来介绍下gpgp。 一、gpg是什么 GPG是GNU Privacy Guard或GnuPG的简称,它是一种用于加密、数字签章及产生非对称匙对的加密软件。 GPG使用非对称加密算法,安全程度比较高。所谓非对称加密算法,就是每一个用户都拥有一对密钥:公钥和私钥。其中,私钥由用户保存,公钥则由用户尽可能地分发给其他人,以便其他人与用户进行通信。 二、安装gpg gpg的安装非常简单,在此我们以ubuntu 14.04 server为例。如下: sudo apt-get -y install gnupg gnupg-agent rng-tools centos6默认已经安装gpg,还需要我们在安装rng-tools就可以正常使用。如下: yum -y install rng-tools gpg安装完毕后,我们可以使用gpg –help命令查看gpg的使用方法。如下: gpg –help 通过上图,我们可以看到gpg有很多选项。在此我们就不一一介绍了,下面文章中会介绍几个比较常用的命令。 三、创建gpg密钥对 在第一章,我们已经介绍了gpg使用非对称加密算法。非对称加密算法需要一对密钥对:一个公钥、一个私钥。 现在我们就来创建这对密钥,使用gpg –gen-key命令。如下: gpg –gen-key 上面这张图中,我们一定要选择第一项,因为只有第一项用于加密,其他几项都是用于签名。 上面这张图中,我们根据实际情况进行选择密钥的有效期限。在此默认使用永久生效,永不过期。 上面这张图中,是配置密钥的加密长度。默认是2048bit,密钥的长度越长,加密的速度越慢。在此我们使用的是,默认配置。 这个填写该密钥的相关用户信息。 上图中,有两个地方需要记住。第一就是设置的私钥密码,第二就是生成密钥的密钥ID。 私钥密码是解密时需要的。密钥ID是对文件进行加密需要的。 四、加密文件 密钥对创建完毕后,我们现在来使用该密钥对一个文件A进行加密。 4.1 创建文件filea 首先创建文件filea,内容为ilannipassword。如下: vi filea ilannipassword 4.2 加密文件filea 文件filea创建完毕后,现在我们来使用gpg加密文件filea。使用gpg –e命令。如下: gpg -e -r ilanni filea 这条命令的意思是,使用ilanni这个用户的密钥对文件filea进行加密。 通过上图,我们可以很明显的看出gpg已经把文件filea加密成新的文件filea.gpg。 现在我们来查看下加密后的文件filea.gpg,如下: cat filea.gpg 通过上图,我们可以很明显的看出filea.gpg文件就是一堆乱码。这样就达到了加密的效果。 五、解密文件 文件filea被加密后形成新的文件filea.gpg,如果我们要知道加密前文件filea的内容的话,那么就需要我们来解密filea.gpg文件。 要解密gpg加密后的文件,我们需要使用ilanni这个用户的公钥和私钥。 在此我们是在ilanni这个用户密钥生成的机器A上进行解密的。如果在其他的机器B上来解密filea.gpg文件,那么就需要在B机器上把ilanni这个用户的私钥和公钥都导入进来。否则无法完成filea.gpg文件的解密。 解密filea.gpg,只需要使用gpg –d命令就行了。但是考虑到我们程序不需要人工进行交互,所以我们使用了如下的命令。 gpg –no-use-agent –passphrase=ilanni -q –no-tty -d filea.gpg 通过上图,我们可以很明显的看到filea.gpg文件已经被成功解密。 六、gpg参数介绍 gpg的参数比较多,下面就稍微介绍下,经常使用到的几个参数。 –gen-key:生成一副新的密钥对 –fingerprint:显示指纹 –send-keys:把密钥导出到某个公钥服务器上 –recv-keys:从公钥服务器上导入密钥 -a, –armor:输出经ASCII封装 -r, –recipient USER-ID:为收件者“某某”加密 -e, –encrypt:加密数据 -d, –decrypt:解密数据 -o, –output FILE:指定输出文件 –list-keys:显示所有公钥 –list-secret-key:显示所有私钥 –delete-keys:删除公钥 –delete-secret-keys:删除私钥 –delete-secret-and-public-keys:删除公钥和私钥 –import:导入公钥和私钥 –no-use-agent:不使用用户代理 –passphrase:私钥密码 –no-tty:在执行gpg时终端不显示信息 –quiet:使用安静模式 七、gpg的其他使用方法 下面列举下gpg常用参数的使用案例,如下。 7.1 gpg 查看所有公钥 gpg –list-key 7.2 gpg 查看所有私钥 gpg –list-secret-key 7.3 gpg删除密钥 gpg –delete-secret-keys 01BA7978 先删除私钥 gpg –delete-keys 73391FB6 再删除公钥 也可以使用一条命令全部删除,如下: gpg –delete-secret-and-public-keys BFA7FF09 7.4 gpg导出公钥 gpg -a -o duanzhanling.asc –export BFA7FF09 7.5 gpg导出私钥 gpg -a -o duanzhanling-sec.asc –export-secret-key 0B7F4055 7.6 gpg导入密钥 导入私钥和公钥都用下面的命令gpg –import gpg –import duanzhanling.asc 导入公钥 gpg –import duanzhanling-sec.asc 导入私钥
一、生成VM模板 要生成vm模板,我们首先要安装好一台虚拟机,在此我安装好了一台centos6.6的机器。如下: 要把一台vm做成模板,需要在vm关机状态下进行操作。如下: 选择虚拟机—“模板”—“转换成模板”。 通过以上两张图的对比,我们可以发现vm在做成vm模板前后的图标是不一样的。这样我们的vm模板就已经生成了。 注意:虚拟机和vm模板之间的转换是非常简单的,两者可以互相转换。 二、vcenter内部部署VM 现在有了vm的模板,如果我们想在此vcenter上快速部署vm的话,我们就可以直接使用此vm模板进行部署了。如下: 注意:以下除非很重要的步骤,否则不会加文字说明的。 注意:如果想自定义vm的话,我们可以在此步骤进行相关的配置。 到此一台新的vm就已经部署成功了,当然该新vm其他的相关参数,还需要我们进行调整。在此我们就不进行介绍了。 三、跨vcenter部署 有时候我们为了测试一台新的vm,需要把该vm导入到其它的vcenter中。这就属于跨vcenter部署vm。 要跨vcenter部署vm,需要我们进行以下操作。 3.1 导出VM模板 首先我们要把vm作为一个模板导出,选中要导出的vm模板。当然导出的不一定是vm模板,也可以是一台vm。 在此我们使用的vm模板,如下: “文件”—“导出”—“导出OVF模板”: 注意:上图中有关导出文件格式需要我们注意下,我们可以选择单个文件ova格式和文件夹ovf格式。 其中单个文件ova格式其实是ovf格式的一个压缩文件,我们可以通过tar命令或者7zip解压ova格式文件得到ovf格式文件。 因为ova文件携带比较方便(就一个文件),所以在此我们选择导出的是ova格式文件。 到此vm的模板我们已经导出来了。 3.2 解压VM模板文件 为什么要解压vm模板呢?是因为如果不修改vm模板的话,我们在导入vm模板是会提示找不到未能部署OVF包:找不到文件之类的错误信息。如下: 要修改vm模板,我们就要解压vm模板文件vm-mould.ova。ova文件解压后,我们可以得到三个文件xxx.vmdk, xxx.ovf, xxx.mf。 ova文件的解压,我们可以通过7zip、tar两种方法。下面分别介绍下。 3.2.1 tar解压 要使用tar命令进行解压,我们可以把ova文件上传到Linux上,然后在进行解压。如下: tar –xf test-modle.ova 通过上图,我们可以看到解压后得到xxx.ovf、xxx.vmdk、xxx.mf三个文件。 其中ovf文件表示vm的相关配置,比如内存大小、硬盘大小、网络连接方式等等。此文件类似kvm虚拟化中的xml配置文件。 vmdk文件是vm的硬盘文件。 mf文件主要作用是为验证vm的相关配置是否被恶意篡改。 当然,如果不想上传到Linux系统上进行解压,我们也可以下载tar命令的windows版本。下载连接如下: http://gnuwin32.sourceforge.net/packages/gtar.htm 下载安装完毕后,ar命令还是不能直接使用的,需要我们手工把tar命令加入到系统的环境变量中。如下: 加入系统变量后,我们再执行解压命令。如下: tar –xf test-modle.ova 3.2.2 7zip解压 要使用7zip解压,我们必须是在windows平台下的。安装7zip软件,然后进行解压。如下: 通过上图,我们可以看到ova文件解压后,确实得到三个文件test-modle.ovf、test-modle-disk1.vmdk、test-modle.mf。 3.3 修改VM模板文件 修改vm模板文件,其实只需要我们修改ovf文件即可。 在Linux系统下,修改方式如下: vim test-modle.ovf +96 我们只需要把ovf文件的96行的vmware.cdrom.iso修改为vmware.cdrom.remotepassthrough。 在windows系统下,修改方式如下: 修改之前。 修改之后。 3.4 验证VM模板文件的sha1值 vm文件修改完毕后,我们还要验证模板文件的sha1值,否则我们在导入vm模板时也是会报错的。 上述我们修改了ovf文件,那么我们只需要验证该文件就行。如果我们还修改了vmdk文件,那么我们也需要验证该文件。 验证完毕后,把得到的sha1值,写到mf文件中即可。注意:mf文件中原来是有ovf和vdk文件的sha1值得。 根据验证平台的不同,我们分别介绍Linux和Windows下的验证方式。 3.4.1 Linux下验证 Linux下的验证比较方便直接使用sha1sum命令进行,然后把验证的ovf文件sha1值写到mf文件中即可。如下: sha1sum test-modle.ovf cat test-modle.mf 3.4.2 Windows下验证 windows平台下的验证,我们可以使用微软提供的用于计算文件的MD5和SHA1散列值的工具fciv。文件校验和完整性验证程序fciv是一个命令提示符工具计算并验证文件的加密哈希值。fciv可计算 SHA1或MD5加密哈希值。这些值可以是屏幕上显示或保存为以后使用和验证XML文件数据库。 fciv常用示例如下: fciv d:\mydir\myfile.exe(计算D盘mydir文件夹下myfile.exe的md5值) fciv d:\mydir\myfile.exe -sha1(计算D盘mydir文件夹下myfile.exe的sha1值) 下载fciv运行后,解压缩,会提示你放在那个文件夹下。解压的文件夹只包含两个文件fciv.exe、readme.txt。 现在我们开始使用fciv命令验证ovf的sha1值,如下: fciv test-modle.ovf -sha1 验证后把得到的sha1值写到mf文件中,如下: 3.5 生成ova文件 vm模板文件验证完毕后,我们现在要把ovf、vmdk、mf文件打包成ova文件。 要打包成ova文件,我们目前需要使用tar命令进行打包。如下: tar -cf test-modle.ova test-modle.ovf test-modle-disk1.vmdk test-modle.mf 注意:上述tar打包命令文件的顺序一定要按照上述格式进行,否则在导入该vm模板时,vcenter会报错。 ovf压缩包对文件顺序的要求是:ovf文件必须是第一个,然后是虚拟机镜像文件(如vmdk),接着是mf文件,再接下来是其他的可选文件(如证书等)。 有关ovf文件的打包,可以参考这个连接: http://mingjin.thoughtworkers.org/?cat=24 3.6 导入VM模板 vm模版文件修改完毕后,我们选择把该模板导入到新的vcenter中。如下: 到此vm的模板已经被导入进去了。 四、有关一个esxi被多个vc连接 有时候在使用vcenter时,会碰到这样的问题一个esxi会被其他的vcenter使用。此时我们使用的vcenter会显示该esxi节点处于离线状态。如下: 如果要重新连接该esxi的话,进行操作如下: 未经允许不得转载:烂泥行天下 » 烂泥:vcenter通过模板部署vm
一、实际问题 在使用vsftpd过程中,我们会经常发现vsftpd在默认情况下一个用户(无论是系统用户还是虚拟用户)只能拥有一个目录,一般是根目录。 如果此时再要向该用户添加其它目录的话,比如系统的其他目录也需要此用户访问,那么就无法直接添加了。 vsftpd不像FileZilla_Server等类似的ftp服务器软件一样可以直接给用户添加多目录,如下: 所以我们只能借助其他方式实现这个功能,在此我们使用的是mount –bind命令。 注意:mount –bind命令存在linux内核2.4版本以后的linux系统中。 二、解决方法 要想把vsftpd一个用户添加多个目录的话,我们可以通过mount –bind命令来达到要求。 mount –bind命令其实就是一个挂载命令,它的主要作用是将一个目录中的内容挂载到另一个目录上。 有关mount –bind命令的使用,我们可以通过查看mount的帮助文档获得。如下: man mount 根据权限的不同,我们把vsftpd的这个要求分为可读写和只读这两种情况,下面分别介绍下。 PS:以下实验环境均是基于《烂泥:ubuntu下vsftpd虚拟用户配置》这篇文章的环境进行。 当然这个vsftpd单用户多目录的功能在ubuntu和centos均是可以使用的。 vsftpd的虚拟用户为ailanni,其对应的系统用户为wangxy。 2.1 可读写挂载 现在要求新建一个目录/write,ailanni用户要对/write目录具有可读写权限。 首先创建/write目录,并修改所属的用户及用户组为wangxy系统用户。如下: sudo mkdir /write sudo chown wangxy:wangxy -R /write/ 因为虚拟用户ailanni登录到vsftpd要看到write这个目录,所以需要我们在ailanni用户的根目录下也创建一个write目录并修改所属的用户及用户组为wangxy系统用户。 sudo mkdir /www/write sudo chown wangxy:wangxy -R /www/write/ 以上相关的目录创建完毕后,现在我们来通过mount –bind命令进行挂载。如下: sudo mount –bind /write/ /www/write/ mount 上述命令中sudo mount –bind /write/ /www/write/命令的意思是把/write/目录挂载到/www/write/目录下。 通过上图,我们可以很明显的看到/write/已经挂载到了/www/write/下,并且是可读写挂载的。 以上命令在服务器重启后是不会自动执行的,如果要使上述命令自动进行挂载,我们可以把上述命令放在/etc/fstab或者/etc/rc.local文件中。 放在/etc/fstab文件中,形式如下: sudo vi /etc/fstab /write/ /www/write/ none bind 0 0 放在/etc/rc.local文件中,形式如下: sudo vi /etc/rc.local mount –bind /write/ /www/write/ 2.2 只读挂载 现在要求新建一个目录/readonly, ailanni用户要对/readonly目录具有只读权限。 首先创建readonly目录,并修改所属的用户及用户组为wangxy系统用户。如下: sudo mkdir /readonly sudo chown wangxy:wangxy -R /readonly/ 因为虚拟用户ailanni登录到vsftpd要看到readonly这个目录,所以需要我们在ailanni用户的根目录下也创建一个readonly目录并修改所属的用户及用户组为wangxy系统用户。 sudo mkdir /www/readonly sudo chown wangxy:wangxy -R /www/readonly/ 以上相关的目录创建完毕后,现在我们来通过mount –bind命令进行挂载。如下: sudo mount –bind /readonly/ /www/readonly/ sudo mount -o remount,ro /www/readonly/ mount 上述命令中sudo mount –bind /readonly/ /www/readonly/命令的意思是把/readonly/目录挂载到/www/readonly/目录下。 sudo mount -o remount,ro /www/readonly/命令的意思是挂载/www/readonly/为只读权限。 通过上图,我们可以很明显的看到/readonly/已经挂载到了/www/readonly/下,并且是只读挂载的。 注意:mount –bind命令的只读挂载与读写挂载是不同的。 以上命令在服务器重启后是不会自动执行的,如果要使上述命令自动进行挂载,我们可以把上述命令放在/ etc/rc.local文件中,而只读挂载命令不能放在/etc/fstab文件中。 经过多次测试只读挂载放在/etc/fstab文件中vsftpd用户还具有写入权限,所以只能放在/etc/rc.local文件中。 放在/etc/rc.local文件中,形式如下: sudo vi /etc/rc.local mount –bind /readonly/ /www/readonly/ mount -o remount,ro /www/readonly/ 以上全部挂载完毕后,我们现在开始测试相关权限。 三、测试 现在开始测试vsftpd对各个目录的权限,下面开始对读写和只读权限分别进行测试。 3.1 测试读写权限 使用FlashFXP连接vsftpd服务器,如下: 随便上传一个文件到write目录,如下: 通过上图,我们可以很明显的看出。我们现在上传了一个ks.cfg文件到write目录下了。 现在我们在登陆vsftpd服务器切换到/write目录下,看看刚刚上传的文件ks.cfg是否在此目录下。如下: 通过上图,我们可以很明显的看出刚刚上传的文件ks.cfg已经在/write目录下了,说明写入权限是没有问题的。 3.2 测试只读权限 现在来测试只读权限,现在我们还是上传刚刚那个文件ks.cfg到readonly目录下。如下: 通过上图,我们可以很明显的看出刚刚上传的文件ks.cfg无法上传到readonly目录,FlashFXP提示553错误,说明只读权限是没有问题的。 到此有关vsftpd单用户多目录的配置到此结束。
一、业务要求 现在要求创建一个FTP账号ailanni,该账号只能登录到/www目录下,不能切换到上级目录。同时处于安全考虑还要求该账号上传的文件权限为644,即上传的文件具有可读可写权限,但是没有可执行权限。 除此之外还要求该用户不能是系统用户,即使用vsftpd的虚拟用户。 要求看起来比较简单,下面我们开始进行配置。 PS:以下实验全部在ubuntu server 14.04 X64上进行。有关centos的操作可以参考这篇文章《烂泥:Vsftpd使用虚拟用户,访问FTP》。 二、vsftpd安装 在配置vsftpd之前,我们先安装vsftpd,vsftpd的安装比较简单。我们再次直接使用apt-get进行安装,如下: sudo apt-get -y install vsftpd vsftpd的安装很简单,我们现在来查看下vsftpd都安装了那些文件。如下: dpkg -L vsftpd |tac 通过上图,我们可以看出vsftpd在安装时,生成了很多文件,其中/etc/init/vsftpd.conf、/etc/vsftpd.conf比较重要。 /etc/init/vsftpd.conf是vsftpd的初始化文件,而/etc/vsftpd.conf是vsftpd的配置文件。 现在我们来查看下/etc/init/vsftpd.conf文件。如下: cat /etc/init/vsftpd.conf 通过上图,我们可以很明显的看出vsftpd初始化时使用的配置文件就是/etc/vsftpd.conf文件。 为什么在此我要指出这一点呢?是因为我原以为ubuntu下vsftpd和centos下的一样,可以把vsftpd的配置文件存放到/etc/vsftpd/目录下。这一点是和centos不同的。 除此之外,还有一点不同,就是vsftpd的启动、停止、重启脚本。 在ubuntu下要启动、停止、重启vsftpd,我们必须使用以下命令: sudo service vsftpd stop sudo service vsftpd start sudo service vsftpd restart 而在centos下,我们可以使用以下命令: service vsftpd stop /etc/init.d/vsftpd stop 最后,我们再来查看下vsftpd的服务脚本。如下: cat /lib/systemd/system/vsftpd.service 三、vsftpd配置 vsftpd安装完毕后,我们现在开始配置vsftpd,不过在正式配置之前,我们还有几步工作要做。 3.1 用户相关配置 因为是使用vsftpd的虚拟用户,所以我们需要先在系统中创建一个用户,并且该用户对/www目录具有可读可写可执行权限。 创建用户,如下: sudo useradd -m -s /bin/bash ftpilanni cat /etc/passwd |grep ftpilanni 注意:创建的用户ftpilanni现在是无法登录到系统的,因为没有给该用户设置密码。在此,我们也无需ftpilanni登录到系统,这样相对来说比较安全。 用户创建完毕后,我们来创建对应的目录并修改其所属用户,如下: sudo mkdir /www sudo chown -R ftpilanni:ftpilanni /www/ 有关用户相关配置结束后,我们开始设置登录vsftp的用户与密码文件login.txt。如下: sudo mkdir /etc/vsftpd/ sudo vim /etc/vsftpd/login.txt ailanni ailannipassword login.txt为登录vsftpd的用户与密码文件。 login.txt设置完毕后,我们要使用db_load进行加密。而db_load需要db-util这个软件。所以需要我们现在安装db-util,如下: sudo apt-get -y install db-util db-util安装完毕后,现在开始使用db_load对loginx.txt进行加密。如下: sudo db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db loginx.txt加密完成后,我们现在开始配置vsftpd的PAM验证。 3.2 PAM验证配置 vsftpd的PAM验证,在此我没有使用vsftpd安装时所生成的/etc/pam.d/vsftpd文件。 因为经过我多次的测试,发现如果使用该文件进行验证的话,无法验证通过。不知道为什么,猜想很有可能是vsftpd的一个BUG。 创建验证文件,如下: sudo vim /etc/pam.d/vsftpd.virtual auth required pam_userdb.so db=/etc/vsftpd/login account required pam_userdb.so db=/etc/vsftpd/login vsftpd.virtual文件的内容,也可以根据OS的版本进行调整。我现在使用的是ubuntu x64,所以也可以填写为: auth required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/login account required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/login 其中/etc/vsftpd/login对应/etc/vsftpd/login.db文件 3.3 vsftp权限配置 现在正式配置vsftpd,vsftpd的几乎所有配置项都在/etc/vsftpd.conf文件中进行。 根据业务要求vsftpd.conf配置内容如下: grep -vE “^#|^$” /etc/vsftpd.conf listen=YES listen_ipv6=NO anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES use_localtime=YES xferlog_enable=YES connect_from_port_20=YES xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES chroot_local_user=YES chroot_list_enable=NO allow_writeable_chroot=YES secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key ssl_enable=NO guest_enable=YES pam_service_name=vsftpd.virtual user_config_dir=/etc/vsftpd/vu pasv_enable=YES pasv_min_port=30000 pasv_max_port=31000 在以上配置文件中,有几点需要重点指出。 local_enable=YES write_enable=YES local_umask=022 这两项是启用系统用户的写权限。特别是write_enable=YES项一定要启用,否则vsftpd虚拟用户将无法登录vsftpd。 为什么会是这样?因为虚拟用户依赖与系统用户。 chroot_local_user=YES chroot_list_enable=NO allow_writeable_chroot=YES 这三项是配置vsftpd用户禁止切换上级目录的权限。 guest_enable=YES pam_service_name=vsftpd.virtual user_config_dir=/etc/vsftpd/vu 这三项是启用vsftpd虚拟用以及虚拟用户账号配置目录。 pasv_enable=YES pasv_min_port=30000 pasv_max_port=31000 这三项是启用vsftpd被动模式及相关端口。 3.4 虚拟用户相关配置 vsftpd配置文件修改文件后,现在开始配置虚拟用户的相关权限。如下: sudo mkdir /etc/vsftpd/vu sudo vim /etc/vsftpd/vu/ailanni guest_username=ftpilanni local_root=/www/ virtual_use_local_privs=YES anon_umask=133 以上配置参数,其中guest_username=ftpilanni表示的是设置FTP对应的系统用户为ftpilanni local_root=/www/表示使用本地用户登录到ftp时的默认目录。 virtual_use_local_privs=YES虚拟用户和本地用户有相同的权限。 anon_umask表示文件上传的默认掩码。计算方式是777减去anon_umask就是上传文件的权限。在此我们设置的是133,也就是说上传后文件的权限是644。即上传的文件对所属用户来说只有读写权限,没有执行权限。 以上全部配置完毕后,我们来重启vsftpd,如下: sudo service vsftpd restart 四、测试 现在我们来使用ailanni用户登录vsftpd进行测试。 通过以上两张图,我们可以很明显的看到vsftpd的配置已经达到了业务的要求。 五、IPtables配置 在实际生产环境中,为了安全起见,我们一般是开启防火墙的。 在ubuntu上,我们也可以使用IPtables来进行防护。 IPtables配置如下: sudo iptables-save >/home/ilanni/iptables.rule sudo iptables-restore < /home/ilanni/iptables.rule sudo iptables -nL sudo vim /etc/network/interfaces pre-up iptables-restore < /home/ilanni/iptables.rule post-down iptables-save < /home/ilanni/iptables.rule
通过前一篇文章的介绍,我们知道了haproxy的配置文件主要包含以下几个部分: global全局配置、defaults默认配置、监控页面配置、frontend配置、backend配置 下面对每一部分分别进行讲解。 PS:本文部分内容借鉴马哥haproxy视频。 一、global全局配置 全局配置的标志参数为global,全局配置主要用于设定义全局参数,属于进程级的配置,通常和操作系统配置有关。 1.1 进程管理及安全相关的参数 chroot <jail dir>:修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限。 使用方法为: chroot /var/lib/haproxy daemon:让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能。当然,也可以在命令行中以“-db”选项将其禁用。 uid:以指定的uid身份运行haproxy进程。 user:同uid参数,但使用的是用户名。 gid <number>:以指定的gid运行haproxy,建议使用专用于运行haproxy的gid,以免因权限问题带来风险。 group <group name>:同gid参数,不过指定的组名。 log <address> <facility> [max level [min level]]:定义全局的syslog服务器,最多可以定义两个。 log-send-hostname [<string>]:在syslog信息的首部添加当前主机名,可以为“string”指定的名称,也可以缺省使用当前主机名。 nbproc <number>:指定启动的haproxy进程个数,只能用于守护进程模式的haproxy。默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式。 pidfile:将haproxy的进程写入pid文件。 ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项。 stats socket <path>定义统计信息保存位置。 1.2 性能调整相关的参数 maxconn <number>:设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的。 maxpipes <number>:haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每进程所允许使用的最大pipe个数。每个pipe会打开两个文件描述符,因此,“ulimit -n”自动计算时会根据需要调大此值;默认为maxconn/4,其通常会显得过大。 noepoll:在Linux系统上禁用epoll机制。 nokqueue:在BSE系统上禁用kqueue机制。 nopoll:禁用poll机制。 nosepoll:在Linux禁用启发式epoll机制。 nosplice:禁止在Linux套接字上使用内核tcp重组,这会导致更多的recv/send系统调用;不过,在Linux 2.6.25-28系列的内核上,tcp重组功能有bug存在。 spread-checks <0..50, in percent>:在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长。 tune.bufsize <number>:设定buffer的大小,同样的内存条件下,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以让某些应用程序使用较大的cookie信息;默认为16384,其可以在编译时修改,不过强烈建议使用默认值。 tune.chksize <number>:设定检查缓冲区的大小,单位为字节;更大的值有助于在较大的页面中完成基于字符串或模式的文本查找,但也会占用更多的系统资源;不建议修改。 tune.maxaccept <number>:设定haproxy进程内核调度运行时一次性可以接受的连接的个数,较大的值可以带来较大的吞吐率,默认在单进程模式下为100,多进程模式下为8,设定为-1可以禁止此限制;一般不建议修改。 tune.maxpollevents <number>:设定一次系统调用可以处理的事件最大数,默认值取决于OS。其值小于200时可节约带宽,但会略微增大网络延迟,而大于200时会降低延迟,但会稍稍增加网络带宽的占用量。 tune.maxrewrite <number>:设定为首部重写或追加而预留的缓冲空间,建议使用1024左右的大小。在需要使用更大的空间时,haproxy会自动增加其值。 tune.rcvbuf.client <number>:定义在客户端内核套接字接收缓冲区的大小,单位为字节,建议不要调整此值。 tune.rcvbuf.server <number>:设定内核套接字中服务端或客户端接收缓冲的大小,单位为字节;强烈推荐使用默认值。 tune.sndbuf.client:定义在客户端内核套接字发送缓冲区的大小,单位为字节,建议不要调整此值。 tune.sndbuf.server:定义在服务端内核套接字发送缓冲区的大小,单位为字节,建议不要调整此值。 上边的这些指令大多也是作为了解即可,在实际中并不常会调整这些参数。 1.3 debug相关的参数 debug:在调度haproxy时可以启用此参数,但在生产环境不应该启用。 quiet:haproxy启动后不会显示任何相关信息,这与在命令行启动haproxy时加上参数“-q”相同。 一个比较实用的haproxy全局配置,如下: global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 uid 1005 gid 1005 daemon chroot /var/lib/haproxy pidfile /var/run/haproxy.pid 以上设置的参数可以被利用配置到frontend、backend、listen段。 二、defaults默认配置 defaults段用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个defaults所重新设定。 下面提供一个defaults模版配置,如下: defaults mode http 设置haproxy的运行模式,有三种{http|tcp|health}。注意:如果haproxy中还要使用4层的应用(mode tcp)的话,不建议在此定义haproxy的运行模式。 log global 设置日志继承全局配置段的设置。 option httplog 表示开始打开记录http请求的日志功能。 option dontlognull 如果产生了一个空连接,那这个空连接的日志将不会记录。 option http-server-close 打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录。 option forwardfor except 127.0.0.0/8 如果上游服务器上的应用程序想记录客户端的真实IP地址,haproxy会把客户端的IP信息发送给上游服务器,在HTTP请求中添加”X-Forwarded-For”字段,但当是haproxy自身的健康检测机制去访问上游服务器时是不应该把这样的访问日志记录到日志中的,所以用except来排除127.0.0.0,即haproxy身。 option redispatch 当与上游服务器的会话失败(服务器故障或其他原因)时,把会话重新分发到其他健康的服务器上,当原来故障的服务器恢复时,会话又被定向到已恢复的服务器上。还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数。 retries 3 向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用。 option abortonclose 当haproxy负载很高时,自动结束掉当前队列处理比较久的链接。 timeout http-request 10s 客户端发送http请求的超时时间。 timeout queue 1m 当上游服务器在高负载响应haproxy时,会把haproxy发送来的请求放进一个队列中,timeout queue定义放入这个队列的超时时间。 timeout connect 5s haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间。 timeout client 1m 定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间。 timeout server 1m 定义haproxy与上游服务器非活动连接的超时时间。 timeout http-keep-alive 10s 设置新的http请求连接建立的最大超时时间,时间较短时可以尽快释放出资源,节约资源。 timeout check 10s 健康检测的时间的最大超时时间。 maxconn 3000 最大并发连接数。 contimeout 5000 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容。 clitimeout 3000 设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容。 srvtimeout 3000 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容。 三、监控页面配置 listen admin_status frontend和backend的组合体,监控组的名称,按需自定义名称。 bind 0.0.0.0:1080 配置监听端口。 mode http 配置监控运行的模式,在这为http模式。 log 127.0.0.1 local3 err 配置错误日志记录。 stats refresh 5s 配置每隔5秒自动刷新监控页面。 stats uri /stats 配置监控页面的url。 stats realm ilanni\ilanni 配置监控页面的提示信息。 stats auth admin:admin 配置监控页面的用户和密码admin,可以设置多个用户名。如下: stats auth admin1:admin1 配置监控页面的用户和密码admin1。 stats hide-version 配置隐藏统计页面上的HAproxy版本信息。 stats admin if TRUE 配置手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)。 四、frontend配置 frontend ilanni_80 定义一个名为ilanni_80的frontend。 bind 0.0.0.0:80 定义haproxy前端部分监听的端口。 mode http 定义为http模式。 log global 继承global中log的定义。 option forwardfor 使后端server获取到客户端的真实IP。 acl static_down nbsrv(static_server) lt 1 定义一个名叫static_down的acl,当backend static_sever中存活机器数小于1时会被匹配到。 #acl php_web url_reg /*.php acl php_web path_end .php 定义一个名叫php_web的acl,当请求的url末尾是以.php结尾的,将会被匹配到,上面两种写法任选其一。 #acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$ acl static_web path_end .gif .png .jpg .css .js .jpeg 定义一个名叫static_web的acl,当请求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif结尾的,将会被匹配到,上面两种写法任选其一。 acl is_ilanni hdr_beg(host) -i ilanni.test.com 定义一个名叫is_ilanni的acl,当请求的是以ilanni.test.com开头的主机的话,将会被匹配到。其中-i表示忽略大小写。 acl is_dg hdr_beg(host) dg.test.com 定义一个名叫is_dg的acl,当请求的是以dg.test.com开头的主机的话,将会被匹配到。 acl is_171 hdr_beg(host) 192.168.5.171 定义一个名叫is_171的acl,当请求的是以192.168.5.171开头的主机的话,将会被匹配到。 acl is_ip src 192.168.5.140 定义一个名叫is_ip的acl,当客户端的IP是192.168.5.140的话,将会被匹配到。 use_backend php_server if static_down 如果满足策略static_down时,就将请求交予backend php_server处理。 use_backend php_server if php_web 如果满足策略php_web时,就将请求交予backend php_server处理。 use_backend static_server if static_web 如果满足策略static_web时,就将请求交予backend static_server处理。 use_backend acl if is_171 is_ip 如果同时满足is_171和is_ip这两条策略时,就将请求交予backend acl处理。 use_backend mui_acl if is_171 is_ip is_port 如果同时满足is_171、is_ip和is_port这三条策略时,就将请求交予backend mui_acl处理。 use_backend dgserver if is_dg 如果满足策略is_dg时,就将请求交予backend dgserver处理。 use_backend ilanni if is_ilanni 如果满足策略is_ilanni时,就将请求交予backend ilanni处理。 use_backend 171server if is_171 如果满足策略is_171时,就将请求交予backend 171server处理。 default_backend backend_default 如果以上策略都不满足时,就将请求交予default_backend处理。 五、backend配置 backend dgserver 定义dgserver服务器组。 balance source 定义负载均衡方式,roundrobin平均方式 mode http option httpchk GET /index.html 心跳检测的文件 server web1 192.168.5.171:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 服务器定义,maxconn 1024 表示该服务器的最大连接数,check inter 2000是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重。 backend 171server balance roundrobin mode http server dg1 192.168.5.174:80 check server dg2 192.168.5.178:80 check backend ilanni mode http server web1 ilanni.com:80 weight 3 check inter 2000 rise 2 fall 3 backend acl balance source mode http server web1 www.ilanni.com:80 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 backend mui_acl balance source mode http server web1 192.168.5.178:80 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 backend backend_default mode http server web1 192.168.5.178:8080 weight 3 check inter 2000 rise 2 fall 3
1、关键词balance balance用于定义负载均衡的算法,可用于defaults、listen和backend中。 balance使用方法如下: balance <algorithm> [ <arguments> ] balance url_param <param> [check_post [<max_wait>]] <algorithm>用于在负载均衡场景中挑选一个server,其仅应用于持久信息不可用的条件下或需要将一个连接重新派发至另一个服务器时。 balance支持的算法有: roundrobin:基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整。不过在设计上,每个后端服务器仅能最多接受4128个连接。 source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器。这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性。 static-rr:基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制。 leastconn:新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重。 uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性。 url_param:通过<argument>为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性。 hdr(<name>):对于每个HTTP请求,通过<name>指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.ilanni.com来说,仅计算ilanni词符串的hash值)以降低hash算法的运算量;此算法默认为静态的,不过其也可以使用hash-type修改此特性; 2、关键词bind bind仅能用于frontend和listen区段,用于定义一个或几个监听的套接词。 bind使用方法如下: bind [<address>]:<port_range> [, …] bind [<address>]:<port_range> [, …] interface <interface> <address>:可选选项,其可以为主机名、IPv4地址、IPv6地址或*。省略此选项、将其指定为*或0.0.0.0时,将监听当前系统的所有IPv4地址。 <port_range>:可以是一个特定的TCP端口,也可是一个端口范围(如5005-5010),代理服务器将通过指定的端口来接收客户端请求。 需要注意的是,每组监听的套接词<address:port>在同一个实例上只能使用一次,而且小于1024的端口需要有特定权限的用户才能使用,这可能需要通过uid参数来定义。 <interface>:指定物理接口的名称,仅能在Linux系统上使用。其不能使用接口别名,而仅能使用物理接口名称,而且只有管理有权限指定绑定的物理接口。 3、关键词mode mode用于设定实例的运行模式或协议。当实现内容交换时,前端和后端必须工作于同一种模式(一般说来都是HTTP模式),否则将无法启动实例。 mode可被用与listen、defaults、frontend、backend区段。 mode使用方法如下: mode { tcp|http|health } tcp:实例运行于纯TCP模式(即4层),在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查;此为默认模式,通常用于SSL、SSH、SMTP等应用。 http:实例运行于HTTP模式(即7层),客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝。 health:实例工作于health模式,其对入站请求仅响应“OK”信息并关闭连接,且不会记录任何日志信息;此模式将用于响应外部组件的健康状态检查请求;目前此模式已经废弃,因为tcp或http模式中的monitor关键词可完成类似功能; 4、关键词hash-type hash-type定义用于将hash码映射至后端服务器的方法;其不能用于frontend区段;可用方法有map-based和consistent,在大多数场景下推荐使用默认的map-based方法。 hash-type使用方法如下: hash-type <method> map-based:hash表是一个包含了所有在线服务器的静态数组。其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,这意味着其不支持慢速启动。此外,挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加了一台新的服务器时,大多数连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。 consistent:hash表是一个由各服务器填充而成的树状结构;基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性。添加一个新的服务器时,仅会对一小部分请求产生影响,因此,尤其适用于后端服务器为cache的场景。不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此,可能需要不时的调整服务器的权重以获得更好的均衡性。 5、关键词log log为每个实例启用事件和流量日志,因此可用于所有区段。每个实例最多可以指定两个log参数,不过,如果使用了“log global”且”global”段已经定了两个log参数时,多余了log参数将被忽略。 log global log <address> <facility> [<level> [<minlevel>]] global:当前实例的日志系统参数同”global”段中的定义时,将使用此格式;每个实例仅能定义一次“log global”语句,且其没有任何额外参数。 <address>:定义日志发往的位置,其格式之一可以为<IPv4_address:PORT>,其中的port为UDP协议端口,默认为514;格式之二为Unix套接词文件路径,但需要留心chroot应用及用户的读写权限。 <facility>:可以为syslog系统的标准facility之一。 <level>:定义日志级别,即输出信息过滤器,默认为所有信息;指定级别时,所有等于或高于此级别的日志信息将会被发送。 6、关键词maxconn maxconn设定一个前端的最大并发连接数,因此,其不能用于backend区段。 maxconn使用方法如下: maxconn <conns> 对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,从而避免无法应答用户请求。当然,此最大值不能超出“global”段中的定义。此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓冲的大小为8KB,再加上其它的数据,每个连接将大约占用17KB的RAM空间。这意味着经过适当优化后,有着1GB的可用RAM空间时将能维护40000-50000并发连接。 如果为<conns>指定了一个过大值,极端场景下,其最终占据的空间可能会超出当前主机的可用内存,这可能会带来意想不到的结果;因此,将其设定了一个可接受值方为明智决定。其默认为2000。 7、关键词default_backend default_backend定义在没有匹配的use_backend规则时为实例指定使用的默认后端服务器,因此,其不可应用于backend区段。在frontend和backend之间进行内容交换时,通常使用use-backend定义其匹配规则;而没有被规则匹配到的请求将由此参数指定的后端服务器接收。 default_backend使用方法如下: default_backend <backend> <backend>:指定使用的后端的名称。 使用案例: use_backend dynamic if url_dyn use_backend static if url_css url_img default_backend dynamic 8、关键词server server为后端声明一个server,因此,不能用于defaults和frontend区段。 server使用方法如下: server <name> <address>[:port] [param*] <name>:为此服务器指定的内部名称,其将出现在日志及警告信息中;如果设定了http-send-server-name,它还将被添加至发往此服务器的请求首部中。 <address>:为此服务器的的IPv4地址,支持使用可解析的主机名,同时也支持域名,只不过在启动时需要解析主机名至相应的IPv4地址。 [:port]:指定将连接请求所发往的此服务器时的目标端口,其为可选项;未设定时,将使用客户端请求时的同一相端口。 [param*]:为此服务器设定的一系参数;其可用的参数非常多,具体请参考官方文档中的说明,下面仅说明几个常用的参数; 服务器或默认服务器参数: backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server。 check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,如: inter <delay>:设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟; rise <count>:设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数; fall <count>:确认server从正常状态转换为不可用状态需要检查的次数; cookie <value>:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能; maxconn <maxconn>:指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放; maxqueue <maxqueue>:设定请求队列的最大长度; observe <mode>:通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景; 一个标准的使用案例,如下: server web1 192.168.5.171:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3 以上就是[param*]中比较经常使用的参数。 redir <prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以免造成循环;例如: server srv1 192.168.5.174:80 redir http://imags.ilanni.com check weight <weight>:权重,默认为1,最大值为256,0表示不参与负载均衡。 检查方法: option httpchk option httpchk <uri> option httpchk <method> <uri> option httpchk <method> <uri> <version>:不能用于frontend段 例如: backend https_relay mode tcp option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www.ilanni.com server apache1 192.168.1.1:443 check port 80 9、关键词stats enable stats enable启用基于程序编译时默认设置的统计报告,stats enable不能用于frontend区段。只要没有另外的其它设定,它们就会使用如下的配置: stats uri : /stats stats realm : “HAProxy Statistics” stats auth : no authentication stats scope : no restriction 尽管stats enable一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期望的后果。下面是一个配置案例。 backend public_www server websrv1 192.168.5.171:80 stats enable stats hide-version stats scope stats uri /stats stats realm Haproxy\ Statistics stats auth admin:password stats auth admin:password 10、关键词stats hide-version stats hide-version隐藏统计报告中haproxy版本号,不能用于frontend区段。默认情况下,统计页面会显示一些有用信息,包括haproxy的版本号。 然而,向所有人公开haproxy的精确版本号是非常有风险的,因为它能帮助恶意用户快速定位版本的缺陷和漏洞。 11、关键词stats realm stats realm启用统计报告并高精认证领域,不能用于“frontend”区段。 stats realm <realm> haproxy在读取realm时会将其视作一个单词,因此,中间的任何空白词符都必须使用反斜线进行转义。此参数仅在与“stats auth”配置使用时有意义。 <realm>:实现HTTP基本认证时显示在浏览器中的领域名称,用于提示用户输入一个用户名和密码。 12、关键词stats scope stats scope启用统计报告并限定报告的区段,不能用于frontend区段。 当指定此语句时,统计报告将仅显示其列举出区段的报告信息,所有其它区段的信息将被隐藏。如果需要显示多个区段的统计报告,此语句可以定义多次。需要注意的是,区段名称检测仅仅是以词符串比较的方式进行,它不会真检测指定的区段是否真正存在。 stats scope { <name> | “.” } <name>:可以是一个listen、frontend或backend区段的名称,而“.”则表示stats scope语句所定义的当前区段。 13、关键词stats auth stats auth启用带认证的统计报告功能并授权一个用户帐号,其不能用于frontend区段。 stats auth <user>:<passwd> <user>:授权进行访问的用户名; <passwd>:此用户的访问密码,明文格式; 此语句将基于默认设定启用统计报告功能,并仅允许其定义的用户访问,其也可以定义多次以授权多个用户帐号。可以结合“stats realm”参数在提示用户认证时给出一个领域说明信息。在使用非法用户访问统计功能时,其将会响应一个“401 Forbidden”页面。其认证方式为HTTP Basic认证,密码传输会以明文方式进行,因此,配置文件中也使用明文方式存储以说明其非保密信息故此不能相同于其它关键性帐号的密码。 14、关键词stats admin stats admin在指定的条件满足时启用统计报告页面的管理级别功能,它允许通过web接口启用或禁用服务器,不过,基于安全的角度考虑,统计报告页面应该尽可能为只读的。此外,如果启用了HAProxy的多进程模式,启用此管理级别将有可能导致异常行为。 stats admin { if | unless } <cond> 目前来说,POST请求方法被限制于仅能使用缓冲区减去保留部分之外的空间,因此,服务器列表不能过长,否则,此请求将无法正常工作。因此,建议一次仅调整少数几个服务器。下面是两个案例,第一个限制了仅能在本机打开报告页面时启用管理级别功能,第二个定义了仅允许通过认证的用户使用管理级别功能。 backend stats_localhost stats enable stats admin if LOCALHOST backend stats_auth stats enable stats auth admin:password stats admin if TRUE 15、关键词option httplog option httplog启用记录HTTP请求、会话状态和计时器的功能。 option httplog [ clf ] clf:使用CLF格式来代替HAProxy默认的HTTP格式,通常在使用仅支持CLF格式的特定日志分析器时才需要使用此格式。 默认情况下,日志输入格式非常简陋,因为其仅包括源地址、目标地址和实例名称,而“option httplog”参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。 16、关键词option logasap option logasap 启用提前将HTTP请求记入日志,不能用于backend区段。 默认情况下,HTTP请求是在请求结束时进行记录以便能将其整体传输时长和词节数记入日志,由此,传较大的对象时,其记入日志的时长可能会略有延迟。option logasap参数能够在服务器发送complete首部时即时记录日志,只不过,此时将不记录整体传输时长和词节数。此情形下,捕获Content-Length响应首部来记录传输的词节数是一个较好选择。下面是一个例子。 listen http_proxy 0.0.0.0:80 mode http option httplog option logasap log 172.16.100.9 local2 17、关键词option forwardfor option forwardfor允许在发往服务器的请求首部中插入“X-Forwarded-For”首部。即启用获取客户端真实IP功能。 option forwardfor [ except <network> ] [ header <name> ] [ if-none ] <network>:可选参数,当指定时,源地址为匹配至此网络中的请求都禁用此功能。 <name>:可选参数,可使用一个自定义的首部,如“X-Client”来替代“X-Forwarded-For”。有些独特的web服务器的确需要用于一个独特的首部。 if-none:仅在此首部不存在时才将其添加至请求报文问道中。 haproxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为haproxy主机的地址而非真正客户端的地址,这会使得服务器端的日志信息记录不了真正的请求来源,“X-Forwarded-For”首部则可用于解决此问题。haproxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value。 需要注意的是,haproxy工作于隧道模式,其仅检查每一个连接的第一个请求,因此,仅第一个请求报文被附加此首部。如果想为每一个请求都附加此首部,请确保同时使用了“option httpclose”、“option forceclose”和“option http-server-close”几个option。 下面是一个例子。 frontend www mode http option forwardfor except 127.0.0.1 18、关键词errorfile errorfile在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码;可用于所有段中。 errorfile <code> <file> <code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504。 <file>:指定用于响应的页面文件。 例如: errorfile 400 /etc/haproxy/errorpages/400badreq.http errorfile 403 /etc/haproxy/errorpages/403forbid.http errorfile 503 /etc/haproxy/errorpages/503sorry.http 19、关键词errorloc和errorloc302 errorloc <code> <url> errorloc302 <code> <url> 请求错误时,返回一个HTTP重定向至某URL的信息;可用于所有配置段中。 <code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504; <url>:Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向; 需要留意的是,这两个关键词都会返回302状态吗,这将使得客户端使用同样的HTTP方法获取指定的URL,对于非GET法的场景(如POST)来说会产生问题,因为返回客户的URL是不允许使用GET以外的其它方法的。如果的确有这种问题,可以使用errorloc303来返回303状态码给客户端。 20、关键词errorloc303 errorloc303 <code> <url> 请求错误时,返回一个HTTP重定向至某URL的信息给客户端,可用于所有配置段中。 <code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有400、403、408、500、502、503和504; <url>:Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向; 例如: backend webserver server 172.16.100.6 172.16.100.6:80 check maxconn 3000 cookie srv01 server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie srv02 errorloc 403 /etc/haproxy/errorpages/sorry.htm errorloc 503 /etc/haproxy/errorpages/sorry.htm
以前在centos下安装软件都是喜欢源码安装,不过昨天因为一个事情需要一个centos 下的LNMP环境。反倒不会搞了,今天特意记录下,以备后续使用。 一、安装nginx 我们先来安装nginx,如下: yum -y install nginx 通过上图,我们可以看到目前的yum源中是没有nginx软件包的。我们需要安装包含nginx的yum源,如下: rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm 查看刚刚安装的rpm包,如下: rpm -ql nginx-release-centos-6-0.el6.ngx.noarch 通过上图,我们可以很明显的看出刚刚安装的rpm包,只是新添加了一个nginx的yum源。查看该yum源,如下: cat /etc/yum.repos.d/nginx.repo 或者直接修改yum仓库,添加以下内容: [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 现在我们再来通过yum来安装nginx,如下: yum -y install nginx 通过上图,我们可以很明显的看出nginx已经安装。 现在来查看nginx安装的位置及其文件,如下: rpm -ql nginx 通过上图,我们可以很明显的看出nginx默认安装到/etc/nginx目录,而nginx的默认网站安装到/usr/share/nginx/html目录下。 现在我们来启动nginx,并访问nginx。如下: /etc/init.d/nginx start curl http://192.168.1.124 查看nginx运行时使用的用户,如下: ps -ef |grep nginx 通过上图,我们可以很明显的看出nginx是root用户启动,但是nginx运行时使用的是nginx这个用户。 二、安装php及php-fpm 安装php及php-fpm,使用如下命令: yum -y install php php-fpm 查看php-fpm安装的位置及其文件,如下: rpm -ql php-fpm 启动php-fpm,使用如下命令: /etc/init.d/php-fpm start ps -ef |grep php-fpm netstat -tunlp |grep 1355 通过上图,我们可以看出php-fpm运行时使用apache这个用户,而且php-fpm监听的是本机的9000端口。 如果要修改php-fpm运行时的用户及端口的话,我们可以通过修改php-fpm配置文件/etc/php-fpm.d/www.conf,如下: cat /etc/php-fpm.d/www.conf |grep -v ‘^;’|grep -v ^$ 三、nginx与php集成 nginx与php集成是通过fastcgi来实现,而fastcgi我们一般使用的是php-fpm。在第二章,我们已经启动php-fpm,现在我们来修改nginx配置文件使其支持php。 现在我们修改nginx的默认网站配置文件default.conf,如下: cat /etc/nginx/conf.d/default.conf server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.php index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { root /usr/share/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } 以上配置完毕后,我们再重启nginx和php-fpm,如下: /etc/init.d/nginx restart /etc/init.d/php-fpm restart 以上是修改nginx的默认网站,现在我们新加一个nginx虚拟主机,并使其支持php,如下: vi /etc/nginx/conf.d/ilanni.conf server { listen 80; server_name test.ilanni.com; location / { root /ilanni; index index.php index.html index.htm; } location ~ \.php$ { root /ilanni; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } nginx虚拟主机配置文件完毕后,现在来创建虚拟主机ilanni的index.php,如下: mkdir /ilanni vi /ilanni/index.php <?php phpinfo(); ?> 修改ilanni目录的所属用户,如下: chown nginx:nginx -R /ilanni/ ll /ilanni/ 如上图所示,我们现在把ilanni这个目录修改为nginx运行时使用的用户nginx。 现在我们再来修改php-fpm运行时的用户,如下: vi /etc/php-fpm.d/www.conf 我们来重启nginx与php-fpm,如下: /etc/init.d/nginx restart /etc/init.d/php-fpm restart 通过上图,我们可以看到nginx的虚拟主机已经可以正确解析php。 四、安装mysql 安装MySQL,使用如下命令: yum -y install mysql mysql-server php-mysql 安装完毕后,启动mysql。如下: /etc/init.d/mysqld start 现在我们在nginx默认网站创建一个mysql.php文件,用来连接mysql数据库。mysql.php内容如下: cat /usr/share/nginx/html/mysql.php <?php $host=’localhost’; $root=’root’; $pwd=”; $con= mysql_connect($host,$root,$pwd); if ( $con == false ) { echo “connect false”; } else{ echo “connect true”; } ?> 重启nginx、php-fpm、mysql,如下: /etc/init.d/nginx restart /etc/init.d/php-fpm restart /etc/init.d/mysqld restart 现在通过访问该mysql.php文件,如下: http://192.168.1.124/mysql.php 通过上图,我们可以很明显的看出php已经解析mysql.php文件,并且也已经成功的连接mysql数据库。
以前在centos下安装软件都是喜欢源码安装,不过昨天因为一个事情需要一个centos 下的LNMP环境。反倒不会搞了,今天特意记录下,以备后续使用。 一、安装nginx 我们先来安装nginx,如下: yum -y install nginx 通过上图,我们可以看到目前的yum源中是没有nginx软件包的。我们需要安装包含nginx的yum源,如下: rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm 查看刚刚安装的rpm包,如下: rpm -ql nginx-release-centos-6-0.el6.ngx.noarch 通过上图,我们可以很明显的看出刚刚安装的rpm包,只是新添加了一个nginx的yum源。查看该yum源,如下: cat /etc/yum.repos.d/nginx.repo 或者直接修改yum仓库,添加以下内容: [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 现在我们再来通过yum来安装nginx,如下: yum -y install nginx 通过上图,我们可以很明显的看出nginx已经安装。 现在来查看nginx安装的位置及其文件,如下: rpm -ql nginx 通过上图,我们可以很明显的看出nginx默认安装到/etc/nginx目录,而nginx的默认网站安装到/usr/share/nginx/html目录下。 现在我们来启动nginx,并访问nginx。如下: /etc/init.d/nginx start curl http://192.168.1.124 查看nginx运行时使用的用户,如下: ps -ef |grep nginx 通过上图,我们可以很明显的看出nginx是root用户启动,但是nginx运行时使用的是nginx这个用户。 二、安装php及php-fpm 安装php及php-fpm,使用如下命令: yum -y install php php-fpm 查看php-fpm安装的位置及其文件,如下: rpm -ql php-fpm 启动php-fpm,使用如下命令: /etc/init.d/php-fpm start ps -ef |grep php-fpm netstat -tunlp |grep 1355 通过上图,我们可以看出php-fpm运行时使用apache这个用户,而且php-fpm监听的是本机的9000端口。 如果要修改php-fpm运行时的用户及端口的话,我们可以通过修改php-fpm配置文件/etc/php-fpm.d/www.conf,如下: cat /etc/php-fpm.d/www.conf |grep -v ‘^;’|grep -v ^$ 三、nginx与php集成 nginx与php集成是通过fastcgi来实现,而fastcgi我们一般使用的是php-fpm。在第二章,我们已经启动php-fpm,现在我们来修改nginx配置文件使其支持php。 现在我们修改nginx的默认网站配置文件default.conf,如下: cat /etc/nginx/conf.d/default.conf server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.php index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { root /usr/share/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } 以上配置完毕后,我们再重启nginx和php-fpm,如下: /etc/init.d/nginx restart /etc/init.d/php-fpm restart 以上是修改nginx的默认网站,现在我们新加一个nginx虚拟主机,并使其支持php,如下: vi /etc/nginx/conf.d/ilanni.conf server { listen 80; server_name test.ilanni.com; location / { root /ilanni; index index.php index.html index.htm; } location ~ \.php$ { root /ilanni; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } nginx虚拟主机配置文件完毕后,现在来创建虚拟主机ilanni的index.php,如下: mkdir /ilanni vi /ilanni/index.php <?php phpinfo(); ?> 修改ilanni目录的所属用户,如下: chown nginx:nginx -R /ilanni/ ll /ilanni/ 如上图所示,我们现在把ilanni这个目录修改为nginx运行时使用的用户nginx。 现在我们再来修改php-fpm运行时的用户,如下: vi /etc/php-fpm.d/www.conf 我们来重启nginx与php-fpm,如下: /etc/init.d/nginx restart /etc/init.d/php-fpm restart 通过上图,我们可以看到nginx的虚拟主机已经可以正确解析php。 四、安装mysql 安装MySQL,使用如下命令: yum -y install mysql mysql-server php-mysql 安装完毕后,启动mysql。如下: /etc/init.d/mysqld start 现在我们在nginx默认网站创建一个mysql.php文件,用来连接mysql数据库。mysql.php内容如下: cat /usr/share/nginx/html/mysql.php <?php $host=’localhost’; $root=’root’; $pwd=”; $con= mysql_connect($host,$root,$pwd); if ( $con == false ) { echo “connect false”; } else{ echo “connect true”; } ?> 重启nginx、php-fpm、mysql,如下: /etc/init.d/nginx restart /etc/init.d/php-fpm restart /etc/init.d/mysqld restart 现在通过访问该mysql.php文件,如下: http://192.168.1.124/mysql.php 通过上图,我们可以很明显的看出php已经解析mysql.php文件,并且也已经成功的连接mysql数据库。
现在公司使用的都是ubuntu系统,这几天由于个别项目需要,需要搭建一个LNMP环境。为了快速搭建这个环境,我使用是apt-get方式进行安装。具体的操作步骤,看下面的文章。 PS:按照在centos系统下nginx与php-fpm集成是行不通的,因为按照centos下配置的话,nginx访问的主页是空白的。 一、安装nginx 我们首先来安装nginx,使用如下命令: sudo apt-get -y install nginx nginx安装完毕后,我们来查看nginx都安装了什么文件。使用如下命令进行查看,如下: dpkg -S nginx 通过上图,我们可以看出nginx默认的安装位置是/etc/nginx目录,而且nginx的配置文件nginx.conf也是在该目录下。 除此之外,nginx的默认网站目录在/usr/share/nginx/html下,默认nginx网站配置文件为/etc/nginx/sites-available/目录下的default文件。 现在我们来启动nginx,可以使用如下命令: sudo /etc/init.d/nginx start sudo service nginx start 以上两条命令都可以启动nginx,我个人比较倾向于使用第一条命令,因为这个是直接通过nginx的启动脚本来启动的。 netstat -tunlp sudo lsof -i :80 通过网页进行访问看看实际效果,如下: 或者通过curl命令进行访问,如下: curl http://192.168.1.9 二、安装php与php-fpm nginx安装完毕后,我们现在来安装php与php-fpm,使用如下命令,如下: sudo apt-get -y install php5 php5-fpm php5-cli 查看php版本,如下: php5 -v 三、nginx与php-fpm集成 nginx与php安装完毕后,我们现在开始把nginx与php集成。其实nginx与php集成是通过fastcgi来实现,而fastcgi我们一般使用的是php-fpm。 php-fpm与nginx通信方式有两种,一种是TCP方式,一种是unix socket方式。 TCP方式就是使用TCP端口连接,一般是127.0.0.1:9000。 Socket是使用unix domain socket连接套接字/dev/shm/php-cgi.sock(很多教程使用路径/tmp,而路径/dev/shm是个tmpfs,速度比磁盘快得多),在服务器压力不大的情况下,tcp和socket差别不大,但是在压力比较满的时候,使用套接字方式,效果确实比较好。 3.1 TCP方式 先来修改nginx的默认网站文件default,如下: sudo vi /etc/nginx/sites-available/default location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; } 现在来修改nginx的fastcgi_params文件,添加如下命令。 注意:这个命令一定要添加,否则nginx与php集成后,网页会显示空白。 sudo vi /etc/nginx/fastcgi_params fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 修改nginx的默认主页,如下: sudo vi /usr/share/nginx/html/index.php <?php phpinfo(); ?> 现在我们再来修改php的配置文件php.ini,如下: sudo vi /etc/php5/fpm/php.ini +758 除此之外,我们还需要修改php-fpm的配置文件www.conf,如下: sudo vi /etc/php5/fpm/pool.d/www.conf listen = 127.0.0.1:9000 以上修改完毕后,我们现在来重启nginx与php-fpm,如下: sudo /etc/init.d/nginx restart sudo /etc/init.d/php5-fpm restart 现在我们来访问nginx,如下: http://192.168.1.9/index.php 现在来查看系统的端口,如下: netstat -tunlp 以上就是php-fpm与nginx的TCP通信方式。 3.2 socket方式 修改nginx的默认网站文件default,如下: sudo vi /etc/nginx/sites-available/default location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } 现在再来修改php-fpm的配置文件www.conf,如下: sudo vi /etc/php5/fpm/pool.d/www.conf listen = /var/run/php5-fpm.sock 其他的修改和TCP方式连接的是一样的,现在我们再来重启nginx与php-fpm。如下: sudo /etc/init.d/nginx restart sudo /etc/init.d/php5-fpm restart 现在我们再来看看,php-fpm是否占用系统端口。如下: 可以看到此时php-fpm并没有占用系统端口。 四、安装mysql 现在来开始安装mysql,如下: sudo apt-get –y install mysql-server mysql-client php5-mysql mysql安装完毕后,我们现在来使用php连接mysql。创建ilanni.php文件,内容如下: sudo vi /usr/share/nginx/html/ilanni.php <?php $host=’127.0.0.1′; $root=’root’; $pwd=’123456′; $con= mysql_connect($host,$root,$pwd); if ( $con == false ) { echo “connect false”; } else{ echo “connect true”; } ?> 现在来通过php来访问mysql,如下: 通过上图,我们可以看到php已经正常连接mysql数据库,这也说明mysql也已经安装成功。
一、问题描述 在我们使用ubuntu远程桌面时,会经常遇到这样的问题。在连接远程桌面时,我打开的是会话A,我在会话A下处理一些工作的事情。由于自己不小心把这个远程桌面给关闭了,或者今天工作完毕关闭该远程桌面会话。等再进行连接远程桌面时,发现ubuntu会给出一个新的远程桌面会话B,而不是我们刚刚连接过的那个会话A,或者是昨天连接的那个会话A。 以上这个问题,我们在实际的工作中是经常遇到的。 那么我们该如何解决这个问题呢?或者换一种说法,我们该如何再次连接到上一次的远程桌面会话A呢? 注意:本篇文章中的ubuntu远程桌面全部是基于XRDP协议。 二、ubuntu远程桌面的原理 要解决以上的问题,我们就要了解基于xrdp协议的ubuntu远程桌面与vncserver之间的关系。 其实有关ubuntu远程桌面的原理,我们在上一篇文章《烂泥:学习ubuntu远程桌面(一):配置远程桌面》中已经提到过一些,基于XRDP方式的远程桌面连接是需要vncserver的支持。 为什么需要vncserver的支持呢?是因为我们在通过3389端口连接ubuntu远程桌面时,xrdp会把所有通过3389端口数据都转发到vncserver的端口上,同时vncserver只监听127.0.0.1这个地址,所以vncserver的端口是不对外开放的。 除此之外,vncserver还为每一次远程桌面会话分配一个系统端口,注意这个端口很重要。 如果我们要连接上一次的远程桌面会话A的,我们只需要连接会话A所在vncserver端口即可。 那么我们如何才能连接和查看这个vncserver端口呢?这就需要我们修改xrdp的相关配置。 为什么要讲解这个原理?是因为只有我们理解了这个原理,那么我们才能很容易的解决ubuntu远程桌面会话的问题,而且也能很容易的理解,我们对xrdp配置文件的相关修改。 三、XRDP配置文件详解 XRDP配置文件有两个,分别是/etc/xrdp目录下的xrdp.ini和sesman.ini文件。 xrdp.ini配置文件,关键部分在globals,具体内容如下: [globals] bitmap_cache=yes 位图缓存 bitmap_compression=yes 位图压缩 port=3389 xrdp监听的端口(重要) crypt_level=low 加密程度(low为40位,high为128位,medium为双40位) channel_code=1 max_bpp=24 XRDP最大连接数 [xrdp1] name=sesman-Xvnc XRDP的连接模式 lib=libvnc.so username=ask password=ask ip=127.0.0.1 port=-1 注意:在xrdp.ini配置文件中,需要注意max_bpp参数,这参数定义XRDP最大的连接数。 要解决本文所提出的问题,我们只需要修改sesman-Xvnc模式中的port参数。修改后的prot参数,如下: cat /etc/xrdp/xrdp.ini sesman.ini配置文件,内容如下: [Globals] ListenAddress=127.0.0.1 监听ip地址(默认即可) ListenPort=3350 监听端口(默认即可) EnableUserWindowManager=1 1为开启,可让用户自定义自己的启动脚本 UserWindowManager=startwm.sh DefaultWindowManager=startwm.sh [Security] AllowRootLogin=1 允许root登陆 MaxLoginRetry=4 最大重试次数 TerminalServerUsers=tSUSErs 允许连接的用户组(如果不存在则默认全部用户允许连接) TerminalServerAdmins=tsadmins 允许连接的超级用户(如果不存在则默认全部用户允许连接) [Sessions] MaxSessions=10 每个用户最大会话数 KillDisconnected=0 是否立即关闭断开的连接(如果为1,则断开连接后会自动注销) IdleTimeLimit=0 空闲会话时间限制(0为没有限制) DisconnectedTimeLimit=0 断开连接的存活时间(0为没有限制) [Logging] LogFile=./sesman.log 登陆日志文件 LogLevel=DEBUG 登陆日志记录等级(级别分别为,core,error,warn,info,debug) EnableSyslog=0 是否开启日志 SyslogLevel=DEBUG 系统日志记录等级 四、连接远程桌面 现在我们来通过远程桌面来连接ubuntu,如下: 注意:图中标记出来的端口号 远程桌面连接进入后,打开终端创建一个文件test,如下: test创建完毕后,然后关闭这个远程桌面连接。 注意:为了下面的演示效果,创建该文件的界面,我没有关闭。 此时我们再通过ssh登录进入ubuntu,查看此时vncserver所使用的端口,如下: netstat –tunlp ps -ef |grep 1673 通过上图,我们可以知道目前这个会话,vncserver使用的是5912这个端口。 现在我们修改下xrdp的配置文件xrdp.ini,如下: sudo vi /etc/xrdp/xrdp.ini 以上修改完毕后,我们要重新启动xrdp,如下: sudo /etc/init.d/xrdp restart 重启完毕后,我们再次连接远程桌面,如下: 注意:上图中的port端口,我们填写的是5912这个端口,也就是上边那个远程桌面会话vncserver所使用的端口。 远程桌面进去后,如下: 通过上图,我们可以很明显的看出,我们确实连接到了上次本关闭的那个远程桌面界面。 PS:如果不知道每一次的连接的端口的话,我们也可以通过上查看用户的xrdp日志进行查看。具体步骤,如下: sudo cat /var/log/xrdp-sesman.log 通过xrdp日志查看用户启动xrdp的pid。 然后再根据pid,查看启动的xrdp进程,如下: ps -ef |grep 1693 通过上图,基本可以看出此xrdp进程所使用的是5912端口。 为了更清晰的确认端口号,使用netstat命令,如下: netstat -tunlp 通过上图,可以很明显的看出pid为1693的xrdp,使用的是5912 端口。 到此有关ubuntu远程桌面会话的问题全部结束。
公司服务器目前安装的都是ubuntu 14.04系统,而且由于业务需要,需要使用到ubuntu的远程桌面功能。所以本篇文章都是围绕ubuntu的远程桌面来介绍。 一、远程桌面连接方式 ubuntu的远程桌面连接要说简单也很简单,要说复杂也很复杂。ubuntu远程桌面连接的方式,目前主要有两种方式:基于VNC方式的和基于XRDP方式的。 基于VNC方式的远程桌面连接,不在本篇文章中进行介绍。本文主要介绍基于XRDP方式的远程桌面连接。 注意:基于XRDP方式的远程桌面连接还需要vncserver的支持,所以在进行软件安装时,还要安装vncserver软件包。 我们本次试验基于ubuntu14.04 64bit桌面版。因为现在公司使用的OS既有ubuntu desktop桌面版,又有ubuntu server服务器版,所以如果ubuntu desktop 桌面版与ubuntu server服务器版不同的地方,我会在文章中提出来。 二、ubuntu远程桌面配置 无论是在ubuntu desktop桌面版还是ubuntu server服务器版上配置远程桌面,都需要我们安装x windows桌面环境软件包、vncserver软件包以及xrdp软件包。 2.1 安装相关软件 x windows桌面环境软件比较多,在此我们选择的是轻量级的xfce4。 注意:建议在ubuntu desktop桌面版上不要使用lxde,这个x windows桌面环境软件。因为本人经过测试,lxde在桌面版上显示不正常。但是如果是在ubuntu server服务器版的话,可以安装xfce4或者lxde这两种x windows桌面环境软件的一个。 软件安装如下: sudo apt-get -y install xfce4 xrdp vnc4server 软件安装完毕后,我们来查看下相关软件包。如下: dpkg -L xrdp 在上图的xrdp安装文件中,我们需要注意xrdp.ini这个文件,有关这个文件的使用,我会在下一篇文章ubuntu远程桌面会话管理中进行讲解。 dpkg -L vnc4server 2.2 配置xfce4桌面会话文件 软件安装完毕后,我们还需要为每一个需要使用远程桌面登陆到系统的用户配置一个xfce4桌面会话文件。如果不配置该文件的话,用户登陆后只有黑白点为背景,无图标也无法操作。如下: 注意:是为每一个需要使用远程桌面的用户。 为什么会出现上述情况?这是因为xrdp、gnome和unity之间的兼容性问题导致的。 配置xfce4桌面会话文件,我们只需要把xfce4-session这行命令保存到该用户的家目录下。如下: echo xfce4-session>.xsession cat .xsession 注意:在此我们是以ilanni这个用户进行测试的。如果使用其他用户进行测试的话,一定要在该用户的家目录下,把上述xfce4桌面会话文件保存一份。 同时,还需要注意ubuntu server服务器版是不需要配置xfce4桌面会话文件的。因为ubuntu server服务器版不存在xrdp、gnome和unity之间的兼容性问题。 2.3 远程桌面连接 相关软件安装完毕并配置完毕后,我们就可以通过远程桌面软件来连接这台主机。 在此我们使用的是windows自带的远程桌面来连接,如下: 在下图中,输入登陆到系统的用户名和密码。 注意:上图中“Module”中选择sesman-Xvnc,username和password中填入相应的用户和密码即可。 注意:上图中connecting to 127.0.0.1 5912这行。这行的作用,我会在下一篇文章中进行讲解。 以上就是远程成功登陆到ubuntu系统中的界面。 三、远程桌面键盘补全 远程登陆进入ubuntu系统后,你会发现在终端中使用tab补全相关命令时,会不起作用。 这是因为xfce4桌面配置文件中有关键盘的操作被占用造成的。 要解决这个这个问题有两种方法,如下: 方法一:编辑.config/xfce4/xfconf/xfce-perchannel-xml目录下的xfce4-keyboard-shortcuts.xml文件,在里面内容里找到<property name=”&lt;Super&gt;Tab” type=”string” value=”switch_window_key”/>,把它用这句替换<property name=”&lt;Super&gt;Tab” type=”empty”/>。然后重新启动系统后即可解决问题。如下: 方法二:该方法不需要你去重新启动系统,在远程桌面中进行设置,路径是:打开菜单—设置—窗口管理器,如下: 或者在终端中输入xfwm4-settings打开也行(xfwm4就是xfce4 window manger的缩写),选择键盘,可以看到窗口快捷键中动作一列有“切换同一应用程序的窗口”选项,将该选项的快捷键清除后关闭窗口即可解决问题。如下: 经过以上设置后,我们再在终端中使用Tab键补全就可以使用了。所以以上两种方法,建议采用第二种。
最近一个月没有写过文章,主要是刚刚换的新工作。新公司服务器OS使用的是ubuntu server版,和以前熟悉的centos还是有很多不同的。 刚好这几天有时间,也是工作需要,学习了下有关ssh密钥的知识。 在平时的工作中,我们登陆服务器,一般是使用ssh密码的方式。其实还有一种方式,那就是通过ssh密钥登陆服务器。 这两种方法都是ssh的安全验证方式,,根据验证方式的不同我们把其分为:基于密码的安全验证和基于密钥的安全验证。 注意:在一些文章中提到的ssh证书,其实就是ssh密钥。 一、ssh两种安全验证介绍 通过以上介绍,我们知道了ssh有两种安全验证方式,下面我们一一介绍其工作原理。 1.1 基于密码的安全验证 这种方式,只需要知道远程服务器的帐号和密码,就可以登录到远程服务器。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是说这种方式的连接有可能会受到“中间人”这种方式的攻击。 1.2 基于密钥的安全验证 这种方式,需要依靠密钥,也就是说你必须为自己创建一对密钥对(公钥和私钥),并且把该公钥放到需要访问的服务器上。 注意:不能在需要访问的服务器上创建密钥,否则无法通过该密钥连接该服务器,但是通过该密钥连接其他服务器是正常的。 如果你要连接到ssh服务器,ssh客户端会向ssh服务器发出请求,请求用你的密钥进行安全验证。ssh服务器在收到该请求之后,会先在ssh服务器上,检查你登陆的用户的主目录下寻找对应的公钥,然后把它和你发送过来的公钥进行比较。如果两个公钥一致,ssh服务器就用公钥加密“质询”(challenge)并把它发送给ssh客户端。ssh客户端在收到“质询”之后就可以用你的私钥解密该“质询”,再把它发送给ssh服务器。 这种安全验证方式,你必须知道自己密钥的加密口令。当然,自己的密钥也可以不加密,而且这种不加密密钥的方式,在平时工作中使用的也比较多。 通过以上对比,我们可以很容易看出。与基于密码的安全验证相比,基于密钥的安全验证是不需要在网络上传输密码。除此之外,我们还可以看出,“中间人”这种攻击方式也是不可能的(因为他没有你的私钥)。 二、测试ssh无密码登陆 在第一章中我们介绍了,ssh的两种安全验证方式。要达到ssh无密码登陆服务器,我们就要使用ssh密钥验证这种方式。 PS:本次试验OS为Ubuntu 14.04.02 64bit,如下: uname –a cat /etc/issue 2.1创建ssh密钥 通过第一章我们知道了,要使用ssh密钥验证。我们必须要创建一个ssh密钥对。 ssh密钥的创建,我们可以有两种方式。第一就是在linux OS上通过ssh-kengen这个命令来创建,第二就是在windows下通过ssh客户端工具来创建。 下面我们对其创建密钥的方法一一进行介绍,如下。 2.1.1 通过ssh-kengen命令创建密钥 使用ssh-kengen命令创建ssh密钥很简单,直接使用该命令创建即可。如下: ssh-keygen 通过上图,我们可以很明显的看出刚刚新创建的密钥存放在/home/ilanni/.ssh目录下,而且私钥文件是id_rsa,公钥文件是id_rsa.pub。 除此之外,我们还需要注意ssh-kengen命令中: Enter passphrase (empty for no passphrase): Enter same passphrase again: 这两行是表示设置私钥的加密密码,我们在此是没有设置私钥的加密密码。 现在我们来查看密钥的文件属性,如下: ll .ssh/ 通过上图,我们可以很明显的看出: .ssh目录的用户权限是700,私钥id_rsa的权限是600,公钥id_rsa.pub的权限是644。 注意:有关私钥id_rsa和公钥id_rsa.pub文件权限非常重要,如果权限没有设置对的话,在使用ssh密钥登陆时,系统还是会提示需要输入密码。 ssh-keygen默认使用的密钥加密类型是rsa,这个我们可以通过查看公钥文件id_rsa.pub得知。如下: cat .ssh/id_rsa.pub 如果要使用其他类型的加密方式,我们可以通过ssh-keygen的-t参数来指定使用的加密类型。如下: ssh-keygen -t dsa cat .ssh/id_dsa.pub 有关ssh-kengen命令的详细使用方法,我们可以通过查看ssh-kengen的帮助命令获得。如下: ssh-keygen –help 注意:该密钥是在192.168.1.8机器上生成的,如下: hostname ifconfig 2.1.2 通过xshell创建密钥 windows下ssh客户端的连接工具比较多,但是我使用最多的还是xshell这个工具。 下面我们就通过xshell工具,来创建ssh的密钥。 打开xshell,点击“工具”–“新建用户密钥生成向导”,如下: 下面这个界面,我们可以选择密钥的类型和密钥的长度,如下: 生成密钥对,如下: 输入密钥名称以及密钥的加密密码,如下: 注意:这个密钥的加密密码就是ssh私钥的加密密码,我们可以为空。 为了下面试验区分通过ssh-kengen生成的密钥id_rsa,在此密钥的名称我们命名为id_rsa_1024。 生成公钥,如下: 公钥生成后,我们需要把该公钥保存到一个文件中。如下: 公钥保存完毕后,xshell就会跳转到私钥的界面。如下: 通过上图,我们可以看到目前私钥的名称就是我们前面命名的id_rsa_1024,而且密钥的长度是1024字节。 现在我们来导出该私钥,如下: 这样我们就得到了一对ssh密钥,如下: 2.2 上传ssh公钥 在2.1章节中,我们已经创建好了ssh的公钥与私钥,现在我们开始把公钥上传到需要被访问的服务器上,即ssh服务器上。 在把公钥上传到ssh服务器上,我们还有几件事要做: 1)、确定要登陆ssh服务器的用户 2)、修改ssh服务器的ssh配置文件sshd_config 3)、创建authorized_keys文件 4)、上传公钥并把内容重定向到authorized_keys文件 注意:本章节是在192.168.1.7机器上操作,如下: hostname ifconfig 2.2.1 确定要登陆ssh服务器的用户 因为我们是要免密码登陆ssh服务器,所以我们必须要确定使用哪一个用户登陆ssh服务器。 注意:该用户一定要在ssh服务器存在,并且是可以登陆ssh服务器的。 在此我们使用的是ilanni这个用户登陆ssh服务器的。如下: whoami cat /etc/passwd |grep ilanni 2.2.2 修改ssh配置 ssh存放用户登陆的公钥是通过sshd_config文件配置的,但是默认该选项是没有启用的。需要我们通过修改sshd_config文件来启用,如下: sudo vi /etc/ssh/sshd_config 我们只需要把#AuthorizedKeysFile %h/.ssh/authorized_keys行前的#去掉即可。如下: AuthorizedKeysFile存放该用户可以用来登录的RSA/DSA公钥。该指令中%h表示用户的主目录,最后公钥会存放到主目录的.ssh/authorized_keys文件中。 注意:这个步骤不是必须的,因为通过ssh-copy-id命令进行配置时,就无需修改ssh配置文件。 2.2.3 创建authorized_keys文件 在上一章节中,我们知道了用户的公钥是存放在authorized_keys文件中的,现在我们来创建该文件。 先创建.ssh目录并修改其用户属性,如下: mkdir .ssh chmod 700 .ssh .ssh目录创建完毕后,我们现在来创建authorized_keys文件。如下: touch authorized_keys 2.2.4 把公钥内容重定向到authorized_keys文件 在2.1章节中,我们介绍了ssh密钥的生成方法。一是通过ssh-kengen命令生成,二是通过xshell生成。 我们现在把这两个公钥都上传到192.168.1.7机器上,然后重定向到authorized_keys文件中。如下: 把192.168.1.8公钥复制到192.168.1.7机器上,如下: scp .ssh/id_rsa.pub ilanni@192.168.1.7:/home/ilanni 把xshell生成的公钥上传到192.168.1.7上,如下: 现在把两个公钥都重定向到authorized_keys文件,如下: cat id_rsa.pub >.ssh/authorized_keys cat id_rsa_1024.pub>>.ssh/authorized_keys cat .ssh/authorized_keys 2.3 连接ssh服务器 公钥上传完毕后,我们来连接ssh服务器,也就是连接192.168.1.7机器。 连接192.168.1.7,我们也可以分为linux和windows,下面对其连接方法一一讲解。 2.3.1 在linux上连接ssh服务器 我们先在linux机器192.168.1.8上连接192.168.1.7,如下: ssh ilanni@192.168.1.7 ifconfig eth0|grep “inet addr”|awk ‘{print $2}’|cut -d: -f2 通过上图,我们可以很明显的看出在192.168.1.8上连接192.168.1.7时,系统没有提示我们输入密码。 这也就实现了,我们免密码登陆ssh服务器的功能。 2.3.2 在windows上连接ssh服务器 我们现在切换到windows系统上,来连接192.168.1.7。 ssh客户端工具,我们使用的还是xshell,还是在生成密钥的那台windows机器上。如下: ssh ilanni@192.168.1.7 注意:用户身份验证方法,在此我们需要选择的是Public Key也就是密钥验证方式,并且用户密钥就是我们前面生成时的密钥时的私钥id_rsa_1024。 通过上图,我们可以很明显的看到在windows客户端连接192.168.1.7,系统也没有要求我们输入密码,这也就实现了ssh的无密码登陆。 2.4 使用ssh-copy-id上传ssh公钥 看了第2.2章节有关上传ssh公钥,你是不是觉得很麻烦。其实ssh还给我们提供了另外一个命令ssh-copy-id,ssh-copy-id命令可以把上述的步骤一次性执行完毕。 注意:ssh-copy-id命令只存在于linux系统中,目前没有发现windows系统的ssh客户端工具有该命令。 ssh-copy-id命令使用方法,如下: ifconfig eth0|grep “inet addr”|awk ‘{print $2}’|cut -d: -f2 ssh-copy-id -i .ssh/id_rsa.pub ilanni@192.168.1.9 cat .ssh/id_rsa.pub 登陆192.168.1.9,查看公钥。如下: ifconfig eth0|grep “inet addr”|awk ‘{print $2}’|cut -d: -f2 ll –full-time .ssh/ cat .ssh/authorized_keys 通过以上两张截图,我们很明显的看出,使用ssh-copy-id命令可以直接在ssh服务器对应用户的家目录下创建.ssh目录,并且在该目录下创建authorized_keys文件。同时也会把公钥id_rsa.pub文件中的内容,复制到authorized_keys文件中。 查看ssh配置文件是否修改。如下: cat /etc/ssh/sshd_config |grep authorized_keys 通过上图,我们可以很明显的看出ssh-copy-id没有修改ssh配置。 现在我们来连接192.168.1.9测试下,如下: ifconfig eth0|grep “inet addr”|awk ‘{print $2}’|cut -d: -f2 ssh ilanni@192.168.1.9 通过上图,我们可以很明显的看到即使不修改ssh的配置文件,只要有authorized_keys文件,也能实现ssh的无密码登陆。 有关ssh-copy-id详细的使用方法,可以查看其帮助命令。如下: ssh-copy-id -h 以上就是有关ssh无密码登陆的全部内容。
在前两篇文章中,我们介绍了有关nagios的安装与配置,文章为《烂泥:学习Nagios(一):Nagios安装》、《烂泥:学习Nagios(二):Nagios配置》,这篇我们来介绍下NRPE的相关知识。 有关NRPE的介绍,我们主要分以下几个步骤: 1、 什么是NRPE 2、 NRPE的工作过程 3、 安装及配置NRPE 4、 通过NRPE监控主机 5、 给NRPE传递参数 6、 NRPE监控注意事项 一、什么是NRPE NRPE是Nagios Remote Plugin Executor的简称,它是nagios的一个扩展工具,用在被监控主机上。通过它可以向nagios监控服务器提供该主机的一些本地信息。例如:cpu负载、内存使用情况、磁盘容量、登陆用户数、总进程数、僵尸进程数、swap分区使用情况等等。 注意:NRPE方式的监控,只能监控主机本地的信息,并不能监控数据库。 NRPE可以称为nagios的for linux客户端。而为什么要使用这个客户端呢? 有以下两个原因: 1、nagios只能监控自己所在的服务器,而对其他主机的监控则无能为力。毕竟没得到被监控主机的适当权限是不可能得到这些信息的。为了解决这个问题,我们就可以通过NRPE来完成对远程主机本地信息的监控。 2、在nagios的监控插件中,有一个名为check_ssh的插件,它也可以实现对远程主机本地信息的监控。但是,相对NRPE而言,check_ssh占用的系统资源就略多一点。监控少量的服务时可能还不会察觉,但是如果监控对象比较多的话,那么两者的差距就非常明显了。 同时还有一点要说明, 由于NRPE的监控过程并不需要远程主机上的系统账号信息以及不登录到系统中等操作,所以其安全性也就高于check_ssh的监控方式。 二、NRPE的工作过程 在上一章中,我们介绍了什么是NRPE,这一章我们来介绍下NRPE的工作过程。 NRPE总共由两部分组成:check_nrpe插件和NRPE daemon。 其中check_nrpe插件,存在于nagios监控服务器和被监控主机上。而NRPE daemon只运行在被监控主机上。 当nagios需要监控某个远程主机的服务或资源时,NRPE工作过程如下: 1、nagios监控服务器会运行本地check_nrpe插件,告诉它要检查哪些服务或资源。 2、nagios监控服务器上的check_nrpe插件会连接到远程主机上的NRPE daemon。 3、远程主机上的NRPE daemon会运行本地的各种nagios插件去监测本地的服务或资源。 4、NRPE daemon将检查的结果返回给nagios服务器上的check_nrpe插件,然后该插件再把结果送到nagios状态队列中。 5、nagios依次读取队列中的信息,最后把结果显示出来。 以上就是整个NRPE的工作过程,相关示意图如下: 三、安装及配置NRPE 在第二章中,我们介绍了NRPE的工作过程,通过介绍我们知道。要使nagios通过NRPE方式监控远程主机,我们需要在nagios服务器和被监控主机上都要安装NRPE,同时我们还需要在被监控的主机上安装nagios插件。 注意:被监控主机一定要安装nagios插件,否则NRPE daemon不能做任何监控。因为NRPE daemon监控的数据都是要通过nagios插件获得。 3.1 被监控主机安装NRPE 要在被监控的主机上安装NRPE,我们首先要在被监控主机上安装nagios插件,至于为什么要安装nagios插件,到下面我们讲解NRPE的配置文件时会进行介绍。下载nagios插件,如下: wget http://nagios-plugins.org/download/nagios-plugins-2.0.3.tar.gz 3.1.1 创建NRPE用户 在所需要的软件包都下载完毕后,我们现在来创建NRPE daemon运行时所需要的用户。NRPE daemon运行默认使用nagios用户,所以我们先来创建该用户。如下: useradd -M -s /sbin/nologin nagios grep nagios /etc/passwd 3.1.2 安装nagios插件 现在我们开始安装nagios插件,nagios插件的安装很简单,按照平时安装软件的方法即可。如下: tar -xf nagios-plugins-2.0.3.tar.gz cd nagios-plugins-2.0.3 配置nagios插件,如下: ./configure 编译与安装nagios插件,如下: make && make install 查看nagios插件安装后的目录,如下: ll /usr/local/nagios/ 查看所安装的插件,如下: ll /usr/local/nagios/libexec/ 通过上图,可以很明显的看出nagios插件中已经包含check_nrpe插件。 3.1.3 安装NRPE nagios插件安装完毕后,我们现在来下载NRPE的软件包,如下: http://exchange.nagios.org/directory/Addons/Monitoring-Agents/NRPE–2D-Nagios-Remote-Plugin-Executor/details http://sourceforge.net/projects/nagios/files/nrpe-2.x/ wget http://sourceforge.net/projects/nagios/files/nrpe-2.x/nrpe-2.15/nrpe-2.15.tar.gz NRPE软件包下载完毕后,我们现在开始安装NRPE,如下: tar -xf nrpe-2.15.tar.gz cd nrpe-2.15 配置NRPE,如下: ./configure –enable-command-args 注意:–enable-command-args参数很重要,如果要给NRPE传递参数的话,在安装配置NRPE时一定要加上该参数。 编译NRPE,如下: make all 安装NRPE插件check_nrpe,如下: make install-plugin 通过上图,我们可以很明显的看到check_nrep已经安装到/usr/local/nagios/libexec/目录下。 安装NRPE命令,如下: make install-daemon 安装NRPE配置文件,如下: make install-daemon-config 有关NRPE的具体安装步骤,在NRPE软件包的doc目录下也是有安装文档的。如下: 3.2 在nagios服务器上安装NRPE 在nagios服务器上安装NRPE和在被监控主机上安装差不多,只是步骤没有在被监控主机上安装多而已。 下载nrpe插件,如下: wget http://sourceforge.net/projects/nagios/files/nrpe-2.x/nrpe-2.15/nrpe-2.15.tar.gz 解压NRPE软件包,如下: tar -xf nrpe-2.15.tar.gz cd nrpe-2.15 配置NRPE,如下: ./configure 编译NRPE,如下: make all 安装NRPE插件check_nrpe,如下: make install-plugin 查看check_nrpe插件,如下: ll /usr/local/nagios/libexec/ |grep check_nrpe 注意:如果不想在nagios服务器上安装NRPE插件的话,我们也可以从已经安装好NRPE插件的被监控主机上,把/usr/local/nagios/libexec目录下的check_nrpe文件复制一份到nagios服务器的/usr/local/nagios/libexec目录下,然后修改其用户属性为nagios用户,同时赋予其执行权限即可。 以后自己写的监控脚本,可以通过这种方式上传到nagios的插件目录。 NRPE安装完毕后,我们来测试下check_nrpe插件。如下: /usr/local/nagios/libexec/check_nrpe -H 192.168.1.248 通过上图,我们可以很明显的看出, nagios服务器上的check_nrpe已经被正常安装,同时被监控主机192.168.1.248上的NRPE也已经正常工作,并且NRPE的版本号为2.15。这个和我们通过check_nrpe插件得到版本号是一致的。 3.3 NRPE帮助命令 NRPE命令的使用方式,我们可以通过查看其帮助得到。如下: /usr/local/nagios/bin/nrpe –h 通过查看NRPE的帮助命令,我们知道NRPE运行的方法,如下: nrpe -c NRPE配置文件路径 运行模式 注意:NRPE命令只存在被监控主机上。 NRPE相关参数说明,如下: -n表示不使用SSL方式传输数据,默认使用SSL方式传输数据。 <config_file>指定NRPE配置文件路径,这个配置文件就是nrpe.cfg文件。 <mode>指定NRPE的运行方式,NRPE一共有2种运行方式: -i以超级守护进程inetd或xinetd方式运行NRPE,要通过这种方式运行的话还要安装和配置xinetd,一般不用。 -d独立守护进程方式运行NRPE,一般常用这种运行方式。 3.4 NRPE配置文件 在启动NRPE之前,我们来看看NRPE的配置文件nrpe.cfg。该文件默认在/usr/local/nagios/etc/目录下。如下: ll /usr/local/nagios/etc/ 现在我们来编辑该文件,如下: egrep -v “^#|^$” /usr/local/nagios/etc/nrpe.cfg pid_file=/var/run/nrpe.pid 定义NRPE的PID文件。 server_port=5666定义NRPE daemon使用的端口。 nrpe_user=nagios nrpe_group=nagios 定义NRPE运行时,所使用的用户及用户组,默认为nagios用户及nagios用户组。 allowed_hosts=127.0.0.1 定义允许连接到该主机的nagios服务器。如果是多个服务器的话,可以使用逗号隔开。如果是允许一个网段的话,格式如下:192.168.1.0/24。 command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10 定义NRPE执行check_users命令时,所要运行的扩展插件命令。 注意:根据以上格式,我们可以看出NRPE在执行相关命令时,是要先执行本地的nagios插件,然后把执行的结果反馈给NRPE。 这个也就是为什么我们要在NRPE上安装nagios插件的原因。 在此NRPE给出一些列子,用于监控本地主机。如下: command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10 command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20 command[check_hda1]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/hda1 command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z command[check_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200 以上就是NRPE默认扩展插件命令,这是非常至关重要的地方。当被监控主机运行NRPE守护进程时,同时就运行这些在NRPE配置文件中定义的NRPE扩展插件命令。 并且通过上述例子,我们可以很明显的看出这些扩展命令都已经指定了好了命令名、插件路径以及选项参数。格式如下: command[NRPE命令名]=插件路径/插件 选项1 参数1 选项2 参数2 … 注意:如果要指定该被监控主机需要被监控的服务的话,就必须在这里都配置好NRPE命令并运行在NRPE守护进程里。如果这里没有配置的NRPE命令的话,那么nagios服务器是无法监控到的。 当然以上命令格式,nrpe.cfg配置文件也给出了使用格式,如下: command[<command_name>]=<command_line> 3.5 启动并查看NRPE端口 NRPE安装完毕后,我们切换到被监控主机上来启动NRPE,如下: /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d ps aux|grep nrpe 查看NRPE的端口,如下: netstat -tunlp |grep nrpe 通过上图,我们很明显的看到NRPE使用的是TCP的5666端口。 四、通过NRPE监控主机 NRPE在被监控主机和nagios服务器安装完毕后,我们就可以通过NRPE监控主机了。 但是在正式开始监控之前,我们还需要做几点工作。 注意:以下所有的操作都是nagios服务器上完成。 4.1 定义check_nrpe命令 要使用NRPE监控主机,我们需要把check_nrpe命令在commands.cfg文件中进行定义。如下: vi /usr/local/nagios/etc/objects/commands.cfg define command{ command_name check_nrpe command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ } 注意: command_name check_nrpe表示定义一个名叫check_nrpe的命令,以后我们要使用的话就可以通过use直接引用该命令。 command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ 表示要执行的命令,其中-c后面只能接被监控主机nrpe.cfg中定义的命令名称,$ARG1$就是表示被监控主机nrpe.cfg中定义的命令。例如: 4.2 自定义引用的host和service 在check_nrpe命令定义完毕后,我们还需再来定义一个host和service模版在templates.cfg文件中,用于在以后的主机和服务的引用。 当然,这个定义我们也可以不在templates.cfg中进行,可以再单独定义一个cfg文件,但是这个单独的cfg文件需要在nagios.cfg文件中引用才能正常使用。 除此之外,如果我们不想自定义host的话,也可以直接使用templates.cfg文件中已经定义好的host。 注意:在nagios中已经定义好的host、service等其他对象,都是可以通过use命令被直接引用的。 在此我们定义一个host和service,先来定义一个名称为ilannihost 的host,如下: vi /usr/local/nagios/etc/objects/templates.cfg define host{ name ilannihost use generic-host check_period 24×7 check_interval 5 retry_interval 1 max_check_attempts 10 check_command check-host-alive notification_period workhours notification_interval 120 notification_options d,u,r contact_groups admins register 0 } 其中: name ilannihost表示该定义host的名称为ilannihost。 use generic-host表示引用generic-host这个定义的host。而generic-host这个host的定义也是在templates.cfg文件中进行定义的。如下: host定义完毕后,我们再来定义service。定义一个名称为ilanniservice的service,如下: vi /usr/local/nagios/etc/objects/templates.cfg define service{ name ilanniservice use generic-service max_check_attempts 4 normal_check_interval 5 retry_check_interval 1 register 0 } 其中: name ilanniservice表示该定义service的名称为ilanniservice。 use generic-service表示引用generic-service这个定义的service。而generic-service这个servic的定义也是在templates.cfg文件中进行定义的。如下: 4.3 配置需要监控的主机 以上有关check_nrpe、host及service定义完毕后,我们现在开始配置需要监控的主机。 为了能更好的和实际生产环境接近,在此我们不是先一个一个的添加需要监控的主机,然后在nagios.cfg文件中引用的,而是通过修改nagios.cfg文件把所所有的主机cfg文件存放到同一个目录下,来达到引用的目的。如下: mkdir /usr/local/nagios/etc/ilanni vi /usr/local/nagios/etc/nagios.cfg cfg_dir=/usr/local/nagios/etc/ilanni 现在我们来添加一台需要监控的主机,在/usr/local/nagios/etc/ilanni目录下新建一个cfg文件,并填写相关内容。如下: vi /usr/local/nagios/etc/ilanni/248.cfg define host{ use ilannihost host_name ilanni alias test_NRPE address 192.168.1.248 check_command check-host-alive } define service{ use ilanniservice host_name ilanni service_description nrpe_load check_command check_nrpe!check_load } 注意: host_name要在整个nagios中是唯一的,不能有和其相同的host_name,否则nagios会报错。 check_command check_nrpe!check_load 其中的check_nrpe就是我们在commands.cfg文件中定义的check_nrpe命令,!check_load对应该命令中的$ARG1$参数。 所以该配置文件在nagios服务器上先执行的命令是:/usr/local/nagios/libexec/check_nrpe -H 192.168.1.248 -c check_load。 该命令执行完毕后,nagios服务器上的check_nrpe插件就会调用被监控主机上的NRPE daemon。 被监控主机上的NRPE daemon会调用本机的check_load命令,而check_load命令会调用本机的nagios插件check_load,所以在被监控主机上最后的执行命令是:/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20。该命令执行完毕后,再把结果反馈到nagios服务器上。 主机配置文件修改好后,我们现在来通过nagios命令检查下该配置文件是否有问题,如下: /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg 如果感觉这种方法检查配置文件比较麻烦的话,我们也可以通过执行nagios的启动脚本,来达到目的。如下: /etc/init.d/nagios configtest 通过上图,我们很明显的看到nagios的所以配置文件都是没有问题的。 4.4 查看监控的主机 nagios的配置文件没有问题,我们现在来启动nagios,查看我们刚刚新加的主机。如下: /etc/init.d/nagios start nagios正常启动后,我们现在登录到web界面查看下刚刚新增加的主机,如下: 通过上面两张图片,我们可以很明显的看到刚刚新增加的主机ilanni已经被正常监控。 五、给NRPE传递参数 通过上面的实验,我们已经成功的通过NRPE命令监控主机。但是还有一点不足的情况,就是我们对监控对象的阀值修改很不容易。现在的情况是,每一次修改阀值都要到被监控主机上修改,很不方便。 其实,我们完全可以通过传递参数的形式来达到修改不同监控主机的阀值。 但是要实现以上要求,我们需要在被监控主机和nagios服务器上进行配置。 5.1 被监控主机配置 第一、在安装配置NRPE时,必须要加上参数–enable-command-args,这个我们在前面安装配置NRPE时已经加上。如下: 注意:如果在安装配置NRPE时,没有加上–enable-command-args参数,那么需要把已经安装好的NRPE删除掉重新安装。这一点非常重要。 第二、修改nrpe.cfg文件中参数dont_blame_nrpe=1。如下: 以上两处修改完毕后,我们现在来开始进行配置一个测监控对象。 修改nrpe.cfg文件,去掉check_disk前的注释,并把其命名为check_disk_nrpe,如下: vi /usr/local/nagios/etc/nrpe.cfg +234 其中+234表示显示第234行。 command[check_disk_nrpe]=/usr/local/nagios/libexec/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$ 注意:该check_disk_nrpe命令中$ARG1$、$ARG2$、$ARG3$参数。等会我们在nagios服务器上传递的参数,就是这个进行一一对应。 注意:修改nrpe.cfg文件后,一定要重新启动NREP daemon。如下: pkill nrpe /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d netstat -tunlp |grep nrpe 5.2 nagios服务器配置 在被监控主机上修改完毕后,我们现在切换nagios服务器上进行配置。 在command.cfg文件中定义一个名为check_disk_ilanni命令,如下: define command{ command_name check_disk_ilanni command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$ $ARG3$ $ARG4$ } 注意: command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$ $ARG3$ $ARG4$ 命令中$ARG1$参数接收的是被监控主机nrpe.cfg文件中定义的监控命令,在此我们是以check_disk_nrpe命令为例的。 -a表示接收额外的参数,其中$ARG2$参数对应被监控主机check_disk_nrpe命令中的$ARG1$参数,$ARG3$参数对应被监控主机check_disk_nrpe命令中的$ARG2$参数,$ARG4$参数对应被监控主机check_disk_nrpe命令中的$ARG3$参数。 为了更能形象的说明问题,特意画了一张图: 以上定义完毕后,我们现在修改248.cfg文件为192.168.1.248主机定义此服务。内容如下: define service{ use local-service,srv-pnp host_name ilanni service_description DISK check_command check_disk_ilanni!check_disk_nrpe!10%!5%!/tmp } check_command check_disk_ilanni!check_disk_nrpe!10%!5%!/tmp 表示监控192.168.1.248主机的/tmp分区,当该分区剩余10%时,就发出报警,当该分区剩余5%时,就发出紧急告警。 248.cfg文件配置完毕后,我们再来重新加载nagios程序,如下: /etc/init.d/nagios reload 现在登录到nagios上看看,实际的监控情况。如下: 通过上图,我们可以很明显的看出,我们通过248.cfg的文件传递的参数已经成功的传递到被监控主机192.168.1.248上,并且也获得了正确的数据。 六、NRPE监控注意事项 1、通过NRPE方式监控,如果要修改nagios监控的相关阀值,必须在被监控主机的nrpe.cfg文件中扩展命令中修改。 2、通过NRPE方式监控,如果要新增nagios监控的对象时,必须要先在被监控主机的nrpe.cfg文件中定义。 3、NRPE daemon是在被监控主机上运行的。
nagios安装完毕后,我们现在就来配置nagios。有关nagios的安装,可以参考《烂泥:学习Nagios(一):Nagios安装》这篇文章。 说明:为了和nagios版本的保持一直,我们在此使用的是nagios最新版nagios-4.1.0rc1。 注意:最新版的nagios可在web页面查看其运行的PID。 一、nagois监控对象 nagios监控的对象比较多,我们可以从颗粒度的不同进行划分,分为笼统对象和详细对象。 1.1笼统对象 nagios监控的笼统对象可以分为两种类型:网络服务和主机资源。 网络服务包括主机(含网络设备)存活状态、web服务、ftp服务、数据库服务、自定义服务等。 主机资源包括系统负载、当前IP链接数、磁盘空间使用情况、当前进程数、自定义资源等。 1.2 详细对象 nagios监控的详细对象,有以下对象: 网站监控、主流数据库监控、协议监控、操作系统监控、应用监控、应用服务器监控、网络监控、动力环境监控、存储监控、邮件监控、安全监控、日志监控、虚拟化监控。 网站监控主要包括网站、网站应用、网站内容、HTTP、SSL等。 主流数据库监控主要包括MySql、Oracle、DB2、MSSQL等。 协议监控主要包括HTTP、DNS、FTP、SNMP、SMTP、SSH、LDAP、IMAP、POP、ICMP、DHCP等。 操作系统监控主要包括Linux、Windows、Unix、Solaris、AIX、HP-UX等。 应用监控主要包括服务、进程等。 应用服务器监控主要包括Tomcat、JBoss、Websphere、Weblogic、Java、JMX等。 网络监控主要包括路由器、交换机、防火墙等。 日志监控主要包括windows事件日志、Syslog等。 动力环境监控主要包括温湿度、烟雾传感器、浸水、干接点、UPS、APC等。 如果想要详细了解nagios监控的对象,我们可以去nagios官网进行查看。如下: http://www.nagios.com/solutions 二、nagios监控方法 前面我们说了nagios监控的对象,那么我们是通过哪些方法监控这些对象的呢,即通过哪些监控载体来实现监控的? nagios给我们提供了多种监控方法,比较常见的有NRPE、SNMP、脚本。 NRPE方式在windows、Linux上都有对应的客户端软件,而SNMP方式需要在windows、Linux上安装SNMP相关的组件。对于脚本方式的监控,我们可以使用shell、perl等脚本。 对于以上三种方式,建议根据实际的业务进行选择。比如:要监控网络设备的相关情况,我们一般是通过SNMP方式的。而对于OS来说,我们最常见的是通过NRPE和SNMP方式。 三、nagios通知方式 监控的主要目的是当监控的对象发生故障或资源紧张时及时通知相关人员,以便问题得到迅速的处理。 nagios为了方便我们的管理工作,给我们提供了至少3种通知方式。 web方式:通过浏览器观看被监控的对象,正常状态下,其状态(status)是以蓝色填充并显示一个OK。 邮件通知:当发生故障同时达到设定重试次数和探测间隔时间时,发送邮件给管理员或相关人员,报告问题的大致情况。 手机短信:这是非常有用和及时的功能了,一旦发生故障,手机短信可以及时提醒你。 一般情况下,这三者是同时进行的:上班时间开个浏览器看页面显示、定时收取邮件、手机24小时在线。 四、nagios文件目录 nagios以及其插件安装并配置完毕后,整个目录层次如下: ll /usr/local/nagios/ bin目录用来存放nagios的执行程序,包括nagios、nrpe等。 etc目录用来存放nagios的配置文件。 libexec目录用来存放nagios的监控插件。 sbin目录用来存放nagios cgi文件,也就是执行外部命令所需文件所在的目录。 share目录用来存放nagios网页文件,也就是存放web页面的目录。 include目录用来存放nagios cgi文件的外部调用。 var目录用来存放nagios日志文件、lock文件等文件。 五、nagios配置文件 nagios目录介绍完毕后,我们再来介绍nagios的配置文件。nagios配置文件默认都在/usr/local/nagios/etc目录下。 5.1 nagios配置文件简介 查看nagios的配置文件,如下: /usr/local/nagios tree -L 2 ./etc/ 通过上图,我们可以很明显的看到所有的配置文件。下面来介绍每个配置文件具体作用。如下: cgi.cfg用于控制CGI访问的配置文件。 htpasswd.users用于存放nagios管理员用户名和密码的文件。 nagios.cfg是nagios主配置文件,所有的cfg配置文件(外部调用除外)必须都在此文件中引用cfg配置文件才能生效。 resource.cfg变量定义文件,又称为资源文件。该文件中定义的变量,可以被其他配置文件引用,如$USER1$。 objects是一个目录,此目录下的文件主要用于定义nagios的监控对象。 commands.cfg是nagios监控命令的定义文件,其中定义的命令可以被其他配置文件引用。 contacts.cfg是定义nagios监控对象出现故障时,通知的联系人和联系人组的配置文件。 localhost.cfg是定义监控本地主机的配置文件。 templates.cfg是定义主机和服务的一个模板配置文件。 timeperiods.cfg是定义nagios监控时间段的配置文件。 services.cfg是存放具体被监控服务的相关配置内容。该配置文件默认是不存在的,需要自己手工建立,并且要建立在services目录下。同时还需要在nagios.cfg文件指定services目录。如下: egrep -v “^#|^$” nagios.cfg cfg_dir=/usr/local/nagios/etc/services hosts.cfg存放具体被监控的主机相关配置。该配置文件默认是不存在的,需要自己手工建立,并且要建立在hosts目录下。同时还需要在nagios.cfg文件指定hosts目录。与services.cfg使用方法相同。 5.2 nagios配置文件之间的关系 在nagios的配置过程中涉及到定义有:主机、主机组,服务、服务组,联系人、联系人组,监控时间,监控命令等。从这些定义可以看出,nagios各个配置文件之间是互为关联、彼此引用的。 要成功配置出一台nagios监控系统,必须要弄清楚各个配置文件之间依赖与被依赖的关系,最重要的有四点: 第一:定义监控哪些主机、主机组、服务和服务组。 第二:定义这个监控要用什么命令实现。 第三:定义监控的时间段。 第四:定义主机或服务出现问题时要通知的联系人和联系人组。 5.2 cgi.cfg文件介绍 cgi.cfg文件是用来控制nagios的相关cgi脚本。如果想在nagios的web监控界面执行相关的cgi脚本,例如重启nagios进程、关闭nagios通知、停止nagios主机检测等,这时就需要配置cgi.cfg文件。 在《烂泥:学习Nagios(一):Nagios安装》文章中,我们已经提到nagios默认管理员是nagiosadmin。 如果我们要添加一个新管理员admin的话,我们就需要修改cgi.cfg文件添加此用户的相关执行权限即可。如下: egrep -v “^#|^$” cgi.cfg cgi.cfg文件修改完毕,我们还需要把admin用户添加到htpasswd.users文件中使用htpasswd命令。如下: htpasswd htpasswd.users admin cat htpasswd.users 5.3 nagios.cfg文件介绍 nagios.cfg是nagios的主配置文件,默认的路径为/usr/local/nagios/etc/nagios.cfg。所有的对象配置文件都必须在这个文件中进行定义才能发挥其作用,这里只需将对象配置文件在nagios.cfg文件中引用即可。 nagios.cfg配置文件的内容比较多,我们在此只介绍比较重要的部分。 查看nagios.cfg文件内容,如下: egrep -v “^#|^$” nagios.cfg log_file=/usr/local/nagios/var/nagios.log 用于定义nagios在何处创建其日志文件。 说明: log_file变量用于定义nagios在何处创建其日志文件。如果你使用了nagios日志轮询功能,那么nagios将在每小时、每天、每周或每月对日志进行轮询。 cfg_file=/usr/local/nagios/etc/objects/commands.cfg 用于定义nagios监控命令的配置文件。 说明: cfg_file变量用来引用对象配置文件,如果有更多的对象配置文件,我们只需在nagios.cfg文件中依次添加即可。 对象配置文件中一般包含主机、主机组、联系人、联系人组、服务、命令等对象的定义。 如果要使nagios处理所有在特定目录中包含的对象配置文件,那么我们可以使用cfg_dir指令。如下所示: cfg_dir=/usr/local/nagios/etc/services 说明: cfg_dir变量用于引用一个目录里包含的所有对象配置文件。所有在这个目录下的且以.cfg为后缀名的文件将被作为对象配置文件来处理。 另外,nagios将会递归该目录下的子目录并处理其子目录下的全部配置文件。你也可以把配置放入不同的目录并且用cfg_dir=语句来指向每个待处理的目录。 cfg_file=/usr/local/nagios/etc/objects/contacts.cfg 用于引用nagios联系人的配置文件。 cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg 用于引用nagios监控时段的配置文件。 cfg_file=/usr/local/nagios/etc/objects/templates.cfg 用于引用nagios监控对象的模版文件。 cfg_file=/usr/local/nagios/etc/objects/localhost.cfg 用于引用nagios监控本地( Linux )主机的配置文件。 resource_file=/usr/local/nagios/etc/resource.cfg resource_file变量用于定义nagios资源配置文件,可以在nagios.cfg中定义多个资源文件。 status_file=/usr/local/nagios/var/status.dat status_file变量用于定义nagios的状态文件,此文件用于保存nagios当前的状态、宕机信息等。它会在每次nagios重新启动的时候被清空删除。 status_update_interval=10 该变量用于定义状态文件(即status.dat)的更新时间间隔,单位是秒,最小更新间隔是1秒,默认是10秒。 nagios_user=nagios 该变量指定nagios进程使用哪个用户运行。 nagios_group=nagios 该变量指定nagios使用哪个用户组运行。 check_external_commands=1 该变量用于设置是否允许nagios在web监控界面运行cgi命令,也就是是否允许nagios在web界面下执行重启nagios、停止主机、服务检查等操作。其中1表示允许,0表示不允许。 command_file=/usr/local/nagios/var/rw/nagios.cmd 定义nagios用来检查外部命令请求的文件。这个文件同样也是用户操作提交与CGI命令写入的地方,所以这个文件必须对于相关服务可写,一般是针对Apache的宿主用户可写。并且注意,这个文件所在的目录的权限必须被Apache可写,而不单指这文件,因为这个文件在工作当中是频繁被写入和删除的。 lock_file=/usr/local/nagios/var/nagios.lock 定义nagios运行时用来保存它的PID文件。 temp_file=/usr/local/nagios/var/nagios.tmp 定义nagios临时文件路径。它将在nagios运行时不停地被建立、使用和删除。 log_rotation_method=d 定义nagios的日志轮询方式,默认是每天轮询。 值为n表示none,不做轮询。值为h表示hourly,每小时轮询一次(每小时的开始)。值为d表示daily,每天轮询一次(每天的午夜)。值为w表示weekly,每周轮询一次(每周六的晚上)。值为m表示monthly,每月轮询一次(每上个月的最后一天的午夜)。 log_archive_path=/usr/local/nagios/var/archives 定义nagios日志的归档路径。 command_check_interval=10s 该变量用于定义nagios对外部命令检测的间隔,默认为10秒。如果这个数值不加上单位的话,默认单位为分钟。例如1就是表示1分钟,nagios每分钟检测一次。 service_check_timeout=60 定义服务检测的超时时间,默认为60秒。如果服务检查时间超过所定义的时间,则显示为CRITICAL状态。 host_check_timeout=30 定义主机检测的超时时间,默认为30秒。若主机检查时间超过所定义的时间,则显示为CRITICAL状态。 event_handler_timeout=30 定义事件处理最长时间,默认为30秒。若事件处理最长时间超出所定义的时间,则nagios会发出一条warning警告信息并记录到日志中。 notification_timeout=30 定义通知信息发送的时间间隔,默认为30秒。 interval_length=60 该变量用于定义nagios检测时间间隔的单位,默认值是60秒,即1分钟。也就是说在nagios中,检测时间间隔默认是以分钟为单位的。 这样定义以后其他地方需要用到时间单位长度的,默认都为分钟。在配置模版文件templates.cfg中定义主机和服务时,就是以该值为基础的。如下: egrep -v “^#|^$” templates.cfg check_interval 5 retry_interval 1 表示检查间隔为5*60s(5分钟),即每5分钟检查一次。重试检查时间间隔为1分钟,最多重试检查10次。 注意:nagios在OK状态时,用check_interval定义的时间间隔来监控,出现问题后,切换为retry_interval和max_check_attempts进行监控,当重试次数达到max_check_attempts值后触发首次报警,同时恢复为check_interval进行监控,并用notification_interval定义的时间间隔来发送报警。故障恢复正常后,在最近的check_interval点发送OK通知,完成报警周期。 对于一些敏感度要求高的服务,这明显不能满足我们的要求,因此可以将其调小,如调整为10秒: interval_length=10s 这样就提高了检查的灵敏度,但有些服务又不需要如此高的灵敏度,如磁盘空间(不会一下就增加很多),则可以在定义check_interval是增大其数值。 注意:灵敏度和误报率是成正比的,检查间隔越小,出现误报的可能性越大。所以,建议根据实际情况调整到合适的值。 5.4 resource.cfg文件介绍 resource.cfg是nagios的变量定义文件,文件内容只有一行。如下: $USER1$=/usr/local/nagios/libexec 其中,变量$USER1$指定安装nagios插件的路径。 如果把插件安装在了其它路径,只需在这里进行修改即可。 需要注意的是,变量必须先定义,然后才能在其它配置文件中进行引用,同时该变量也是可以通过宏进行定义。 nagios的一个重要特征就是可以在命令行的定义里使用宏,通过定义宏,nagios可以灵活的获取主机、服务和其它对象的信息。 5.4.1 宏的工作机制 在执行命令之前,nagios将对命令里的每个宏替换成它们应当取得的值。这种宏替换发生在nagios执行各种类型的宏时候。例如主机和服务的检测、通知、事件处理等。 5.4.2 宏的分类 根据宏的不同,我们可以把宏分成:默认宏、按需而成的宏、用户自定义宏。 默认宏,以主机IP地址宏为例。 当在命令定义中使用主机或服务宏时,宏将要执行时所用的值指向主机或服务所带的值。 看下面这个例子,假如在check_ping命令定义里使用了一个主机对象,如下: define host{ host_name ilanni address 192.168.1.247 check_command check_ping } define command{ command_name check_ping command_line /usr/local/nagios/libexec/check_ping -H $HOSTADDRESS$ -w 100.0,90% -c 200.0,60% } 那么执行这个主机检测命令时,最终执行的将是这样的: /usr/local/nagios/libexec/check_ping -H 192.168.1.247 -w 100.0,90% -c 200.0,60% nagios宏的优美之处在于你可以只用一个命令定义来完成无限个主机的检测,并且每个主机可以使用相同的命令来进行检测,而在对它们检测之前将把主机地址正确地进行替换。 命令参数宏 同样你也可以向命令传递参数,这样可以保证命令定义更具通用性。参数指定在对象(像主机或服务)中定义,用一个“!”来分隔,例如这样: define service{ host_name ilanniservice service_description PING check_command check_ping!200.0,80%!400.0,40% } 上例中,服务的检测命令中含有两个参数,$ARG1$宏将是”200.0,80%”,$ARG2$将是”400.0,40%”(都不带引号)。假如check_ping命令是这样定义的: define command{ command_name check_ping command_line /usr/local/nagios/libexec/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c$ARG2$ } 那么对于服务的检测命令最终将是这样的: /usr/local/nagios/libexec/check_ping -H 192.168.1.247 -w 200.0,80% -c 400.0,40% 另外,按需而成的宏和用户自定义宏,在此我们就不做过多介绍。如果想要深入学习有关nagios宏的相关知识的话,可以去nagios官网进行查看。 5.4.3 nagios可用的宏 nagios可用的宏比较多,但是每个命令最多支持32个参数宏。在此我们介绍几个经常使用的宏。 主机宏: $HOSTNAME$主机简称,取自于主机定义里的host_name。$HOSTADDRESS$主机地址,取自于主机定义里的address。 服务宏: $SERVICESTATE$当前服务的状态,有w、u、c、r。其中w即warn,表示警告状态。u即unknown,表示状态不明。c即criticle,表示紧急状态。r即recover,表示恢复状态。 $SERVICEDESC$对当前服务的描述。 联系人宏: $CONTACTNAME$表示联系人,在联系人contacts.cfg文件中定义。 通知宏: $NOTIFICATIONTYPE$返回下面信息:(“PROBLEM”, “RECOVERY”, “ACKNOWLEDGEMENT”,”FLAPPINGSTART”,”FLAPPINGSTOP”,”FLAPPINGDISABLED”,”DOWNTIMESTART”,”DOWNTIMEEND”,or”DOWNTIMECANCELLED”)。 日期/时间宏: $LONGDATETIME$当前的日期/时间戳。 文件宏: $LOGFILE$日志文件的保存位置。$MAINCONFIGFILE$主配置文件的保存位置。 其他宏: $ADMINEMAIL$全局管理员email地址。 $ARGn$指向第n个命令传递参数(通知、事件处理、服务检测等)。 如果想查看nagios所有宏的信息,可以在nagios的官方网站进行查看。如下: http://nagios.sourceforge.net/docs/nagioscore/4/en/toc.html 当然也可以查看nagioc中文版的连接,如下: http://nagios-cn.sourceforge.net/nagios-cn/advance.html 5.5 commands.cfg文件介绍 commands.cfg是nagios监控命令的定义文件,该文件默认是存在的,无需修改即可使用。当然如果有新命令需要加入时,只需在此文件中添加即可。这里并未列出该文件的所有内容,仅仅介绍在配置中经常使用到的一些命令。 egrep -v “^#|^$” commands.cfg 下面是notify-host-by-email命令的定义: define command{ command_name notify-host-by-email command_line /usr/bin/printf “%b” “*****Nagios*****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost:$HOSTNAME$\nState: $HOSTSTATE$\nAddress:$HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time:$LONGDATETIME$\n”|/bin/mail -s “** $NOTIFICATIONTYPE$ Host Alert:$HOSTNAME$ is $HOSTSTATE$**”$CONTACTEMAIL$ } command_name行定义命令名称,即定义了一个主机异常时发送邮件的命令。 command_line行定义命令具体的执行方式,其中“-H $HOSTADDRESS$”是定义目标主机的地址。 下面是notify-service-by-email命令的定义: define command{ command_name notify-service-by-email command_line /usr/bin/printf “%b” “*****Nagios*****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n”|/bin/mail -s “** $NOTIFICATIONTYPE$Service Alert: $HOSTALIAS$/$SERVICEDESC$is $SERVICESTATE$**”$CONTACTEMAIL$ } command_name行定义命令名称,即定义了一个服务异常时发送邮件的命令。 command_line命令具体的执行方式,“-H $HOSTADDRESS$”是定义目标主机的地址,这个地址在hosts.cfg文件中定义了。 下面是check-host-alive命令的定义: define command{ command_name check-host-alive command_line $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5 } command_name行定义命令名称,用来检测主机的状态。 command_line这里的变量$USER1$是在resource.cfg文件中进行定义的,即$USER1$=/usr/local/nagios/libexec,最后check_ping的完整路径为/usr/local/nagios/libexec/check_ping。 “-w 3000.0,80%”中“-w”说明后面的一对值对应的是“WARNING”状态,“80%”是其临界值。“-c 5000.0,100%”中“-c”说明后面的一对值对应的是“CRITICAL”,“100%”是其临界值。“-p 5”表示发送5个数据包。 check_ping命令的参数: -H 目标主机地址。 -w WARNING警告状态:响应时间(毫秒),丢包率(%)的阀值。 -c CRITICAL危险状态:响应时间(毫秒),丢包率(%)的阀值。 -p 发送包的个数,默认5个包。 -t 超时时间,默认10秒。 -4|-6 使用ipv4|ipv6 地址,默认ipv4。 5.6 contacts.cfg文件介绍 contacts.cfg是定义联系人和联系人组的配置文件。当监控的主机或者服务出现故障时,nagios会通过指定的通知方式,将信息发给这里指定的联系人。 egrep -v “^$|^#” contacts.cfg define contact{ contact_name nagiosadmin use generic-contact alias Nagios Admin email nagios@localhost } define contactgroup{ contactgroup_name admins alias Nagios Administrators members nagiosadmin } contact_name行定义联系人名称。 use行表示引用generic-contact的属性信息,其中generic-contact在templates.cfg文件中进行定义。 alias行定义联系人别名。 email行定义联系人的邮件地址。 contactgroup_name行定义联系人组名称。 members行定义联系人组成员,其中“nagiosadmin”就是上面定义的联系人。 5.7 timeperiods.cfg文件介绍 timeperiods.cfg文件用于定义监控的时间段。 下面是定义一个名为24×7的时间段,即监控所有时间段。如下: egrep -v “^#|^$” timeperiods.cfg 注意:timeperiod_name行定义的时间段名称中不能有空格。 5.8 templates.cfg文件介绍 为了不必重复定义一些监控对象,nagios引入了一个模板配置文件templates.cfg,将一些共性的属性定义成模板,以便于多次引用。 templates.cfg通用模板定义,包括监控主机模板generic-host、linux_server,监控服务模板local_service,联系人模板generic-contact(并非真正的联系人,真正的联系人在contacts.cfg中定义)。 下面详细介绍下templates.cfg文件中每个参数的含义: define contact{ name generic-contact 定义联系人名称。 service_notification_period 24×7 当服务出现异常时,发送通知的时间段,这个时间段“24×7″在timeperiods.cfg文件中定义。 host_notification_period 24×7 当主机出现异常时,发送通知的时间段,这个时间段“24×7″在timeperiods.cfg文件中定义。 service_notification_options w,u,c,r 定义通知可以发出的状态。w即warn,表示警告状态。u即unknown,表示状态不明。c即criticle,表示紧急状态。r即recover,表示恢复状态。也就是说在服务出现警告状态、未知状态、紧急状态和重新恢复状态时都发送通知给使用者。 host_notification_options d,u,r 定义主机在什么状态下需要发送通知给使用者。d即down,表示宕机状态。u即unreachable,表示不可到达状态。r即recovery,表示重新恢复状态。 service_notification_commands notify-service-by-email 定义服务发生故障时,发送通知的方式,这里定义的是邮件,其中“notify-service-by-email”在commands.cfg文件中定义。 host_notification_commands notify-host-by-email 定义主机发生故障时,发送通知的方式,这里定义的是邮件,其中“notify-host-by-email”在commands.cfg文件中定义。 register 0 } define host{ name generic-host 定义主机名称。这里的主机名,并不是直接对应到真正机器的主机名,而是对应到在主机配置文件里所设定的主机名。 notifications_enabled 1 event_handler_enabled 1 flap_detection_enabled 1 failure_prediction_enabled 1 process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 notification_period 24×7 指定发送通知的时间段,也就是可以在什么时候发送通知给使用者。 register 0 } define host{ name linux-server 定义主机名称。 use generic-host use表示引用,也就是将主机generic-host的所有属性引用到linux-server中来。在nagios配置中,很多情况下会用到引用。 check_period 24×7 这里的check_period告诉nagios检查主机的时间段。 check_interval 5 nagios对主机的检查时间间隔,这里是5分钟。 retry_interval 1 重试检查时间间隔,单位是分钟。 max_check_attempts 10 nagios对主机的最大检查次数,也就是nagios在检查发现某主机异常时,并不马上判断为异常状况,而是多试几次,因为有可能只是一时网络太拥挤,或是一些其他原因,让主机受到了一点影响,这里的10就是最多试10次的意思。 check_command check-host-alive 指定检查主机状态的命令,其中“check-host-alive”在commands.cfg文件中定义。 notification_period workhours 当主机故障时,发送通知的时间范围,其中“workhours”在timeperiods.cfg中进行定义。 notification_interval 120 在主机出现异常后,故障一直没有解决,nagios再次对使用者发出通知的时间,单位是分钟。 notification_options d,u,r 定义主机在什么状态下可以发送通知给使用者。d即down,表示宕机状态。u即unreachable,表示不可到达状态。r即recovery,表示重新恢复状态。 contact_groups admins 指定联系人组,这个“admins”在contacts.cfg文件中定义。 register 0 } define service{ name generic-service 定义服务名称。 active_checks_enabled 1 passive_checks_enabled 1 parallelize_check 1 obsess_over_service 1 check_freshness 0 notifications_enabled 1 event_handler_enabled 1 flap_detection_enabled 1 failure_prediction_enabled 1 process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 is_volatile 1 check_period 24×7 这里的check_period告诉nagios检查服务的时间段。 max_check_attempts 3 nagios对服务的最大检查次数。 normal_check_interval 10 此选项是用来设置服务检查时间间隔,也就是说,nagios这一次检查和下一次检查之间所隔的时间,这里是10分钟。 retry_check_interval 2 重试检查时间间隔,单位是分钟。 contact_groups admins 指定联系人组,同上。 notification_options w,u,c,r 这个定义的是通知可以发出时的状态。w即warn,表示警告状态,u即unknown,表示不明状态。c即criticle,表示紧急状态。r即recover,表示恢复状态。也就是在服务出现警告状态、未知状态、紧急状态和重新恢复后都发送通知给使用者。 notification_interval 60 在服务出现异常后,故障一直没有解决,nagios再次对使用者发出通知的时间,单位是分钟。 notification_period 24×7 指定发送通知的时间段,也就是可以在什么时候发送通知给使用者。 register 0 }
公司服务器比较多,需要把apache源码包制作成rpm包,然后放到公司内网yum源上进行下载安装。apache的rpm包安装方式比源码安装方式比较快,这能节约不少的时间。 有关内网yum源的搭建,可以参考《烂泥:yum的使用及配置》这篇文章。 一、安装rpm-build 查阅相关资料得知,要把源码包制作成rpm包需要使用rpm打包工具rpm-build。 rpm-build通过rpmbuild命令根据本地源码包,通过spec文件中的规则就可以把源码包制作成rpm包。 现在我们来安装rpm-build包,如下: yum -y install rpm-build rpm-build安装完毕后,我们来查看rpm-build的rpm包信息。如下: cd /var/cache/yum/x86_64/6/updates/packages/ 注意:yum安装软件默认是安装完毕立即删除的,但是我们可以通过修改yum.conf文件使其不删除。 cat /etc/yum.conf 查看rpm-build的rpm包相关信息,如:软件名称、版本、build日期、功能描述、大小等等。如下: rpm -qpi rpm-build-4.8.0-38.el6_6.x86_64.rpm 查看rpm-build的rpm包含安装的目录和文件,如下: rpm -qpl rpm-build-4.8.0-38.el6_6.x86_64.rpm 查看rpm-build的rpm包的配置文件,如果该该rpm包没有配置文件的话就不会显示。 rpm -qpc rpm-build-4.8.0-38.el6_6.x86_64.rpm 查看rpm-build的rpm包的依赖关系,如下: rpm -qpR rpm-build-4.8.0-38.el6_6.x86_64.rpm 除此之外,如果想查看这个文件属于哪个rpm 包,我们也可以使用以下命令。如下: rpm -qf /etc/init.d/iptables 有关rpm命令的详细使用方法,我们也可以通过man rpm进行查看。如下: man rpm 二、spec规则文件内容详解 spec文件是整个rpm包制作的核心,它的作用如同源码编译程序时的Makefile文件一样。 spec文件包含建立一个rpm包必要的信息,包括哪些文件是包的一部分以及它们安装在哪个目录等等信息。 注意:spec文件必须由普通用户创建,并且强烈建议使用vi或者vim命令创建。 我们先来创建一个httpd.spec文件,使用vi命令,如下: vi httpd.spec whoami pwd 通过上图,我们可以很明显的看出,目前httpd.spec文件中已经有spec文件的选项。我们所需要做的就是根据这些选项来填写该spec文件,填写完毕后保存即可。 注意:在新建一个spec文件时,系统会默认创建一个spec文件模版。只是该模版是空的,如果没有填写内容的话,是无法保存该文件的。 下面我们就开始讲解spec文件的相关选项,spec文件内容一般分为如下几个部分: 定义rpm包的信息、定义源码包、定义rpm包的依赖关系、打包前的工作、编译并安装rpm包、安装之后生成的文件、安装前后需要执行的脚本、软件变更日志 2.1定义rpm包的信息 rpm包信息,主要定义用户查询rpm包信息时所显示的内容。它包含rpm包的功能描述、软件版本、版权信息和软件授权类型等等。 详细信息如下: Name定义该rpm包的名字,必须要填写。 Version定义该rpm包的版本号,建议和源码包的名称保持一致。 Release定义rpm本身的版本号,使用默认值即可。 Summary定义关于该rpm包的一些介绍。 %description定义关于该rpm包的一些描述信息。 Group标识软件包所属类型。 License软件授权类型,比如GPL、Commercial、Shareware。 URL定义软件作者的主页。 rpm包信息中最重要的是NVR,也就是name、version、release。因为最后生成的rpm包的名称就是根据这三项来的。 rpm名称形式,如下:name-version-release.rpm。 2.2定义源码包 Source0用来定义制作rpm包时所需要的源码包。如果制作rpm包时,有多个源码包,那么使用source和数字混合,比如: source0: tbsys-src.tar.gz source1: tbnet-src.tar.gz source2: tair-2.1.0-src.tar.gz 注意: Source0必须要填写,而且填写的名字必须是和下载源码包名称要一模一样,还要注意只有tar.gz的源码包,才能制作rpm包。 2.3定义rpm包的依赖关系 rpm包在制作过程中会依赖基本库,而rpm包在安装时有时也需要其他软件包。这些我们都可以通过以下选项进行控制。 BuildRequires定义制作rpm包时,所依赖的基本库。该选项可有可无。 Requires定义安装该rpm包时,所依赖的软件包。该选项可有可无。 注意: 在这里要重点说明一点,Requires定义所依赖的软件包,在进行yum安装时的情况。 我们在使用yum安装软件A时,yum会在下载完A的rpm包后,对该rpm包进行检查(rpm包中会给出安装该rpm包安装时,所依赖的基础库和软件)。 如果检查出,A的安装还要依赖软件B,那么此时yum就会自动下载并安装B。B安装完毕后,就会继续安装A。如果是内网yum源的话,我们只需要把B放在内网yum源即可。 如果检查出,A的安装不需要其他软件的支持,那么yum会自动安装A。 2.4编译并安装rpm包 这一步是非常重要,类似与源码安装的的./configure、make、make install。主要包括%build、%install等选项。如下: %build定义编译软件包时的操作 %install定义安装软件包,使用默认值即可。 BuildRoot定义安装或编译时使用的虚拟目录,建议使用默认值即可。如下: %(mktemp-ud%{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) 该参数非常重要,因为在生成rpm包的过程中,执行make install时就会把软件安装到上述的路径中。在打包的时候,同样依赖虚拟目录为根目录进行操作。 2.5安装之后生成的文件 rpm包在进行安装时,会创建相关的目录及文件,我们就可以在此定义。 %files定义rpm包安装时创建的相关目录及文件。 在该选项中%defattr (-,root,root)一定要注意。它是指定安装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755。 2.6安装前后需要执行的脚本 %prep指定rpm包安装前执行的脚本。在对软件进行打包前,我们还进行其他操作。比如解压tar.gz文件。%prep主要与%setup –q命令配合使用,建议使用默认值即可。 %post指定rpm包安装后执行的脚本。我们在安装完毕rpm包后,执行软件初始化的动作,就可以通过%post来达到目的。比如:apache在安装后,将apachectl拷贝成httpd等操作。默认spec模版文件不存在此选项。 %preun指定rpm包卸载前执行的脚本,该选项主要用于软件升级的时候会执行。默认spec模版文件不存在此选项。 %postun指定rpm包卸载后执行的脚本。默认spec模版文件不存在此选项。 2.7软件变更日志 %changelog主要用于软件的变更日志。该选项可有可无。 如果使用%changelog选项的话,一定要以*开头,以- -结尾。时间格式为,如下: * 星期 月 日 年 XXX — 示例为: * Tue Mar 03 2015 ilanni2.2.27 — 注意:星期和月一定要使用英文,并且是简写的,否则会报错。如下: 三、httpd.spec文件示例 下面就以系统提供的spec文件为模版,把apache源码包制作成rpm包。apache的spec文件如下: Name: httpd Version: 2.2.27 Release: 1%{?dist} Summary: compiled from 2.2.27 by ilanni Group: System Environment/Daemons License: GPL URL: http://www.ilanni.com Source0: httpd-2.2.27.tar.gz BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: gcc, gcc-c++, openssl-devel %description Apache web server. Compiled from 2.2.27 by ilanni %prep %setup -q %build ./configure –prefix=/usr/local/httpd –enable-so –enable-rewrite –enable-cgi –enable-ssl –enable-charset-lite –enable-suexec –with-suexec-caller=daemon –with-suexec-docroot=/usr/local/httpd/htdocs make %{?_smp_mflags} %install rm -rf %{buildroot} make install DESTDIR=%{buildroot} %clean rm -rf %{buildroot} %files %defattr(-,root,root,-) /usr/local/httpd/bin/* /usr/local/httpd/build/* /usr/local/httpd/cgi-bin/* %config /usr/local/httpd/conf/* /usr/local/httpd/error/* /usr/local/httpd/htdocs/* /usr/local/httpd/icons/* /usr/local/httpd/include/* /usr/local/httpd/lib/* %dir /usr/local/httpd/logs %doc /usr/local/httpd/man/* %doc /usr/local/httpd/manual/* /usr/local/httpd/modules/* %post cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd sed -i ‘1a # chkconfig: 2345 85 15’ /etc/init.d/httpd sed -i ‘2a # description: apache web server’ /etc/init.d/httpd chkconfig –add httpd %preun /etc/init.d/httpd stop chkconfig –del httpd %changelog * Tue Mar 3 2015 ilanni<ilanni@ilanni.com> 2.2.27 — 四、生成相关目录 要生成rpm包的相关目录,我们可以通过手工创建,也可以通过rpmbuild命令创建。如下: rpmbuild httpd.spec 注意:在使用rpmbuild生成rpm包的相关目录时会报错,这个不需要去管它。 tree rpmbuild/ 通过上图,我们可以很明显的看到rpmbulid命令已经生成相关的目录。 每个目录的作用,如下: BUILD用于存放解压后的文件。 BUILDROOT用安装或编译时使用的虚拟目录。 RPMS用于存放由rpmbuild制作好的二进制包。 SOURCES用于存放源代码、补丁、图标等文件。 SPECS用于存放用于管理rpm制作进程的spec文件。 SRPMS用于存放由rpmbuild制作好的源码包。 五、把文件拷贝到指定目录 相关目录创建完毕后,现在我们需要把相关apache的源码文件以及spec文件复制指定的目录。如下: cp httpd-2.2.27.tar.gz rpmbuild/SOURCES/ cp httpd.spec rpmbuild/SPECS/ 六、生成RPM包 以上配置完毕后,我们现在就开始生成rpm包,使用rpmbuild命令。如下: rpmbuild -ba rpmbuild/SPECS/httpd.spec 通过上图,我们可以很明显的看出rpm包已经制作成功。 新生成的rpm包存放在rpmbuild/RPMS/目录下,而源码rpm包则存放在rpmbuild/SRPMS/目录下。 注意:rpmbuild –ba命令的意思是编译后做成*.rpm包和src.rpm包。 七、测试生成RPM包 rpm包制作完成后,我们来测试该rpm包。如下: cp /home/ilanni/rpmbuild/RPMS/x86_64/httpd-2.2.27-1.el6.x86_64.rpm ./ rpm -ivh httpd-2.2.27-1.el6.x86_64.rpm 通过上图,我们可以很明显的看出,通过源码制作的rpm已经正常安装。
有关为KVM中的虚拟机(以下称VM)添加硬盘、网卡等设备,我以前写过几篇有关这方面的文章。文章如下:《烂泥:KVM虚拟机windows系统增加硬盘》,《烂泥: KVM虚拟机Linux系统增加硬盘》,《烂泥:为KVM虚拟机添加网卡》。 但是现在回头再看看,这几篇文章,感觉写的比较零散,对如何为VM添加设备没有做总结。 今天就把有关如何为KVM中的VM添加设备做一个总结。为KVM中VM添加设备,我们可以分以下几个步骤: 1、VM基本信息 2、修改VM的XML配置文件 3、重新加载XML配置 4、启动VM查看添加的设备 一、 VM基本信息 要给KVM的VM添加设备,我们需要一台已经安装好的VM。查看该VM的硬盘、网卡、内存信息,如下: 通过上图,我们知道目前该VM只有一块硬盘,该硬盘在VM系统中显示为磁盘0,而在KVM中为/dev/vg/server2003。 通过上图,我们知道目前该VM只有一块网卡,并且MAC地址为52:54:00:B7:E8:D4。 注意:VM的MAC地址XML配置文件与VM系统中显示的是一致的。 通过上图,我们知道目前该VM的内存为2G。 注意:以上截图,我们都是通过VM与该VM的XML配置文件对比的。 二、修改VM的XML配置文件 现在我们要求给该VM新加一块硬盘、一块网卡,并且把内存升级到4G。 要到达这个要求其实是很容易的,我们只需要修改该VM的XML配置文件即可。如下: vi /etc/libvirt/qemu/server2003-cf.xml 2.1添加硬盘 新加一块硬盘,XML配置中的代码如下: <disk type=’block’ device=’disk’> <driver name=’qemu’ type=’raw’ cache=’none’ io=’native’/> <source dev=’/dev/vg/test‘/> <target dev=’hdb‘ bus=’ide’/> </disk> 注意:要添加硬盘,我们只需要复制原来硬盘对应的代码,去掉address那一行,然后把source和target所在行修改即可。 需要特别注意的是,address那一行,其实我们也可以进行修改的。如果我们不修改的话,在重新加载该VM的XML配置后,KVM会给该硬盘自动添加上。 如果我们一定要修改的话,我们只需要修改unit为1即可。unit为1代表该硬盘在VM系统中显示为第二块硬盘。通过对比我们也可以知道,第一块硬盘的unit为0。 其完整XML配置代码,如下: <disk type=’block’ device=’disk’> <driver name=’qemu’ type=’raw’ cache=’none’ io=’native’/> <source dev=’/dev/vg/test‘/> <target dev=’hdb‘ bus=’ide’/> <address type=’drive’ controller=’0′ bus=’0′ target=’0′ unit=’1′/> </disk> 2.2添加网卡 新加一块网卡,XML配置中的代码如下: <interface type=’bridge’> <mac address=’52:54:00:b7:e9:d5‘/> <source bridge=’br0‘/> </interface> 添加网卡比较简单,我们只需要复制现在网卡的配置信息,然后修改下即可。 注意:网卡的MAC地址,我们可以进行自定义,同时该网卡需要桥接到哪一块KVM网卡上面,我们也是可以选择的。 同时,还需要注意在此我们没有复制address行。那是因为这个配置是和硬盘是类似的。 如果我们也想直接添加address行,我们只需修改addres行中的slot选项。只需要把该项修改为与其他的slot不同即可。 其完整XML配置代码,如下: <interface type=’bridge’> <mac address=’52:54:00:b7:e9:d5‘/> <source bridge=’br0‘/> <address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x04′ function=’0x0’/> </interface> 2.3升级内存 内存升级,如下: <name>server2003-cf</name> <uuid>8b97cecd-2d34-c317-613b-c829b6ac6f2d</uuid> <memory unit=’KiB‘>4194304</memory> <currentMemory unit=’KiB’>4194304</currentMemory> <vcpu placement=’static’>8</vcpu> 内存的升级比较简单,我们只需要计算下升级后内存的大小,然后修改XML文件即可。 注意:在VM的XML配置文件中,内存默认是以KiB为单位的。现在我们把内存升级到4G,那么XML配置文件对应的数字为4*1024*1024=4194304KiB。 有关硬盘、网卡、内存的配置信息修改完毕后,我们就需要保存XML配置文件。 三、重新加载XML配置 VM的XML配置文件修改完毕后,我们现在来重新加载该XML配置文件。 使用define命令,如下: virsh define /etc/libvirt/qemu/server2003-cf.xml 注意:virsh define命令不仅具有新添加一个VM的功能,而且还能重新加载VM的XML配置文件。 四、启动VM查看添加的设备 VM的XML配置加载完毕后,我们现在来启动VM。如下: virsh start server2003-cf 进入VM查看新加的硬盘、网卡和升级后的内存,如下: 通过上图,我们可以看到前面我们添加的硬盘、网卡都已经正常添加,同时内存也升级到4G。 到此,我们有关给KVM中的VM添加设备结束。
有关服务器的自动化管理,这方面以前没有接触过。打算这段时间把这块知识给补上。 现在服务器自动化管理软件,使用最多也最火的就是puppet了。 那么我们今天的主角也就是puppet。分以下几个步骤来介绍: 1、 puppet是什么 2、 puppet优点 3、 安装准备工作 4、 环境准备 5、 源码安装puppet 6、 RPM安装puppet 7、 puppet证书授权 8、 puppet资源 一、puppet是什么 puppet是一种基于ruby语言开发的Lnux、Unix、windows平台的集中配置管理系统。它使用自有的puppet描述语言,可管理配置文件file、用户user、cron任务、软件包、系统服务等系统实体。 puppet把这些系统实体称之为资源,puppet设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。 puppet依赖于C/S(客户端/服务器)的部署架构。它需要在puppet服务器上安装puppet-server软件包(以下简称master),在需要管理的目标主机上安装puppet客户端软件(以下简称agent)。 当agent连接上master后,定义在master端的配置文件会被编译,然后在agent上运行。每个agent默认30分钟会连接一次master,确认配置信息的更新情况。但是这种方式在很多场景下不是很符合系统管理员的要求,所以很多系统管理员也会将agent通过crontab(任务计划)来管理,这样会更加灵活一些。 二、puppet优点 puppet的语法允许你创建一个单独的脚本,用来在你所有的目标主机上建立一个用户。所有的目标主机会依次使用适合本地系统的语法来解释和执行这个模块。如果这个配置是在Red Hat服务器上执行的话,建立用户使用useradd命令,如果这个配置是在FreddBSD服务器上执行的话,则使用adduser命令。 puppet另外一个卓越的地方就是它的灵活性。源于开源软件的天性,你可以自由地获得puppet的源代码。如果你遇到问题并且有能力处理的话,你可以修改或加强puppet的代码使其适用于你的环境,然后解决这个问题。 puppet也是易于扩展的。定制软件包的支持功能和特殊的系统环境配置能够快速简单地添加至puppet的安装程序中。 三、安装准备工作 本次实验OS为centos 6.5 64bit,服务端为:192.168.199.247,客户端为192.168.199.248。 在正式实验之前,我们有几个事情需要先进行处理。 3.1 主机时间同步 为了减少在实验过程中不必要的麻烦,我们需要对所有主机(包括服务器和客户端)进行时间同步。即服务器与客户端的时间相差不能超过秒级。 使用以下命令进行时间同步,如下: ntpdate timekeeper.isi.edu 如果在进行时间同步时,出现如下错误: 21 Jan 17:20:45 ntpdate[2720]: the NTP socket is in use, exiting 请关闭主机的ntpd服务,然后再进行时间同步。 /etc/init.d/ntpd stop 3.2 修改主机名 因为安装 puppet 时会把主机名写入证书,同时客户端和服务端之间通信需要这个证书。所以需要修改服务器与客户端的主机名。 修改主机名。如下: hostname s.ilanni.com 执行此命令,可以使主机的主机名立即生效。但是服务器重启后,此修改就会失效。 要是主机名永久生效的话,需要修改/etc/sysconfig/network文件。如下: cat /etc/sysconfig/network 本次实验,我们就不搭建DNS服务器,直接通过修改服务端与客户端的hosts文件来达到各自解析域名的目的。如下: cat /etc/hosts 192.168.199.247 s.ilanni.com 192.168.199.248 c.ilanni.com 3.3 关闭iptables和selinux 我们现在所有的实验都是在关闭iptables和selinux下进行的。 /etc/init.d/iptables status cat /etc/selinux/config 四、环境准备 puppet的安装可以分为源码安装和RPM安装,但是无论哪一种安装方法,我们都需要在安装之前对其进行几点需要说明。 4.1 puppet安装说明 1、由于puppet是采用ruby语言开发,所以无论是源码还是RPM方式安装puppet,我们都必须要先安装ruby语言环境 2、puppet从2.7版本以后,就需要hiera的支持。所以也必须安装hiera。 3、在前面章节中,我们说明了puppet是一个配置管理系统,而管理的资源,都是系统的实体。但是这些实体,是如何来的呢?这就需要我们安装另外一个资源收集软件—facter。 facter主要用来收集主机的一些信息,比如:CPU、主机IP等。facter把这些收集的信息发送给puppet服务器端,服务器端就可以根据不同的条件来对不同的节点机器生成不同的puppet配置文件。 facter也是ruby语言开发的,这个我们可以在facter的安装文档中可以查看到,如下: cat README.md 4.2 安装ruby ruby的安装比较简单,我们在此使用是yum进行安装。如下: yum -y install ruby ruby安装完毕后,我们来查看其生成的文件。如下: rpm -ql ruby 我们可以查看ruby的帮助信息,如下: ruby -h 除此之外,我们还要安装ruby-rdoc这个软件包。该软件包主要用于查看ruby的帮助文档。如下: yum -y install ruby-rdoc 以上就是和ruby有关的软件包,安装完毕后,我们开始来安装facter。 4.3 安装facter facter我们可以从puppet官网下载,如下: http://downloads.puppetlabs.com/facter/ 注意:facter也可以通过yum进行安装,在此我们使用的是源码安装。 下载facter最新的版本,如下: wget http://downloads.puppetlabs.com/facter/facter-2.3.0.tar.gz 解压facter软件包,如下: tar -xf facter-2.3.0.tar.gz 开始安装facter,如下: ruby install.rb或者./install.rb facter安装完毕后,我们来查看下facter的使用帮助。如下: facter -h 如果想查看facter详细帮助信息,我们也可以man下facter。如下: man facter 如果安装没有问题的话,我们在执行facter命令后,会显示facter收集的相关信息。如下: facter 4.4 安装hiera hiera主要用于控制一些agent经常变化的数值,在puppet2.7以后的版本必须要安装。如果不安装的话,我们在安装puppet时,系统会提示如下错误: Could not load hiera; cannot install 但是在安装hiera之前,我们必须安装额外的yum源,否则系统会提示找不到该软件包。 该yum源,我们可以puppet官网查看到。如下: https://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html#for-red-hat-enterprise-linux-and-derivatives 按照puppet官网的方法进行安装。如下: rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm yum源配置完毕后,我们现在来安装hiera。如下: yum -y install hiera 以上安装完毕后,我们就可以正式安装puppet。 五、 源码安装puppet puppet服务端与客户端的源码安装使用的是同一个软件包,安装步骤一样,只是在配置文件方面有细微的差别。 在下载puppet源码之前,我们还要在master端和agent端创建puppet运行时使用的用户puppet。master端如果不创建的话,master在启动时,会报如下错误: 创建puppet用户,如下: useradd -M -s /sbin/nologin puppet cat /etc/passwd |grep puppet 注意:puppet服务端是以puppet用户运行的,而puppet客户端是root用户运行。 这样做的目的是:master在服务端以普通用户运行安全性比较高,而agent在客户端以root用户运行,是因为master在创建用户、修改系统文件等资源时,需要具有最高权限。 5.1 puppet源码安装 puppet的源码包,我们可以从puppet官网下载。目前puppet最新版为3.7.3.如下: http://downloads.puppetlabs.com/puppet/ 下载puppet软件包。如下: wget http://downloads.puppetlabs.com/puppet/puppet-3.7.3.tar.gz 解压puppet软件包,如下: tar -xf puppet-3.7.3.tar.gz puppet的安装方法与facter的安装一样,如下: ruby install.rb或者./install.rb puppet安装完毕后,我们来查看下其帮助信息,如下: puppet help 查看puppet的安装位置如下: ll /etc/puppet/ 以上就是puppet的安装,安装完毕后。我们现在来配置puppet。 5.2 master端配置 puppet安装完毕后,我们来配置下master端。把puppet源码包ext/redhat/目录下的puppet.conf文件复制到puppet的安装目录/etc/puppet/下,如下: cp ext/redhat/puppet.conf /etc/puppet/ vi /etc/puppet/puppet.conf server = s.ilanni.com certname = s.ilanni.com pluginsync = false 其中s.ilanni.com表示puppet服务器的主机名。 pluginsync = false表示关闭模块中的插件功能 配置文件修改完毕后,我们现在来配置master端的启动脚本。 复制puppet源码包ext/redhat/目录下的server.init文件到/etc/init.d/下,并重命名为puppetmaster。然后赋予puppetmaster可执行权限。如下: cp ext/redhat/server.init /etc/init.d/puppetmaster chmod u+x /etc/init.d/puppetmaster 注意:master端启动,我们也可以通过puppet master命令来启动。如下: puppet master netstat -tunlp |grep "8140" ps aux |grep puppet 其实puppetmaster启动脚本就是使用puppet master命令启动的,如下: cat /etc/init.d/puppetmaster 把puppetmaster加入到开机启动项。如下: chkconfig –add puppetmaster chkconfig puppetmaster on chkconfig |grep puppetmaster 以上都配置完毕后,我们来启动puppet服务,如下: /etc/init.d/puppetmaster start ps aux |grep puppet netstat -tunlp 通过上图,我们可以很puppet服务使用TCP协议的8140端口,而且运行时使用puppet用户。 puppet服务端配置完毕后,我们现在来配置puppet客户端。 5.3 agent端配置 agent端的配置,只需要把puppet.conf文件复制到puppet的安装目录/etc/puppet/下即可,如下:。 cp ext/redhat/puppet.conf /etc/puppet/ cat /etc/puppet/puppet.conf server = s.ilanni.com pluginsync = false 其中s.ilanni.com表示puppet服务器的主机名。 pluginsync = false表示关闭模块中的插件功能 agent端启动,我们可以通过puppet agent命令来启动。如下: puppet agent ps aux |grep puppet 通过上图,我们也可以看出agent端运行时使用的用户为root,而不是puppet用户。 注意:agent端我们使用puppet agent命令来进行各种管理,包括证书的申请、资源的同步,我们都是通过这个命令进行的。 agent可以以两种方式运行:第一种方式是命令接参数连接master,第二种是以守护进程的形式在系统后台运行,默认每30分钟连接一次master,但是这样并不灵活。我们一般是使用第一种方式,并配合crontab使用。 六、 RPM安装puppet RPM方式安装puppet比较简单,我们只需yum安装即可。如下: 6.1 puppet安装准备工作 在使用RPM安装之前,我们要先配置额外的yum源,否则系统会提示找不到puppet软件包。如下: yum -y install puppet-server 安装额外的yum源,我们可以在puppet的官网查找到yum源。如下: https://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html#for-red-hat-enterprise-linux-and-derivatives 按照puppet官网的方法进行安装。如下: rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm 注意:该yum源无论是master端和agent端都需要进行配置。 6.2 master端安装与配置 现在开始yum安装master端,如下: yum -y install puppet-server 通过上图,我们可以看到安装puppet-server是要依赖于facter、hiera和puppet三个软件包。 现在我们来查看puppet-server安装时新建的用户以及puppet服务运行时所用的用户,如下: cat /etc/passwd ps aux |grep puppet 通过上图,我们可以看到puppet-server在安装时确实新建用户puppet,以及在运行时使用的确实puppet用户。 查看puppet服务所使用的端口,如下: /etc/init.d/puppetmaster start netstat -tunlp master端安装完毕后,我们来配置puppet服务的配置文件,其方法和源码安装方法一样。如下: vi /etc/puppet/puppet.conf server = s.ilanni.com certname = s.ilanni.com pluginsync = false 6.3 agent端安装与配置 master端安装完毕后,我们来安装agent端如下: yum -y install puppet RPM安装的puppet客户端与源码安装的一样,我们现在来启动puppet客户端。如下: 通过上图,我们可以看出agent端安装时也创建了puppet用户,但是puppet运行时没有使用该用户而是使用root用户。这个与源码安装的相对应。 agent端安装完毕后,我们来配置agent端的配置文件,其方法和源码安装方法一样。如下: vi /etc/puppet/puppet.conf server = s.ilanni.com pluginsync = false 七、 puppet证书授权 我们知道puppet为了安全,采用ssl隧道通信,因此需要申请证书来验证。 7.1 master端证书初始化 当master端第一次启动的时候,可以查看/var/log/message日志文件中,有类似如下的信息: tail -f /var/log/messages Jan 23 06:39:03 localhost puppet-master[1622]: Signed certificate request for ca Jan 23 06:39:04 localhost puppet-master[1622]: s.ilanni.com has a waiting certificate request Jan 23 06:39:04 localhost puppet-master[1622]: Signed certificate request for s.ilanni.com Jan 23 06:39:04 localhost puppet-master[1622]: Removing file Puppet::SSL::CertificateRequest s.ilanni.com at ‘/var/lib/puppet/ssl/ca/requests/s.ilanni.com.pem’ Jan 23 06:39:04 localhost puppet-master[1622]: Removing file Puppet::SSL::CertificateRequest s.ilanni.com at ‘/var/lib/puppet/ssl/certificate_requests/s.ilanni.com.pem’ Jan 23 06:39:04 localhost puppet-master[1634]: Reopening log files Jan 23 06:39:04 localhost puppet-master[1634]: Starting Puppet master version 3.7.3 从日志中我们可以看出第一次启动master端时,puppet服务会在本地创建认证中心,给自己授权证书和key,这个我们可以在/var/lib/puppet/ssl看到那些证书和key。如下: ll /var/lib/puppet/ssl 这个目录和/etc/puppet/puppet.conf文件中配置的ssldir路径有关系。 我们也可以查看master端给自己授权的证书文件,如下: ll /var/lib/puppet/ssl/ca/signed 7.2 agent端申请证书 agent端在第一次连接master端时,会向master端申请证书。如果master端没有授予agent端证书,那么agent端和master端之间的连接是不会建立成功的。 此时agent端会持续等待master端授权证书,并会每隔2分钟去检查master端是否签发证书。 我们现在使用puppet agent –server s.ilanni.com连接master端,如下: puppet agent –server s.ilanni.com 7.3 master端授权证书 agent端申请证书完毕后,需要我们切换到master端,使用puppet cert命令来对agent端授权证书。 有关puppet cert的使用,我们可以查看pupper cert的帮助信息。如下: pupper cert 在上图中,puppet cert已经给出如何给一个agent端进行授权证书的例子。 现在我们来查看master端有哪些主机在申请证书,如下: puppet cert list 通过上图,我们很明显的可以看到c.ilanni.com客户端正在申请证书。 现在我们来给agent端授权证书,使用如下命令: puppet cert sign c.ilanni.com 注意:如果实际生产环境客户端数量比较多的话,我们可以一次性授权所有证书。如下: puppet cert sign –all 在master端查看所有已经通过认证的agent端,如下: puppet cert -all 现在我们再来看看master端给agent端授权的证书文件,如下: ll /var/lib/puppet/ssl/ca/signed 通过上图,我们可以看出master端授权客户端c.ilanni.com的证书文件是c.ilanni.com.pem。 7.4 查看agent端证书 在master端授权完毕后,我们现在切换到agent端查看授权的证书文件,如下: ll /var/lib/puppet/ssl/certs 通过上图,我们可以看出agent端的证书文件c.ilanni.com.pem与master端的证书文件是一样的。 7.5 puppet证书问题 在实际的生产环境中,可能会出现已经通过master端认证的agent端主机名被修改或者其他一些误操作,从而导致agent端无法与master端进行正常通信。 当遇到这种情况时,我们一般的处理方法是先删除master端和agent端的相关的认证文件,然后在agent端重新申请证书。 具体操作如下: agent端,删除/var/lib/puppet/ssl目录,如下: rm -fr /var/lib/puppet/ssl master端,删除/var/lib/puppet/ssl/ca/signed目录下的证书文件,如下: rm -fr /var/lib/puppet/ssl/ca/signed/c.ilanni.com.pem 以上操作完毕后,agent端再次申请证书即可。 八、 puppet资源 puppet环境搭建完毕后,我们现在开始来介绍puppet资源相关的内容。 8.1 puppet的资源类型及帮助 puppet的资源,我们是可以通过相关命令查看puppet支持的资源类型。 通过前面的章节,我们知道puppet是支持子命令进行查询的。如下: puppet help ca 查看puppet支持的资源类型。如下: puppet describe –list 也可以通过puppet resource –type命令查询,如下: puppet resource –type 通过上图,我们可以看到puppet支持用户user、文件file、crontab等大部分的资源。 如果想查看user的资源,我们还是继续使用puppet describe user命令进行查看。如下: puppet describe user 如果我们想查看user在puppet站点site.pp文件中的具体使用方法,可以通过如下命令进行查看: puppet resource user 通过上图,我们可以看到puppet已经给出了user使用的例子,我们只需要按照这个例子进行操作即可。 注意:如果puppet describe帮助中没有该资源在site.pp站点中的使用详情,我们可以去到puppet resource中进行查看。 这个只是以user资源为例,如果想查看host资源的帮助,我们也可以使用类似的命令,如下: puppet resource host 如果你不想在本机进行查看,那么也可以去puppet官网进行查看,如下: https://docs.puppetlabs.com/references/latest/type.html 8.2 puppet资源配置文件 puppet的资源配置文件在服务端的/etc/puppet/manifests目录下,我们需要在该目录下创建一个站点文件site.pp。 我们在该文件中创建需要同步到agent端的资源,如下: cat /etc/puppet/manifests/site.pp node default{ file { "/tmp/test.txt": content => "Hello,ilanni,this is puppet test!\n"} } 以上命令表示在puppet资源配置文件冲创建一个默认节点,使用file资源,在agent端的/tmp/目录下创建test.txt,内容为:Hello,ilanni,this is puppet test!\n 注意:其中的\n表示换行。如果不加\n的话,查看该文件内容时会显示成这样: 同时site.pp文件创建完毕后,我们要先重启下master端,如下: /etc/init.d/puppetmaster restart 现在切换到agent端同步该资源,如下: puppet agent –test –server s.ilanni.com 通过上图,我们可以看到agent端已经把master端的资源的同步到本地。 现在我们来查看,agent端的/tmp目录下是否有test.txt这个文件。如下: cat /tmp/test.txt 通过上图,我们可以看到agent端确实已经同步到master端的资源。/tmp目录下确实有test.txt这个文件,而且内容也确实和master端的一样。 到此有关puppet3.7搭建与配置介绍完毕,下一篇文章我们会介绍在生产环境中,puppet同步的资源。
上篇文章中,我们介绍了有关Linux系统之间的文件同步,这篇文章我们来介绍下,有关Linux系统与windows系统,以及windows系统与windows系统之间的文件同步。 这篇文章我们需要分三个部分进行讲解: 1、 windows系统同步文件到Linux系统 2、 Linux系统同步文件到windows系统 3、 windows与windows系统之间的文件同步 一、windows系统同步文件到Linux系统 要使windows系统下的文件同步到Linux系统,我们需要安装rsync的windows客户端cwRsync。 cwRsync我们可以去下面这个连接进行下载: https://www.itefix.net/cwrsync 当然,我们也可以去这个连接下载《cwRsync5.4.1客户端》。 目前cwRsync的版本是5.4.1,我们下载解压后配置下,就可以正常使用。如下: 注意:图中的cwrsync.cmd文件,我们可以双击该文件进行配置cwRsync,也可以自行进行配置。但是通过我的实际验证该文件不能成功配置cwRsync,所以建议手工进行配置。 其实配置就是把目前cwRsync所在的路径加入到系统的环境变量中。 手工配置如下: 通过上图,我们可以看到rsync客户端cwRsync已经安装完毕。 注意:windows下的rsync客户端与Linux下rsync客户端配置是一样的,只是在路径中有不同之处。 下面就开始配置rsync客户端,创建rsync的密码文件,如下: rsync服务端的配置与《烂泥:linux文件同步之rsync学习(一)》这篇文章同一个环境。 我们现在的要求是把rsync客户端E:\www文件夹下的文件同步到rsync服务器上。 rsync服务器是192.168.199.247,rsync客户端为192.168.199.245。 rsync服务器已经正常运行,相关配置文件如下: 下面我们的所有操作都是在rsync客户端上进行的,执行如下命令: rsync -avz –delete –progress /cygdrive/e/www apache@192.168.199.247::www –password-file=/cygdrive/e/rsyncd.password 注意:上述命令行中的/cygdrive/e/表示windows系统的E盘,/cygdrive/e/rsyncd.password表示E盘下的rsyncd.password文件。 通过上图,我们可以很明显的看到windows系统的文件已经同步到Linux系统上了。 但是这个同步还是有一个缺点的就是不能实时同步,windows系统不像Linux系统那样支持inotify。 但是我们可以通过windows自带的任务计划,让系统自行进行同步。尽管这个和服务器还是有一定的时间差的,但是有总比没有好。 我们可以把上述命令,写到一个批处理文件中,然后在任务计划中进行配置。如下: 二、Linux系统同步文件到windows系统 要把Linux系统文件同步奥windows系统,需要我们在windows系统上配置rsync服务端,即安装cwRsyncserver。 cwRsyncserver目前网络上的免费版本为4.1.0,我们可以去这个连接下载《cwRsync_server4.1.0下载》。 cwRsyncServer下载完毕后,进行安装即可。其中有一点需要注意,就是在安装的过程中,会出现如下的提示: 这个对话框是要你输入cwRsyncServer在系统中新建用户的用户名及密码。 cwRsyncServer安装完毕后,我们就可以在windows的服务中看到rsync服务。如下: rsyncserver安装完毕后,我们现在来配置rsyncserver。windows下rsyncserver的配置和Linux下rsync服务配置没有多大的区别。 rsyncserver安装完毕后,配置文件已经形成。我们可以在其的安装目录下看到。如下: 我们现在来修改rsync的配置文件rsyncd.conf,如下: use chroot = false strict modes = false hosts allow = * log file = rsyncd.log [www] path = /cygdrive/e/www/ ignore errors read only = no list = no hosts allow = 192.168.199.0/255.255.255.0 auth users = apache secrets file = /cygdrive/e/rsyncd.password 配置文件rsyncd.conf修改完毕后,我们来创建www模块的同步文件夹,如下: 注意:同步文件夹创建完毕后,一定要把我们在前面安装rsyncserver时创建的用户,对该文件夹具有完全所有权。如下: 同步文件夹创建完毕后,我们再来创建同步时的密码文件,如下: 注意:该文件创建完毕后,一定要使用chmod命令修改其权限。这个和Linux系统上是一样的。 chmod命令在rsyncserver的bin目录下,我们可以直接使用。如下: 如果不使用chmod命令修改的话,回报以下的错误信息: chmod 600 rsyncd.password 以上全部修改并配置完毕后,我们就可以启动rsyncserver,如下: 现在在Linux机器上检查是否可以正常连接,rsync服务端。如下: 通过上图,我们可以看到Linux机器是可以正常连接rsync服务端的。 现在我们开始在rsync客户端进行同步,如下: rsync -avz /www/ apache@192.168.199.245::www –password-file=/etc/rsyncd.password 切换到rsync服务端,查看是否同步过来。如下: 通过上图,可以看到Linux已经把文件同步到windows系统中。 因为rsync客户端是Linux系统,所以我们也可以实时的把Linux系统的文件同步到windows系统上。 同步脚本如下: #!/bin/bash src=/root/www/ dest=www ip=192.168.199.247 /usr/bin/inotifywait -mrq –timefmt ‘%d/%m/%y%H:%M’ –format ‘%T %w %f’ -e modify,delete,create,attrib $src | while read DATE TIME DIR FILE; do filechange=${DIR}${FILE} /usr/bin/rsync -avz –delete –progress $src apache@$ip::$dest –password-file=/etc/rsyncd.password & echo "At ${TIME} on ${DATE}, file $filechange was backed up via rsynce" >>/tmp/rsync.log 2>&1 done 三、 windows与windows系统之间的文件同步 windows与windows系统之间的文件同步,我们只需要在windows系统上安装rsync相应的客户端与服务端即可。 rsync服务端192.168.199.245,rsync客户端192.168.199.244。 对于rsync客户端是windows系统的,我们的rsync服务端要进行一些修改否则会提示出错。出错信息如下: 我们需要在rsyncd.conf配置文件中加入uid和gid,如下: 然后重启rsyncserver即可。 rsync客户端测试rsync服务端,如下: telnet 192.168.199.245 873 客户端创建完毕密码文件后,我们就可以来同步。如下: rsync -avz /cygdrive/e/soft apache@192.168.199.245::www –password-file=/cygdrive/e/rsyncd.password 同步完毕后,我们来切换到rsync服务端查看,如下: 通过上图,我们可以看到rsync客户端确实已经把文件同步到rsync服务端上了。 注意:如果你在同步时,碰到系统一直提示输入密码,即使你在rsync同步命令中加入了密码文件。 这时我们就需要先建立密码文件rsyncd.password并把密码也存入到里面,然后在建议一个用于专门存储密码的文件passwd.txt。 passwd.txt文件与rsyncd.password文件的内容一模一样即可。如下: 然后使用如下的同步命令进行同步即可: rsync -avz /cygdrive/e/soft apache@192.168.199.245::www –password-file=/cygdrive/e/rsyncd.password < E:\passwd.txt 注意:windows系统与windows系统之间目前还不能实现文件的实时同步,我们还只能通过任务计划来实现定时的同步任务。
上篇文章我们介绍了如何使用rsync同步文件,这篇文章我们再来介绍下,如何把rsync与inotify集成实现数据的实时同步。 要达到这个目的,我们需要分以下几个步骤: 1、rsync的优点与不足 2、inotify是什么 3、检测OS是否支持inotify 4、inotify相关参数详解 5、inotify监控的文件事件类似 6、inotify-tools是什么 7、安装inotify-tools 8、inotifywait使用详解 9、inotifywatch使用详解 10、inotif-tools与rsync集成 一、rsync的优点与不足 rsync在Linux/Unix下是一个比较重要和实用的服务,大家应该已经知道rsync具有安全性高、备份迅速、支持增量备份等优点。 通过rsync可以解决对实时性要求不高的数据备份需求,例如:定期备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。 随着应用系统规模的不断扩大,对数据安全性和可靠性也提出了更高的要求,rsync在高端业务系统中也逐渐暴露出它的不足。 首先,rsync在进行同步数据时,需要先扫描所有文件后进行比对,然后再进行差量传输。如果文件数量达到百万甚至千万级,扫描所以文件将是非常耗时的。而且发生变化的往往是其中很少的一部分文件,这是非常低效的方式。 其次,rsync不能实时地去监测、同步数据。虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作之间一定会有时间差。这样就可能会导致服务端和客户端数据出现不一致的情况,无法在应用出现故障时完全恢复数据。 基于以上原因,所以就考虑采用rsync与inotify集成的方式来解决这些问题。 二、inotify是什么 inotify是一种强大的、细粒度的、异步的文件系统事件监控机制。 Linux内核从2.6.13(2005年8月)起,加入了对inotify的支持,通过inotify可以监控文件系统中的添加、删除、修改、移动等各种细微事件。利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样一个第三方软件。 在上面章节中,我们讲到,rsync可以实现触发式的文件同步。它是通过crontab守护进程方式触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变化时,就触发rsync同步,这就刚好解决了数据同步实时性的问题。 三、检测OS是否支持inotify 由于inotify特性需要Linux内核的支持,所以在安装inotify-tools之前要先确认Linux系统内核是否达到2.6.13以上。如果Linux内核低于2.6.23版本,就需要重新编译内核加入对inotify的支持,也可以用如下的方法来判断Linux内核是否支持inotify。 注意:目前本篇文章的OS为centos 6.5 64bit。 cat /etc/system-release uname -r ls -lsart /proc/sys/fs/inotify/ 只要执行ls -lsart /proc/sys/fs/inotify/命令,如下结果有max_user_watches、max_user_instances、max_queued_events这三个文件,说明centos 6.5 64bit是支持inotify的。 通过上图,我们可以很明显的看到centos 6.5 64bit是支持inotify的。 四、inotify相关参数详解 inotify定义了三个接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求实时的调节其大小。下面分别做简单介绍: /proc/sys/fs/inotify/max_queued_evnets 表示请求events数的最大值,超出这个值的事件将被丢弃。该值默认为16384。 注意:max_queued_events是inotify管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大。 如果你在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用。 /proc/sys/fs/inotify/max_user_instances 表示每个user可创建的instances数量上限。该值默认为128。 /proc/sys/fs/inotify/max_user_watches 表示可监控目录的最大数。该值默认为8192。 要修改以上默认值,我们可以使用以下类似手段修改。如下: echo 30000000>/proc/sys/fs/inotify/max_user_watches 五、inotify监控的文件事件类型 inotify可监控的文件系统事件类型,如下: IN_ACCESS:文件被访问。 IN_MODIFY:文件被write。 IN_ATTRIB:文件属性被修改,如chmod、chown等。 IN_CLOSE_WRITE:可写文件被close。 IN_CLOSE_NOWRITE:不可写文件被close。 IN_OPEN:文件被open。 IN_MOVED_FROM:文件被移出被监控目录,如mv。 IN_MOVED_TO:文件被移入被监控目录,如mv、cp。 IN_CREATE:文件/文件夹被创建。 IN_DELETE:文件/文件夹被删除,如rm。 IN_DELETE_SELF:自删除,即一个可执行文件在执行时删除自己。 IN_MOVE_SELF:自移动,即一个可执行文件在执行时移动自己。 IN_UNMOUNT:宿主文件系统被umount。 IN_CLOSE:文件被关闭,等同于(IN_CLOSE_WRITE|IN_CLOSE_NOWRITE)。 IN_MOVE:文件被移动,等同于(IN_MOVED_FROM|IN_MOVED_TO)。 注意:上面所说的文件也包括目录。 六、inotify-tools是什么 inotify仅仅是一个API,需要通过开发应用程序进行调用。inotify-tools就是这样的一个inotify软件,它是一套组件,包括一个C库和几个命令行工具。这些命令行工具可用于通过命令行或脚本对某些文件系统的事件进行监控。 inotify是为替代dnotify而设计的,它克服了dnotify的缺陷,提供了更好用的,更简洁而强大的文件变化通知机制。 1)inotify不需要对被监视的目标打开文件描述符,而且如果被监视目标在可移动介质上,那么在umount该介质上的文件系统后,被监视目标对应的watch将被自动删除,并且会产生一个umount事件。 2)inotify既可以监视文件,又可以监视目录。 3)inotify使用系统调用而非SIGIO信号来通知文件系统事件。 4)inotify使用文件描述符作为接口,因而可以使用通常的文件I/O操作select和poll来监视文件系统的变化。 七、安装inotify-tools inotify-tools的安装可以分为源码方式和RPM方式。下面就这两种方式一一讲解。 注意:inotify-tools主要是通过inotifywait和inotifywatch,这两个命令进行工作。特别是inotifywait命令,是我们生产环境中使用最多的命令。 7.1 源码方式安装 源码方式安装inotify-tools,我们可以去inotify-tools官网去下载源码包。 inotify-tools官网: https://github.com/rvoicilas/inotify-tools/wiki 下载inotify-tools并安装,如下: 注意:不建议使用wget下载inotify-tools,因为我在使用wget下载inotify-tools一直不成功,后来查询相关资料发现是github网站的原因。 wget https://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz 我们可以先通过浏览器下载本地,然后通过rz命令上传到服务器。 要使用rz命令,我们需要安装lrzsz软件,如下: yum -y install lrzsz lrzsz安装完毕后,我们来上传inotify-tools软件包。如下: 现在开始解压、安装inotify-tools,如下: tar -xf inotify-tools-3.14.tar.gz ./configure make&&make install 安装完毕后,我们切换到/usr/local/bin/目录下查看,如下: cd /usr/local/bin/ 通过上图,我们可以看到inotifywait和inotifywatch命令已经被安装到/usr/local/bin/目录下。 7.2 RPM方式安装 要RPM方式安装inotify-tools,我们首先要配置yum源,否则系统会提示找不到inotify-tools这软件包。如下: 我们可以去下面这个连接下载最新的yum源,如下: http://dl.fedoraproject.org/pub/epel/6/x86_64/ 下载epel-release-6-8.noarch.rpm软件包并安装,如下: wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -ivh epel-release-6-8.noarch.rpm 以上操作完毕后,我们再来yum安装inotify-tools,如下: yum –y install inotify-tools 查看inotify-tools安装的生成的文件,如下: rpm -ql inotify-tools 通过上图,我们可以很容易的看到inotifywait和inotifywatch已经被安装到了/usr/bin/目录下。 以上就是有关inotify-tools的安装。 八、inotifywait使用详解 inotify-tools命令中,我们使用最多的就是inotifywait命令。 inotifywait是一个监控等待事件,它主要用于监控文件或目录的变化,并且可以递归地监控整个目录树。 8.1 inotifywait命令详解 有关inotifywait的使用方法,我们可以通过它的帮助信息查看。如下: inotifywait -h 通过上图,我们可以看到inotifywait参数很多。下面我们就介绍下一些经常使用的参数: -m表示始终保持事件监听状态。 -r表示递归查询目录。 -q表示打印出监控事件。 -e通过此参数可以指定要监控的事件。可监听的事件,如下: access:访问,读取文件。 modify:修改,文件内容被修改。 attrib:属性,文件元数据被修改。 move:移动,对文件进行移动操作。以及重命名,对文件进行重命名。 create:创建,生成新文件 open:打开,对文件进行打开操作。 close:关闭,对文件进行关闭操作。 delete:删除,文件被删除。 –timefmt是指定时间的输出格式,用于–format选项中的%T格式。 –format指定文件变化的详细信息输出格式。格式参数如下: %w表示发生事件的目录 %f表示发生事件的文件 %e表示发生的事件 %T使用由–timefmt定义的时间格式 %Xe事件以“X”分隔 8.2 inotifywait命令实例 8.1章节我们讲解了inotifywait命令的参数,下面我们来实际使用下inotifywait命令。 我们要监测/home目录下所有文件及目录的变化情况,命令如下: inotifywait -mrq –timefmt ‘%y/%m/%d/%H:%M’ –format ‘%T %w %f %e’ -e modify,delete,create,attrib,move,open,close,access /home/ 这条命令表示对/home目录下所有文件及目录的操作进行监控。 现在我们打开另外一个窗口对/home目录进行操作,如下: 我们是在/home目录下创建一个空的文件createfile以及一个新的目录createmkdir。 现在我们来切换到刚刚执行inotifywait命令的窗口,如下: 通过上图,我们可以很容易的看到inotifywait已经监控到我们前面创建的文件以及目录。 九、inotifywatch使用详解 除了inotifywatit命令之外,inotify-tools还有一个命令inotifywatch。 inotifywatch主要用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。 9.1 inotifywatch命令详解 inotifywatch使用可以查看其帮助信息,如下: inotifywatch -h inotifywatch参数说明如下: -h:输出帮助信息。 -v:输出详细信息。 @:排除不需要监视的文件,可以是相对路径,也可以是绝对路径。 –-fromfile:从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。 -z:输出表格的行和列,即使元素为空。 –-exclude:正则匹配需要排除的文件,大小写敏感。 –-excludei:正则匹配需要排除的文件,忽略大小写。 -r:监视一个目录下的所有子目录。 -t:设置超时时间。 -e:只监听指定的事件。该事件与inotifywait监听的事件类型一样。 -a:以指定事件升序排列。 -d:以指定事件降序排列。 9.2 inotifywatch命令实例 9.1章节我们讲解了inotifywatch命令的参数,下面我们来实际使用下inotifywatch命令。 要求统计60秒内/home目录下文件系统的事件,使用如下命令: inotifywatch -v -e modify,delete,create,attrib,move,open,close,access -e modify -t 60 -r /home 现在我们打开另外一个窗口对/home目录进行操作,如下: 我们是在/home目录下删除一个文件createfile以及重命名createmkdir为test。 现在我们来切换到刚刚执行inotifywatch命令的窗口,如下: 通过上图,我们可以很容易的看到inotifywatch已经监控到我们前面删除的文件和重命名的目录文件事件数量。 十、inotify-tools与rsync集成 inotify-tools与rsync的集成主要是通过inotifywait命令与rsync命令集成来实现的,并且该集成主要是体现的rsync客户端,而rsync服务器端正需要按照正常的配置进行即可。 注意:该集成的主要目的是把rsync客户端需要备份的文件实时推送到rsync服务器上。 有关rsync的配置,可以参考《烂泥:linux文件同步之rsync学习(一)》这篇文章,而且本次实验的环境和这篇文章是同一个环境。 rsync服务器是192.168.199.247,rsync客户端为192.168.199.248。 我们现在的要求是只要rsync客户端的/home/www目录下有任何文件或者目录有改动的情况,都要实时的同步到rsync服务器上。 rsync服务器已经正常运行,相关配置文件如下: 下面我们的所有操作都是在rsync客户端上进行的,其实inotifywait命令与rsync命令集成,我们所要做的只是写一个shell脚本即可。脚本内容如下: #!/bin/bash src=/root/www/ dest=www ip=192.168.199.247 /usr/bin/inotifywait -mrq –timefmt ‘%d/%m/%y%H:%M’ –format ‘%T %w %f’ -e modify,delete,create,attrib $src | while read DATE TIME DIR FILE; do filechange=${DIR}${FILE} /usr/bin/rsync -avz –delete –progress $src apache@$ip::$dest –password-file=/etc/rsyncd.password & echo "At ${TIME} on ${DATE}, file $filechange was backed up via rsynce" >>/tmp/rsync.log 2>&1 done 在这个脚本中,我只讲解while read DATE TIME DIR FILE这条语句,其他语句请自行查看相关文档。 inotifywait命令产生三个返回值,分别是“日期,时间,文件”这3个返回值会做为参数传给read,因此脚本中的“while read D E F”写法细化了返回值。 该脚本的原理是利用inotifywait命令对指定的文件和目录进行监控,如果指定文件和目录有改变那么就启动rsync同步命令。 上述脚本写好后,我们要给予其执行权限,然后配置其开机后台运行,并启动。使用如下命令: chmod 700 inotify.sh chmod u+x inotify.sh ll |grep inotify.sh echo "sh /root/inotify.sh > /dev/null &" >>/etc/rc.local sh inotify.sh > /dev/null & 注意:为了让该脚本启动后台运行,一定要把启动命令写成图中的形式,否则该脚本在进行同步文件时会报如下的信息: 以上配置完毕后,我们来测试看看其效果。在rsync客户端上新建一个文件ilanni.txt,如下: touch www/ilanni.txt 现在切换rsync服务器上查看刚刚在rsync客户端上创建的文件是否已经同步过来。 通过上图,我们可以很明显的看到文件已经同步过来。 再来rsync客户端查看相关的日志,如下: 可以看到日志中记录同步的时间已经同步的文件。 到此inotify-tools与rsync的集成已经全部配置完毕。
对于rsync服务器来说,最重要和复杂的就是它的配置了。rsync服务器的配置文件为/etc/rsyncd.conf,其控制认证、访问、日志记录等等。 注意:rsync在安装完毕后,不想mysql、nginx、apache那样会给你一个,该配置文件的模版。 该文件只能通过手工创建,不过在rsync的官网给出一个该配置文件的模版。如下: http://rsync.samba.org/ftp/rsync/rsyncd.conf.html 该文件是由一个或多个模块结构组成。一个模块定义是以方括弧中的模块名开始,直到下一个模块定义开始或者文件结束。 模块中包含格式为name = value的参数定义。每个模块其实就对应需要备份的一个目录树,比方说在我们的实际环境中,有三个目录树需要备份:/www/、/home/web_user1/和/home/web_user2/,那么就需要在配置文件中定义三个模块,分别对应三个目录树。 配置文件是行为单位的,也就是说每个新行都表示一个新的注释、模块定义或者参数赋值。以#开始的行表示注释,以""结束的行表示下面一行是该行的继续。参数赋值中等号后可能是一个大小写不敏感的字符串、一个以trure/false或者yes/no表示的布尔值。 全局参数 在文件中[modlue]之前的所有参数都是全局参数,当然也可以在全局参数部分定义模块参数,这时候该参数的值就是所有模块的默认值。 motd file "motd file"参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有motd文件的。该文件有无都不影响rsync的正常使用。 log file "log file"指定rsync的日志文件,而不将日志发送给syslog。 pid file 指定rsync的pid文件。 syslog facility 指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。 模块参数 在全局参数之后就需要定义一个或多个模块了,模块中可以定义以下参数: comment 给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。 path 指定该模块的供备份的目录树路径,该参数是必须指定的。 use chroot 如果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要root权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true。 max connections 指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。 lock file 指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock。 read only 该选项设定是否允许客户上载文件。如果为true那么任何上载请求都会失败,如果为false并且服务器目录读写权限允许那么上载是允许的。默认值为true。 list 该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true。 uid 该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是"nobody"。 gid 该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为"nobody"。 exclude 用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用–exclude来指定模式,不过配置文件中指定的exclude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exclude选项,但是可以在模式前面使用"-"和"+"来指定是exclude还是include。 但是需要注意的一点是该选项有一定的安全性问题,客户很有可能绕过exclude列表,如果希望确保特定的文件不能被访问,那就最好结合uid/gid选项一起使用。 exclude from 指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exclude列表定义。 include 用来指定多个由空格隔开的多个rsync并应该exlude的模式列表。这等同于在客户端命令中使用–include来指定模式,结合include和exclude可以定义复杂的exclude/include规则 。一个模块只能指定一个include选项,但是可以在模式前面使用"-"和"+"来指定是exclude还是include。 include from 指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。 auth users 该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份,这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。 secrets file 该选项指定一个包含定义用户名:密码对的文件。只有在"auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,需要限式指定一个。(例如:/etc/rsyncd.secrets) strict modes 该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true。 hosts allow 该选项指定哪些IP的客户允许连接该模块。客户模式定义可以是以下形式: xxx.xxx.xxx.xxx,客户主机只有完全匹配该IP才允许访问。例如:192.167.0.1 a.b.c.d/n,属于该网络的客户都允许连接该模块。例如:192.168.0.0/24 a.b.c.d/e.f.g.h,属于该网络的客户都允许连接该模块。例如:192.168.0.0/255.255.255.0 一个主机名,客户主机只有拥有该主机名才允许访问,例如:backup.linuxaid.com.cn。 *.linuxaid.com.cn,所有属于该域的主机都允许。 默认是允许所有主机连接。 hosts deny 指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。 ignore errors 指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IP错误,一般来说rsync在出现IO错误时将将跳过–delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题。 ignore nonreadable 指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。 transfer logging 使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。 log format 通过该选项用户在使用transfer logging可以自己定制日志文件的字段。其格式是一个包含格式定义符的字符串,可以使用的格式定义符如下所示: %h 远程主机名 %a 远程IP地址 %l 文件长度字符数 %p 该次rsync会话的进程id %o 操作类型:"send"或"recv" %f 文件名 %P 模块路径 %m 模块名 %t 当前时间 %u 认证的用户名(匿名时是null) %b 实际传输的字节数 %c 当发送文件时,该字段记录该文件的校验码 默认log格式为:"%o %h [%a] %m (%u) %f %l",一般来说,在每行的头上会添加"%t [%p] "。在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。 timeout 通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。 refuse options 通过该选项可以定义一些不允许客户对该模块使用的命令参数列表。这里必须使用命令全名,而不能是简称。但发生拒绝某个命令的情况时服务器将报告错误信息然后退出。如果要防止使用压缩,应该是:"dont compress = *"。 dont compress 用来指定那些不进行压缩处理再传输的文件,默认值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz。
这几天刚好有空就打算开始学习linux下的文件同步软件rsync,在学习rsync时,我们可以分以下几个步骤进行: 1、 rsync是什么 2、 rsync的工作原理 3、 rsync优点 4、 rsync认证方式 5、 安装rsync 6、 rsync命令参数详解 7、 配置rsync 8、 rsync的启动与关闭 9、 rsync同步实例 说明:rsync服务器与客户端使用的OS均为:centos 6.5 64bit。 一、rsync是什么 在开始正式学习rsync之前,我们先来回答这个问题:rsync是什么。 rsync(remote synchronize)是Liunx/Unix下的一个远程数据同步工具。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。 rsync算法并不是每一次都整份传输,而是只传输两个文件的不同部分,因此其传输速度相当快。 除此之外,rsync可拷贝、显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。 二、rsync的工作原理 1、客户端构造FileList,FileList包含了需要与服务器同步的所有文件信息对name->id(id用来唯一表示文件例如MD5)。 2、客户端将FileList发送到服务器。 3、服务器上rsync处理客户端发过来的FileList,构建新的NewFileList。其中根据MD5值比较,删除服务器上已经存在的文件信息对,只保留服务器上不存在或变化的文件。 4、客户端得到服务器发送过来的NewFileList,然后把NewFileList中的文件重新传输到服务器。 三、rsync优点 rsync有以下几个优点: 1)可以镜像保存整个目录树和文件系统。 2)可以很容易做到保持原来文件的权限、时间、软硬连接等。 3)无需特殊权限即可安装。 4)拥有优化的流程和比较高的文件传输效率。 5)可以使用shell(rsh、ssh)方式来传输文件。 6)支持匿名运行。 7)与scp相比,rsync传输速度绝对远远超过scp的传输速度。 我们在局域网中经常用rsync和scp传输大量mysql数据库文件,发现rsync传输文件速度至少要比scp快20倍以上。 所以如果需要在Liunx/Unix服务器之间互传海量数据时,建议选择rsync进行传输。 四、rsync认证方式 rsync有两种常用的认证方式,一种是rsync-daemon方式,另外一种是ssh方式。在平时使用过程,我们使用最多的是rsync-daemon方式。 注意:在使用rsync时,服务器和客户端都必须安装rsync程序。 4.1 rsync-daemon认证 rsync在rsync-daemon认证方式下,默认监听TCP的873端口。 rsync-daemon认证方式是rsync的主要认证方式,这个也是我们经常使用的认证方式。并且也只有在此种模式下,rsync才可以把密码写入到一个文件中。 注意:rsync-daemon认证方式,需要服务器和客户端都安装rsync服务,并且只需要rsync服务器端启动rsync,同时配置rsync配置文件。客户端启动不启动rsync服务,都不影响同步的正常进行。 4.2 ssh认证 rsync在ssh认证方式下,可通过系统用户进行认证,即在rsync上通过ssh隧道进行传输,类似于scp工具。此时同步操作不在局限于rsync中定义的同步文件夹。 注意:ssh认证方式,不需要服务器和客户端配置rsync配置文件,只需要双方都安装rsync服务,并且也不需要双方启动rsync。 若rsync服务端SSH为标准端口,此时rsync使用方式如下: rsync -avz /root/test root@192.168.199.248:/root/ 若rsync服务端SSH为非标准端口,可通过rsync的-e参数进行端口指定。使用方式如下: rsync -avz /root/test -e ‘ssh -p1234’ root@192.168.199.248:/root/ 五、安装rsync 安装rsync,我们可以分为两种方式:源码方式安装和RPM方式安装。 注意:rsync软件无论是服务器端还是客户端都是同一个软件包。 下面我们就一一讲解,这两种方式的安装方法。 5.1 源码方式安装 源码方式安装rsync,我们需要到其官网下载对应的安装包。rsync官网:rsync.samba.org。如下: 我们使用wget进行下载,如下: wget http://rsync.samba.org/ftp/rsync/rsync-3.1.1.tar.gz 安装包下载完毕后,我们开始解压并安装。如下: tar -xf rsync-3.1.1.tar.gz ./configure make &&make install 注意:源码安装rsync时,其编译时所需要的gcc库文件尽量提前安装完毕。 rsync源码安装会把rsync默认安装到/usr/local/目录下,我们可以通过相关帮助进行查看到。如下: ./configure –help rsync安装完毕后,我们可以查看rsync的使用帮助。我们此时需要切换到/usr/local/bin目录下,如下: /usr/local/bin rsync -h 源码方式安装的rsync,要使其开机启动的话。我们可以直接把启动命令放入到rc.local文件中。如下: echo “/usr/local/bin/rsync –daemon –config=/etc/rsyncd.conf”>>/etc/rc.local 也可以写成: echo “/usr/local/bin/rsync –daemon”>>/etc/rc.local cat /etc/rc.local 5.2 RPM方式安装 RPM方式安装rsync比较简单,直接使用yum进行安装即可。如下: yum -y install rsync 查看rsync安装的位置,如下: rpm -ql rsync-3.0.6-12.el6.x86_64 通过上图可以看到RPM方式安装的rsync是把rsync安装到/usr/bin目录下的,并且还生成一个/etc/xinetd.d/rsync文件。 查看安装时产生的帮助文档,如下: more /usr/share/doc/rsync-3.0.6/README 安装结束后,我们可以查看下rsync命令所在的目录以及rsync的帮助。如下: which rsync rsync –-help 通过上图可以很明显的看到rsync确实被安装到了/usr/bin目录下。 RPM方式安装的rsync,要使其开机启动的话,我们也可以让其与源码方式安装的一样进行开机启动。 除此之外还有一种方法,可以使其开机启动。如果你注意观察的话,会发现rsync在安装时生成的/etc/xinetd.d/rsync文件。 在centos下rsync默认以xinetd方式运行rsync服务。所以RPM方式安装的话rsync,我们只需启动xinet服务即可。 但是在启动xinetd服务之前,我们还需要配置文件/etc/xinetd.d/rsync,如下: vi /etc/xinetd.d/rsync service rsync{disable = noflags = IPv6socket_type = streamwait = nouser = rootserver = /usr/bin/rsyncserver_args = –daemon –config=/etc/rsyncd.conflog_on_failure += USERID} 配置完毕后,我们还需要安装xinetd软件包,否则无法启动xinetd服务。如下: yum -y install xinetd /etc/init.d/xinetd start chkconfig xinetd on netstat -tunlp |grep 873 六、rsync命令参数详解 rsync安装完毕后,我们来查看下rsync命令的帮助,如下: rsync –help 6.1 rsync几个重要参数 我们先在此大致介绍下经常使用的几个参数:-v,-a,-z,有关这些参数的具体说明详见这篇文章《烂泥:【转】rsync命令参数详解》。 -v, –verbose详细模式输出。 -a, –archive归档模式,表示以递归方式传输文件,并保持所有文件属性不变。 -z, –compress对备份的文件在传输时进行压缩处理。 –delete:删除那些DST中存在而在SRC中没有的文件。 6.2 rsync六种工作模式 除此上述几个参数之外,我们还注意到上图中rsync的七个命令格式:如下: 1)rsync [OPTION]… SRC [SRC]… DEST 2)rsync [OPTION]… SRC [SRC]… [USER@]HOST:DEST 3)rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST 4)rsync [OPTION]… SRC [SRC]… rsync://[USER@]HOST[:PORT]/DEST 5)rsync [OPTION]… [USER@]HOST:SRC [DEST] 6)rsync [OPTION]… [USER@]HOST::SRC [DEST] 7)rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST] 这七个命令格式就是代表rsync六种不同的工作模式,其中第四种和第七种模式没有多大的区别。在这几种模式中第三种和第六种模式是我们经常使用的,特别是第三种模式。 这六种模式总体上可以用两个词进行区分:推送、拉取。 推送就是在客户端上执行rsync命令,目的是把客户端需要同步的文件推送到服务器上。 拉取也是在客户端上执行rsync命令,目的是把服务器上的文件拉取到本地。 注意:无论是推送和拉取,rsync命令都是在客户端执行,只是命令的格式不同而已。 1) rsync [OPTION]… SRC [SRC]… DEST 同步本地文件,从一个目录同步到另外一个目录。如:rsync -avz /data /backup,表示把本地/data目录下的文件同步到本地/backup目录下。 2) rsync [OPTION]… SRC [SRC]… [USER@]HOST:DEST 使用一个远程shell程序(如rsh、ssh)来实现把本地的文件同步到远程机器上。此种方式属于推送方式。如:rsync -avz /data test@192.168.199.247:/backup,表示把本地/data目录下的文件同步到服务器192.168.199.247的/backup目录下。 3) rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST 把本地的文件同步到远程服务器上,其中DEST表示的是rsync服务器的认证模块名。此种方式属于推送方式。如:rsync -avz /data test@192.168.199.247::backup –password-file=/etc/rsyncd.password,表示把本地/data目录下的文件同步到服务器192.168.199.247的backup模块下path路径下。 4) rsync [OPTION]… SRC [SRC]… rsync://[USER@]HOST[:PORT]/DEST 列出远程机器的文件列表。这类似于ls命令,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://test@192.168.199.247/backup,表示在本机列出服务器192.168.199.247的/backup目录下的内容,如下: 5) rsync [OPTION]… [USER@]HOST:SRC [DEST] 把远程机器的文件同步到本地,此种方式属于拉取方式。如:rsync -avz test@192.168.199.247:/backup /data,表示把192.168.199.247的/backup目录下文件同步到本地/data目录下。 6) rsync [OPTION]… [USER@]HOST::SRC [DEST] 把远程机器的文件同步到本地,此种方式属于拉取方式。如:rsync -avz test@192.168.199.247::backup –password-file=/etc/rsyncd.password /data,表示把192.168.199.247的backup模块path路径下的文件同步到本地/data目录下。 七、配置rsync rsync安装完毕后,我们就需要配置rsync。而对于rsync服务器来说,最重要和最复杂的就是它的配置了。 rsync的配置分为服务器端和客户端,下面我们分开一一讲解。 7.1 rsync服务器端配置 rsync服务器端需要两个配置文件:rsyncd.conf、rsyncd.password。 其中rsyncd.conf默认存放在/etc/目录下,同时它也是rsync服务器的主配置文件。该文件配置了rsync服务器的控制认证、访问、日志记录等等。而rsyncd.password主要用于存储rsync用户名和密码。 但是在rsync安装完毕后后是不会生成以上这两个配置文件的,需要我们手工进行创建。 rsyncd.conf配置文件内容如下: cat /etc/rsyncd.conf uid = root gid = root user chroot = no max connections = 200 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/run/rsyncd.log [backup] path = /backup/ ignore errors read only = no list = no hosts allow = 192.168.199.0/255.255.255.0 auth users = test secrets file = /etc/rsyncd.password [www] path = /www/ ignore errors read only = no list = no hosts allow = 192.168.199.0/255.255.255.0 auth users = apache secrets file = /etc/rsyncd.password 有关rsync配置文件的详细讲解,看下篇文章《烂泥:rsync配置文件详解》。 rsync默认是在nobody用户下运行的,但是我们为了以后同步时不为各种权限的事情烦恼,就让其在root用户下运行。 配置文件创建完毕后,我们来创建密码文件。如下: echo “test:test”>>/etc/rsyncd.password echo “apache:apache”>>/etc/rsyncd.password cat /etc/rsyncd.password 注意:该密码文件中的用户和密码可以进行自定义,同时该用户不一定要在服务器中的系统用户存在。 密码文件创建完毕后,要把其权限要设置为600,否则会在以后同步时提示验证出错。如下: chmod 600 /etc/rsyncd.password 一个rsync配置文件中可以包含多个认证模块,同时一个密码文件中也可以存放多个用户和其对应的密码。其中每一个认证模块可以对应不同的客户端。 以上两个文件创建完毕后,我们来创建其对应的目录并授权,如下: mkdir /{backup,www} chown root:root –R /backup/ chown root:root –R /www/ 以上就是rsync服务器端的配置。 7.2 rsync客户端配置 rsync客户端配置与服务器端相比差别还是比较大的。 在客户端安装完毕rsync服务后,是不需要启动rsync服务的。我们只需要在客户端创建连接rsync服务器时,验证码用户所需要的密码文件即可。 该密码文件中的密码要与rsync服务器上的密码文件中的密码对应,并且也要与rsync服务器rsyncd.conf配置文件中的认证模块中的用户匹配。 当然该密码文件不创建也是可以的,不创建的话。我们在执行rsync操作时,就需要输入rsync的对应用户的密码。如下: echo “apache”>>/etc/rsyncd.password chmod 600 /etc/rsyncd.password 注意:该密码文件中只能存放一个用户的密码,并且该文件与rsync服务器端的密码文件一样也需要把其权限设置为600。 以上就是rsync客户端的配置。 八、rsync的启动与关闭 rsync服务器端与客户端都配置完毕后,我们就可以来启动rsync服务器,并且也可以关闭rsync服务。 8.1 启动rsync服务 在前面我们讲过rsync-daemon认证方式,需要服务器和客户端都安装rsync服务,并且只需要rsync服务器端启动rsync,同时配置rsync配置文件,客户端启动不启动rsync服务。 在此我们只讲解rsync-daemon认证方式的启动。有关rsync使用ssh方式认证,我们就不在此讲解了,如果有想了解的童鞋,可以看看6.2章节的rsync六种工作模式。 如果是源码方式安装的rsync,我们可以使用rsync –daemon来启动rsync。如下: echo PATH=$PATH:/usr/local/bin/>>/etc/profile source /etc/profile rsync –daemon ps aux |grep rsync netstat -tunlp |grep 873 注意:上述命令行中,只有rsync –daemon才是启动rsync的命令。并且该命令启动时,会默认加载/etc/rsyncd.conf文件。 所以如果rsync的配置文件不在/etc目录下或者rsync配置文件名不为rsyncd.conf,那么我们在启动rsync服务时,就要手工加上该配置文件的完整路径。方法如下: rsync –daemon –config=/etc/rsyncd.conf 有关如何加载该配置文件,我们可以通过rsync –daemon –help进行查看。如下: rsync –daemon –help 如果是RPM方式安装的rsync,我们在5.2章节RPM方式安装rsync中已经讲解过了,可以通过启动xinetd服务来启动rsync。如下: /etc/init.d/xinetd start 以上就是rsync服务的启动,下面我们开始介绍如何关闭rsync服务。 8.2 关闭rsync服务 要关闭rsync服务,如果是源码方式安装的,我们可以直接通过pkill rsync命令进行关闭。如下: pkill rsync 如果是通过yum方式进行安装的,我们可以通过关闭xinetd服务来达到关闭rsync服务的目的。如下: /etc/init.d/xinetd stop 除了以上两种方法之外,我们还可以通过比较暴力的方法关闭rsync服务。如下: kill -9 6780 九、rsync同步实例 rsync服务正常启动后,我们就要切换到客户端来实际同步一个文件。 现在rsync服务器是192.168.199.247,rsync客户端为192.168.199.248。 首先在rsync服务器192.168.199.247的www模块下/www/目录下新建一个文件ilanni247,内容如下: ifconfig eth1|grep “inet addr”|awk ‘{print $2}’|cut -d: -f2 vi /www/ilanni247 this is server 247 www. 然后在rsync客户端192.168.199.248的/root下新建一个www目录,并在此目录下创建一个文件ilanni248,内容如下: ifconfig eth1|grep “inet addr”|awk ‘{print $2}’|cut -d: -f2 mkdir www vi /www/ilanni248 this is client 248 www. 9.1 把248文件推送到247上 要把rsync客户端192.168.199.248文件推送到rsync服务器192.168.199.247上,我们需要使用到rsync帮助命令中的第三种命令,如下: rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST 有关这个命令的作用,我们在前面已经介绍过了,就是把本地的文件同步到远程服务器上。 具体使用方法,如下: rsync -avz /root/www/* apache@192.168.199.247::www –password-file=/etc/rsyncd.password 这条命令的作用是把/root/www目录下的所有文件同步到192.168.199.247服务器的www模块下。 如果要把/root/www/ilannidir目录本身同步到192.168.199.247服务器的www模块下的话,命令如下: rsync -azv /root/www/ilannidir apache@192.168.199.247::www –password-file=/etc/rsyncd.password 或者: rsync -azv /root/www/ilannidir apache@192.168.199.247::www –password-file=/etc/rsyncd.password 通过上图,我们可以看到本地确实已经把文件与目录同步到rsync服务器上了。 9.2 把247文件拉取到248上 要把rsync服务器192.168.199.247的文件拉取到rsync客户端192.168.199.248上,我们需要使用到rsync帮助命令中的第六个命令,如下: rsync [OPTION]… [USER@]HOST::SRC [DEST] 有关这个命令的作用,我们在前面已经介绍过了,就是把远程机器的文件同步到本地。 具体使用方法,如下: rsync -avz apache@192.168.199.247::www –password-file=/etc/rsyncd.password /root/www/ 这条命令的作用是把192.168.199.247服务器的www模块下所有文件同步到本机的/root/www/目录下。
打算开始学习有关监控方面的知识,但是现在很多监控系统都是根据SNMP进行的。而SNMP监控的性能指标很多都是通过snmpwalk采集设备的OID信息得到的,所以今天就来先介绍下,如何通过snmpwalk来采集设备的OID信息。 要使用snmpwalk采集设备的OID信息,需要以下几个步骤: 1、 理解snmpwalk的原理 2、 安装snmpwalk 3、 snmpwalk参数说明 4、 snmpwalk的使用方法 5、 使用snmpwalk采集设备OID信息 6、 生产环境中设备OID信息注意事项 一、理解snmpwalk的原理 snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户。通过snmpwalk也可以查看支持SNMP协议(可网管)的设备的一些其他信息,比如cisco交换机或路由器IP地址、内存使用率等,也可用来协助开发SNMP功能。 二、安装snmpwalk 要使用snmpwalk,我们首先要安装snmpwalk。snmpwalk没有单独的安装包,它被包含在net-snmp软件包中的,所以我们只需要安装net-snmp软件包就可以得到snmpwalk。而net-snmp的安装又分为linux环境和windows环境,下面我们来一一进行介绍。 2.1 linux下安装net-snmp 在linux下使用snmpwalk工具,我们必须要安装net-snmp-utils这个软件包。 注意:如果linux只安装net-snmp的话,则不包含snmpwalk工具,如下: yum -y install net-snmp-utils snmpwalk -h 2.2 windows安装下net-snmp windows下安装net-snmp,我们可以去net-snmp官网进行下载。 现在我们安装的是net-snmp-5.6.1.1-1.x86.exe这个软件包。如下: 以上是一种方法,还有另外一种方法就是直接使用,已经制作好的免安装包。 免安装包的制作很简单,就是先在本地安装net-snmp软件包,然后把安装目录下的bin目录复制到其他服务器就可以正常了。如下: 这样就可以把bin目录,复制到其他机器上使用。注意在使用的过程中为了更方便的使用snmpwalk工具,我们可以把该目录所在的路径加入系统的环境变量中,如下: 这样我们就把net-snmp安装完毕。关于snmpwalk免安装包可以在这个地址下载《烂泥snmpwalk5.6.1.1免安装包》。 三、snmpwalk参数说明 snmpwalk的用法,我们可以通过帮助信息进行查看,如下: snmpwalk -h 通过上图,我们可以看到snmpwalk的参数比较多,但是我们比较常用的就只有-v和-c参数。如下: –h:显示帮助。 –v:指定snmp的版本, 1或者2c或者3。 –c:指定连接设备SNMP密码。 –V:显示当前snmpwalk命令行版本。 –r:指定重试次数,默认为0次。 –t:指定每次请求的等待超时时间,单为秒,默认为3秒。 –l:指定安全级别:noAuthNoPriv|authNoPriv|authPriv。 –a:验证协议:MD5|SHA。只有-l指定为authNoPriv或authPriv时才需要。 –A:验证字符串。只有-l指定为authNoPriv或authPriv时才需要。 –x:加密协议:DES。只有-l指定为authPriv时才需要。 –X:加密字符串。只有-l指定为authPriv时才需要。 四、snmpwalk的使用方法及实例 snmpwalk使用方法很简单,如下: snmpwalk -v 1或2c(代表SNMP版本) -c SNMP密码 IP地址 OID(对象标示符) –v:指定snmp的版本, 1或者2,该参数必须有。 –c:指定连接设备SNMP读密码,该参数必须有。 IP:指定要walk的设备的IP地址,该参数必须有。 OID:代表要获取设备的指标oid,该参数不是必须的。 五、使用snmpwalk获取设备OID信息 下面我们开始使用snmpwalk开始获取设备的一些OID信息,注意现在获取的都是windows系统,没有涉及到linux系统。 注意:在此我们还使用了iReasoning MIB Browser这个MIB浏览软件以配合我们的实验。 5.1获取windows系统进程数 snmpwalk -v 1 -c public 192.168.1.200 .1.3.6.1.2.1.25.1.6 这条命令的意思是:使用v1版本,共同体为public,来对192.168.1.200的.1.3.6.1.2.1.25.1.6分支进行walk。 5.2获取windows系统用户数 snmpwalk -v 1 -c public 192.168.1.200 .1.3.6.1.2.1.25.1.5 我们也可以通过以下命令获得: snmpwalk -v 1 -c public 192.168.1.200 hrSystemNumUsers 注意:hrSystemNumUsers与.1.3.6.1.2.1.25.1.5是等效的。 5.1和5.2其实我们完全可以通过一条命令获得,如下: snmpwalk -v 1 -c public 192.168.1.200 .1.3.6.1.2.1.25.1 获取的信息中包含系统的运行时间、系统的用户数、系统的进程数、系统当前的时间。 5.3获取windows系统总内存 snmpwalk -v 1 -c public 192.168.1.200 .1.3.6.1.2.1.25.2.2 5.4获取windows系统的IP地址 snmpwalk -v 1 -c public 192.168.1.200 .1.3.6.1.2.1.4.20.1.1 5.5获取windows系统信息 snmpwalk -v 1 -c public 192.168.1.200 system 5.6获取windows系统的网卡信息 snmpwalk -v 1 192.168.1.200 -c public ifDescr 六、生产环境中设备OID信息注意事项 6.1获取的目标与保存说明 针对研发需要设备MIB信息进行调试的情况,一般需要设备的完整MIB(包含公有OID和私有OID),因此在进行设备的MIB获取时,使用使用.1作为目标mib分支(即完整mib文件)。并且一般需要将输出使用>重定向符,输出到一个指定的文件中,以方便传输。 6.2参数选项说明 一般需要使用-Cc,来指定允许OID不重复。 如果设备较容易超时,需要使用-t与-r参数,来指定超时时间与重试次数。 6.3 MIB信息的完整性 完整walk到一个MIB,在MIB末尾,都会输出“End Of Mib”的字样。否则可能为Response timeout等错误,此时请根据错误消息及时调整参数。 一般来说使用snmpwalk -v 1/2c -c community IP .1>IP.mib命令采集设备MIB信息后,文件IP.mib应该包含该设备的所有MIB信息。 但是从实际反应的情况来看,某些设备产商由于SNMP实现支持不是很标准,故存在只能获取到公有MIB信息(即1.3.6.1.2.1开头的信息)的情况,此时请再使用命令snmpwalk -v 1/2c -c community IP .1.3.6.1.4.1>IP.private.mib采集设备私有MIB信息,并和前面采集到的IP.mib一同发给研发。 小结:所谓MIB信息的完整性,即判断snmpwalk命令输出的文件信息中是否包含iso.3.6.1.2.1开头的OID信息(公有MIB信息),又是否包含iso.3.6.1.4.1开头的OID信息(私有MIB信息),甚至还可能包含iso.3.6.1.6.1开头的OID信息(该部分信息可有可无,目前暂时未用到)。
1、 htpasswd的作用与安装 2、 htpasswd命令详解 3、 htpasswd的实例 4、 htpasswd的应用 一、htpasswd的作用与安装 htpasswd是apache的一个工具,该工具主要用于建立和更新存储用户名、密码的文本文件,主要用于对基于http用户的认证。 htpasswd的安装很简单,它是随apache的安装而生成。这点与ab工具是一样的,如果哪位童鞋有不明白的地方可以查看《烂泥:apache性能测试工具ab的应用》这篇文章。 如果apache是通过RPM的yum方式进行安装的话,该命令存放在/usr/bin/目录下,如下: which htpasswd /usr/bin/htpasswd 如果apache是源码方式安装的话,该命令存放在apache安装目录的bin目录下,如下: /usr/local/apache2/bin htpasswd命令用法,我们可以通过htpasswd的帮助进行查看,如下: htpasswd -h 二、htpasswd命令详解 在第一部分中,我们查看了htpasswd的帮助信息。现在我们来讲解下帮助信息中的相关参数。 htpasswd的帮助信息如下: htpasswd -h htpasswd [-cmdpsD] passwordfile username htpasswd -b[cmdpsD] passwordfile username password htpasswd -n[mdps] username htpasswd -nb[mdps] username password htpasswd命令选项参数说明: -c创建一个加密文件。 -n不更新加密文件,只将htpasswd命令加密后的用户名和密码显示在屏幕上。 -m默认htpassswd命令采用MD5算法对密码进行加密,该参数默认情况下可以不加。 -d表示htpassswd命令采用CRYPT算法对密码进行加密。 -s表示htpassswd命令采用SHA算法对密码进行加密。 -p表示htpassswd命令不对密码进行进行加密,即明文密码。 -b表示在htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码。 -D表示删除指定的用户。 三、htpasswd的实例 在第二步中,我们列出了htpasswd的参数说明,现在我们来通过实例,介绍如何使用这些参数。 3.1利用htpasswd命令添加用户 通过htpasswd命令来添加一个用户,我们可以使用-b和-c参数。如下: htpasswd -bc ilannifile ilanniuser 123456 cat ilannifile htpasswd -bc ilannifile ilanniuser 123456 表示在当前目录下生成一个ilannifile密码文件,并新增一个用户名为ilanniuser密码为123456的用户,默认采用MD5加密方式加密。 3.2在原有密码文件中新增用户 在原有的密码文件中新增一个用户,我们可以使用-b参数。如下: htpasswd -b ilannifile ilannitwo 123456 cat ilannifile htpasswd -b ilannifile ilannitwo 123456 表示在ilannifile密码文件中新增一个用户名为ilannitwo,密码为123456的用户。 注意:此时-c参数一定不能添加,否则会覆盖原来的密码文件再创建一个新的密码文件。 3.3不更新密码文件,只显示加密后的用户名和密码 要不更新密码文件,而只显示加密后的用户名和密码,我们可以使用-n参数。如下: htpasswd -n ilannitwo 注意-n参数后面一定要跟密码文件中已经存在的用户。说实话,这个参数没有多大的实际意义。 3.4利用htpasswd命令删除用户名和密码 要删除已经在密码文件存在的用户,我们可以通过-D参数来实现。如下: htpasswd -D ilannifile ilannitwo 3.5利用htpasswd命令修改用户密码 要达到这个目的,我们需要先利用htpasswd命令删除指定用户,然后再利用htpasswd创建用户即可实现修改密码的功能。如下: 四、htpasswd的应用 htpasswd可以与nagios、SVN、nginx、apache等进行集成使用,在此我们就不一一介绍。我们后续会单独介绍htpasswd与以上几个程序的集成使用。
网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环。只有让服务器处在高压情况下,才能真正体现出软件、硬件等各种设置不当所暴露出的问题。 性能测试工具目前最常见的有以下几种:ab、http_load、webbench、siege。今天我们专门来介绍ab。 ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。 下面我们开始介绍有关ab命令的使用: 1、ab的原理 2、ab的安装 3、ab参数说明 4、ab性能指标 5、ab实际使用 6、测试nginx性能 一、ab的原理 ab是apachebench命令的缩写。 ab的原理:ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。 ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似CC攻击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。 二、ab的安装 ab的安装非常简单,如果是源码安装apache的话,那就更简单了。apache安装完毕后ab命令存放在apache安装目录的bin目录下。如下: /usr/local/apache2/bin 如果apache 是通过yum的RPM包方式安装的话,ab命令默认存放在/usr/bin目录下。如下: which ab 注意:如果不想安装apache但是又想使用ab命令的话,我们可以直接安装apache的工具包httpd-tools。如下: yum -y install httpd-tools 查看ab是否安装成功,可以切换到上述目录下,使用ab –V命令进行检测。如下: ab -V 如果ab安装成功,通过ab –V命令则会显示ab的相迎版本,如上图示。 注意以上是在linux平台下进行安装的,如果是windows平台下,我们也可以下载对应的apache版本进行安装。 目前apache最新版2.4.10,apache官网已经没有windows下载的版本。但是我们可以下载apache官网提供的集成软件包,如下: 三、ab参数说明 有关ab命令的使用,我们可以通过帮助命令进行查看。如下: ab –help 下面我们对这些参数,进行相关说明。如下: -n在测试会话中所执行的请求个数。默认时,仅执行一个请求。 -c一次产生的请求个数。默认是一次一个。 -t测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。 -p包含了需要POST的数据的文件。 -P对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。 -T POST数据所使用的Content-type头信息。 -v设置显示信息的详细程度-4或更大值会显示头信息,3或更大值可以显示响应代码(404,200等),2或更大值可以显示警告和其他信息。 -V显示版本号并退出。 -w以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。 -i执行HEAD请求,而不是GET。 -x设置<table>属性的字符串。 -X对请求使用代理服务器。 -y设置<tr>属性的字符串。 -z设置<td>属性的字符串。 -C对请求附加一个Cookie:行。其典型形式是name=value的一个参数对,此参数可以重复。 -H对请求附加额外的头信息。此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对(如,"Accept-Encoding:zip/zop;8bit")。 -A对服务器提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即,是否发送了401认证需求代码),此字符串都会被发送。 -h显示使用方法。 -d不显示"percentage served within XX [ms] table"的消息(为以前的版本提供支持)。 -e产生一个以逗号分隔的(CSV)文件,其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。由于这种格式已经“二进制化”,所以比’gnuplot’格式更有用。 -g把所有测试结果写入一个’gnuplot’或者TSV(以Tab分隔的)文件。此文件可以方便地导入到Gnuplot,IDL,Mathematica,Igor甚至Excel中。其中的第一行为标题。 -i执行HEAD请求,而不是GET。 -k启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能。 -q如果处理的请求数大于150,ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。此-q标记可以抑制这些信息。 四、ab性能指标 在进行性能测试过程中有几个指标比较重要: 1、吞吐率(Requests per second) 服务器并发处理能力的量化描述,单位是reqs/s,指的是在某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。 记住:吞吐率是基于并发用户数的。这句话代表了两个含义: a、吞吐率和并发用户数相关 b、不同的并发用户数下,吞吐率一般是不同的 计算公式:总请求数/处理完成这些请求数所花费的时间,即 Request per second=Complete requests/Time taken for tests 必须要说明的是,这个数值表示当前机器的整体性能,值越大越好。 2、并发连接数(The number of concurrent connections) 并发连接数指的是某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。 3、并发用户数(Concurrency Level) 要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。在HTTP/1.1下,IE7支持两个并发连接,IE8支持6个并发连接,FireFox3支持4个并发连接,所以相应的,我们的并发用户数就得除以这个基数。 4、用户平均请求等待时间(Time per request) 计算公式:处理完成所有请求数所花费的时间/(总请求数/并发用户数),即: Time per request=Time taken for tests/(Complete requests/Concurrency Level) 5、服务器平均请求等待时间(Time per request:across all concurrent requests) 计算公式:处理完成所有请求数所花费的时间/总请求数,即: Time taken for/testsComplete requests 可以看到,它是吞吐率的倒数。 同时,它也等于用户平均请求等待时间/并发用户数,即 Time per request/Concurrency Level 五、ab实际使用 ab的命令参数比较多,我们经常使用的是-c和-n参数。 下面我们就实际进行操作下,首先新建一个虚拟主机a.ilanni.com。如下: cat /etc/httpd/conf/httpd.conf|grep -v ^#|grep -v ^$ mkdir -p /www/a.ilanni.com echo ‘<?php phpinfo();?>’>/www/a.ilanni.com/index.php cat /www/a.ilanni.com/index.php 虚拟主机新建完毕后,我们来启动apache,并访问虚拟主机a.ilanni.com。如下: wget http://a.ilanni.com 虚拟主机a.ilanni.com创建完毕后,我们现在就来测试apache的性能。使用如下命令: ab -c 10 -n 100 http://a.ilanni.com/index.php -c10表示并发用户数为10 -n100表示请求总数为100 http://a.ilanni.com/index.php表示请求的目标URL 这行表示同时处理100个请求并运行10次index.php文件。 通过上图,测试结果也一目了然,apache测试出的吞吐率为:Requests per second: 204.89[#/sec](mean)。 除此之外还有其他一些信息,需要说明下,如下: Server Software表示被测试的Web服务器软件名称。 Server Hostname表示请求的URL主机名。 Server Port表示被测试的Web服务器软件的监听端口。 Document Path表示请求的URL中的根绝对路径,通过该文件的后缀名,我们一般可以了解该请求的类型。 Document Length表示HTTP响应数据的正文长度。 Concurrency Level表示并发用户数,这是我们设置的参数之一。 Time taken for tests表示所有这些请求被处理完成所花费的总时间。 Complete requests表示总请求数量,这是我们设置的参数之一。 Failed requests表示失败的请求数量,这里的失败是指请求在连接服务器、发送数据等环节发生异常,以及无响应后超时的情况。如果接收到的HTTP响应数据的头信息中含有2XX以外的状态码,则会在测试结果中显示另一个名为“Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算在失败的请求中。 Total transferred表示所有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度。注意这里不包括HTTP请求数据的长度,仅仅为web服务器流向用户PC的应用层数据总长度。 HTML transferred表示所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度。 Requests per second吞吐率,计算公式:Complete requests/Time taken for tests Time per request用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)。 Time per requet(across all concurrent request)服务器平均请求等待时间,计算公式:Time taken for tests/Complete requests,正好是吞吐率的倒数。也可以这么统计:Time per request/Concurrency Level。 Transfer rate表示这些请求在单位时间内从服务器获取的数据长度,计算公式:Total trnasferred/ Time taken for tests,这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。 Percentage of requests served within a certain time(ms)这部分数据用于描述每个请求处理时间的分布情况,比如以上测试,80%的请求处理时间都不超过6ms,这个处理时间是指前面的Time per request,即对于单个用户而言,平均每个请求的处理时间。 六、测试nginx性能 第五步测试了apache的性能,现在我们来测试nginx的性能。 首先配置nginx的虚拟主机,如下: cat /usr/local/nginx/conf/nginx.conf|grep -v ^#|grep -v ^$ 虚拟主机配置完毕后,我们现在访问虚拟主机。如下: wget a.ilanni.com 注意该虚拟主机与apache的虚拟主机是同一个,而且请求的是同一个页面。 使用如同apache同样的命令进行测试nginx,如下: ab -c 10 -n 100 http://a.ilanni.com/index.php 结果如下: 通过上图,测试结果也一目了然,nginx测试出的吞吐率为:Requests per second: 349.14[#/sec](mean)。 对比apache请求该页面的吞吐率,发现nginx吞吐率就是要比apache高。根据前面我们提到的性能指标Requests per second吞吐率越高,服务器性能越好。 这也证明了nginx性能确实比apache性能高。
要配置apache的虚拟主机,我们需要分以下几步进行: 1、 检查apache虚拟主机模块 2、 开启apache虚拟主机功能 3、 httpd-vhosts.conf文件详解 4、 根据IP配置虚拟主机 5、 根据端口配置虚拟主机 6、 根据域名配置虚拟主机 一、检查apache虚拟主机模块 apache要配置虚拟主机,就需要先查看apache是否编译vhost_alias_module模块。当然apache默认是已经编译该模块的,我们可以通过以下命令查看是否已经编译模块,如下: /usr/local/apache2/bin/apachectl -M 二、开启apache虚拟主机功能 要开启apache虚拟主机功能,我们需要修改apache配置文件http.conf。打开apache的安装目录,找到httpd.conf文件,去掉Include conf/extra/httpd-vhosts.conf前的#。如下: vi httpd.conf 该行的作用是,把conf/extra/目录下的httpd-vhosts.conf文件导入虚拟主机配置中。 下面我们所有有关虚拟主机的配置都在httpd-vhosts.conf文件中进行。如下: apache虚拟主机配置主要分为三种,分别是根据IP地址、根据端口、根据域名。 这三种虚拟主机,我们主要讲解基于域名的虚拟主机。基于IP与基于端口在生产环境中使用的比较少,我们在此只大致讲解其配置。 注意在此之前,我们还要修改httpd.conf文件把有关目录访问权限的配置选项去掉。否则在访问虚拟主机时,会报403错误。如下: httpd.conf文件去掉Order deny,allow和Deny from all行,修改如下: <Directory /> Options FollowSymLinks AllowOverride None </Directory> 值得注意的是,当我们为apache启用虚拟主机之后,那么所有的用户请求都会交由对应的虚拟主机来处理。如果apache找不到对应的虚拟主机,则会把该请求交给配置文件中排在最前面的虚拟主机来处理。 同时如果配置基于域名的虚拟主机,我们必须要启用NameVirtualHost *:80行。如下: 三、httpd-vhosts.conf文件详解 httpd-vhosts.conf文件内容大致如下: NameVirtualHost *:80 <VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot "@@ServerRoot@@/docs/dummy-host.example.com" ServerName dummy-host.example.com ServerAlias www.dummy-host.example.com ErrorLog "logs/dummy-host.example.com-error_log" CustomLog "logs/dummy-host.example.com-access_log" common </VirtualHost> NameVirtualHost指定虚拟主机所使用的IP地址或域名,但是最好是IP地址。使用基于域名的虚拟主机时,NameVirtualHost是必要的指令。NameVirtualHost可以定义多个。所有符合NameVirtualHost或<VirtualHost>标签定义的请求,都会被作为虚拟主机处理,而主服务器将不理会。NameVirtualHost定义了而<VirtualHost>标签没有定义的的请求,服务器会找不到相应的虚拟主机而将无法处理。所以每个NameVirtualHost定义的参数至少要有一个<VirtualHost>相匹配。 如果设置NameVirtualHost或<VirtualHost>为*:80的话,所有针对80端口的请求,都会被虚拟主机处理,请求会根据域名指向某个虚拟主机。如果有来自80端口的请求,而所请求的域名没有被配置为虚拟主机,那将指向第一个虚拟主机。这样主服务器将无法收到来自80端口的任何请求。为此也要为主服务器配置一个虚拟主机。 想要配置基于域名的虚拟主机,则必须使用NameVirtualHost指令,该指令用于指定对于当前服务器的哪些IP地址和端口可以接受虚拟主机的相关访问请求,而且这些IP地址和端口必须包含在服务器监听的地址和端口之中。 如果你希望用到服务器上所有的IP地址,你可以使用指令:NameVirtualHost *。 如果apache监听了多个端口(例如:常规的80端口和SSL的443端口),那么必须在NameVirtualHost指令中指定一个端口,例如:NameVirtualHost *:80。 我们可以使用VirtualHost配置段来添加一个虚拟主机,如果有多个虚拟主机,我们可以添加多个这样的配置段。 在VirtualHost配置段中,我们可以使用配置指令来对该虚拟主机进行设置,除了诸如创建进程等少数特殊的指令外,几乎所有的指令都可以出现在VirtualHost配置段中。如果没有设置某些指令,则该虚拟主机将采用主服务器范围内相同的全局指令作为默认设置。当然,VirtualHost配置段至少应该包含ServerName和DocumentRoot这两个配置指令,用以指定虚拟主机的域名和站点文档目录的路径。如下: <VirtualHost *:80> DocumentRoot "/www/a.ilanni.com" ServerName a.ilanni.com </VirtualHost> ServerAdmin管理员邮箱。 DocumentRoot网站目录(注意:如果网站目录中的路径有空格,请在路径两端加上双引号)。 ServerName要绑定的域名(必填)。 ServerAlias要绑定的虚拟主机的别名。(可选,如果多个域名,中间以空格分隔,如果没有,则去掉该行)。支持*,?两种通配符,比如*.abc.com,表示任意一个abc.com的二级域名都可访问。 CustomLog用户日志文件(可选,如果不需要,则去掉该行)。 ErrorLog 错误日志(可选,如果不需要,则去掉该行)。 四、根据IP配置虚拟主机 apache基于IP虚拟主机在实际的生产环境中使用比较少,主要是使用在单网卡多IP的情况下。 我们要测试此功能,需要给服务器的网卡增加一个IP。首先查看服务器的IP地址,如下: ifconfig eth0|grep "inet addr"|awk ‘{print $2}’|cut -d: -f2 ifconfig eth2|grep "inet addr"|awk ‘{print $2}’|sed ‘s/addr://g’ 可以看到目前服务器的IP是192.168.1.213,再增加一个IP地址为192.168.1.215。eth0网卡增加IP地址,可以通过网卡配置文件实现。如下: cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:0 cat /etc/sysconfig/network-scripts/ifcfg-eth0:0 /etc/init.d/network restart ping 192.168.1.215 IP地址增加完毕后,我们现在来修改虚拟主机的配置文件httpd-vhosts.conf。如下: cat httpd-vhosts.conf|grep -v ^$|grep -v ^# httpd-vhosts.conf修改完毕后,我们需要检查该虚拟主机配置是否正确,使用-S命令。如下: /etc/init.d/httpd –S 通过上图可以看到该虚拟主机的配置是正确。 为虚拟主机192.168.1.215创建主页文件,如下: mkdir /www/192.168.1.215 echo "this is web-server 192.168.1.215">/www/192.168.1.215/index.html cat /www/192.168.1.215/index.html 访问192.168.1.215虚拟主机。如下: 或者通过elinks进行测试,如下: elinks -dump http://192.168.1.215 可以看到虚拟主机192.168.1.215,已经可以正常访问了。 现在访问192.168.1.213,看看实际效果。如下: 五、根据端口配置虚拟主机 apache默认是监听80端口,这个可以通过apache配置文件httpd.conf进行查看。如下: cat /usr/local/apache2/conf/httpd.conf|grep 80 apache基于端口虚拟主机在实际生产环境中也不多见,一般是为公司内部人员提供访问的,如页面的后台、CMS发布、phpmyadmin等。 现在我们开始配置基于端口的虚拟主机,在此之前我们需要修改两个文件一是apache的配置文件httpd.conf,二是apache虚拟主机配置文件httpd-vhosts.conf。 现在我们使用8088这个端口来设置虚拟主机。修改httpd.conf。如下: vim /usr/local/apache2/conf/httpd.conf 此文件修改完毕后,我们再来修改httpd-vhosts.conf。如下: cat httpd-vhosts.conf|grep -v ^$|grep -v ^# 为虚拟主机192.168.1.215:8088创建主页文件,如下: mkdir 192.168.1.215:8088 echo "his is web-server 192.168.1.215:8088">index.php cat index.php 现在访问虚拟主机192.168.1.215:8088,如下: 或者使用elinks,如下: elinks -dump http://192.168.1.215:8088 六、根据域名配置虚拟主机 apache基于域名的虚拟主机是我们经常使用的,也是在生产环境中最常见的。 配置基于域名的虚拟主机,我们还是要编辑httpd-vhosts.conf文件。如下: vim httpd-vhosts.conf :45,48s/192.168.1.215:8088/a.ilanni.com/g 以上修改完毕后,我们来创建虚拟主机a.ilanni.com默认主页。如下: mkdir /www/a.ilanni.com echo "<?php phpinfo();?>">/www/a.ilanni.com/index.php cat /www/a.ilanni.com/index.php 以上配置完毕后,重新加载apache的配置文件,即优雅重启apache。如下: /etc/init.d/httpd graceful 访问虚拟主机a.ilanni.com,如下: 或者使用elinks,如下: elinks -dump http://a.ilanni.com 通过上图,可以看到目前虚拟主机a.ilanni.com,已经可以正常访问了。 七、混合配置虚拟主机 以上我们介绍了apache基于IP、基于端口和基于域名的虚拟主机配置。下面我们给出apache混合虚拟主机配置,配置文件如下: <VirtualHost b.ilanni.com:8088> ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/www/b.ilanni.com:8088" ServerName b.ilanni.com:8088 ErrorLog "logs/b.ilanni.com:8088-error_log" CustomLog "logs/b.ilanni.com:8088-access_log" common </VirtualHost> 虚拟主机混用时的问题: 1、虚拟主机混用可以这样理解:一行NameVirtualHost指令定义的所有虚拟主机为一组;该组与一个基于IP的虚拟主机平级。即把一行NameVirtualHost定义的整个组看作是一个基于IP的虚拟主机。 2、虚拟主机指定的端口必须是Listen定义的。如果虚拟主机没有指定端口,则认为是80端口。如果NameVirtualHost * 这样定义,是指所有地址的所有已定义端口。 3、更具体的地址定义优先。比如NameVirtualHost指令定义了*:80,而某个基于IP的虚拟主机定义为192.168.0.1:80,那么此时如有对192.168.0.1:80的请求,那请求会被优先指向192.168.0.1:80定义的虚拟主机。所以为了避免混乱,不要定义相互有交叉或包含的地址区间。 4、一个虚拟主机,可以同时为基于域名和基于IP的。如上一例中最后一个虚拟主机。这样符合两种定义的请求都会被指同一个虚拟主机。有时要区别内外网对虚拟主机的访问时可以这样,因为来自内网的请求可能和来自外网的请求可能不一样,但是它们需要指向同一个虚拟主机。 使用"_default_"虚拟主机,这个虚拟主机可以理解成基于IP的虚拟主机。如下: <VirtualHost _default_:*> DocumentRoot /www/default </VirtualHost> 这个虚拟主机将接管与其它虚拟主机IP和端口不匹配的请求。不过如此一来,主服务器将不会处理任何请求。因此把主服务器配置成一个虚拟主机是必要的。
apache对php的支持是通过apache的mod_php5模块来支持的,这点与nginx不同。nginx是通过第三方的fastcgi处理器才可以对php进行解析,有关nginx与php集成,请看《烂泥:php5.6源码安装及php-fpm配置与nginx集成》。 如果源码编译安装php的话,需要在编译时指定–with-apxs2=/usr/local/apache2/bin/apxs表示告诉编译器通过apache的mod_php5模块来提供对php的解析。 同时php安装的最后一步make install时,我们会看到将动态链接库libphp5.so拷贝到apache2的安装目录的modules目录下,并且还需要在httpd.conf配置文件中添加LoadModule语句来动态将libphp5.so模块加载进来,从而实现Apache对php的支持。 php与apache集成需要以下几个步骤: 1、安装libiconv库 2、php源码安装 3、配置apache使其支持php 4、测试php 一、安装libiconv库 libiconv库为需要做转换的应用程序提供了一个iconv命令,以实现一个字符编码到另一个字符编码的转换,比如它可以将UTF8编码转换成GB18030编码,反过来也行。 php与apache集成时一定要安装libiconv库,否则在make时系统会报错。报错信息如下: make: *** [sapi/cli/php] Error 1 /usr/bin/ld: cannot find -liconv collect2: ld returned 1 exit status make: *** [sapi/cli/php] Error 1 现在开始正式安装libiconv库,首先下载libiconv库,如下: wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz 解压libiconv库,如下: tar -xf libiconv-1.14.tar.gz 安装libiconv库,首先查看安装帮助信息。如下: ./configure –help 通过上图的帮助,我们可以看到libiconv库默认的安装路径为/usr/local。现在开始安装libiconv库,如下: ./configure –prefix=/usr/local make && make install libiconv库安装完毕后,建议把/usr/local/lib库加入到到/etc/ld.so.conf文件中,然后使用/sbin/ldconfig使其生效。如下: echo “/usr/local/lib”>>/etc/ld.so.conf /sbin/ldconfig 如果没有进行此步操作的话,在安装php执行make install,系统就会报错。报错信息如下: /root/php-5.6.2/sapi/cli/php: error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory 二、php源码安装 有关php源码安装可以参照《烂泥:php5.6源码安装及php-fpm配置与nginx集成》文章, 下载并编译php命令如下: yum -y install gcc gcc-c++ libxml2 libxml2-devel wget http://mirrors.sohu.com/php/php-5.6.2.tar.gz ./configure –enable-fpm –enable-mbstring –with-mysql=/usr/local/mysql –with-iconv-dir=/usr/local –with-apxs2=/usr/local/apache2/bin/apxs 注意上述命令中–enable-fpm的作用是开启php的fastcgi功能,即开启php-fpm功能。 –with-mysql=/usr/local/mysql是启用php支持mysql的功能,/usr/local/mysql是mysql数据库的安装路径。 –enable-mbstring表示启用mbstring模块mbstring模块的主要作用在于检测和转换编码,提供对应的多字节操作的字符串函数。目前php内部的编码只支持ISO-8859-*、EUC-JP、UTF-8,其他的编码的语言是没办法在php程序上正确显示的,所以我们要启用mbstring模块。 –with-iconv-dir=/usr/local指定php存放libiconv库的位置。 –with-apxs2=/usr/local/apache2/bin/apxs指定php查找apache的位置。 编译完毕后,我们再来make。在make时,我们注意要加上-liconv参数。如果不加上-liconv参数,系统在make编译会报错。报错信息如下: Generating phar.php php-5.3.16/sapi/cli/php: error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory 使用命令如下: make ZEND_EXTRA_LIBS=’-liconv’ 我们也可以通过修改Makefile文件,在ZEND_EXTRA_LIBS行加入-liconv。如下: vi Makefile make install 通过上图,我们可以很明显的看到apache配置文件httpd中启用php支持,同时也把libphp5.so文件复制到apache的模块目录下。 三、配置apache使其支持php php安装完毕后,我们就可以通过修改apache的配置文件httpd.conf来使其支持php。 我们只需要在httpd.conf文件中加入如下两行代码: LoadModule php5_module modules/libphp5.so AddType application/x-httpd-php .php 注意,其中LoadModule php5_module modules/libphp5.so行,我们查看httpd.conf文件时会发现该行已经存在。那是因为在安装php时,添加的。现在我们只需要添加AddType application/x-httpd-php .php行即可。 vi /usr/local/apache2/conf/httpd.conf 除此之外,我们还需要修改apache的默认主页文件,添加index.php。内容如下: echo “<?php phpinfo();?>”>/usr/local/apache2/htdocs/index.php cat /usr/local/apache2/htdocs/index.php 四、测试php 以上修改完毕后,我们重新启动apache,使用如下命令: /etc/init.d/httpd graceful 注意该命令可以优雅的重启apache。 打开站点,如下: 通过上图,我们可以很明显的看到apache已经支持php。
最近要开始学习nagios监控方面的知识了,但是nagios与apache结合的比较紧密,所以本篇文章就先把apache的源码安装学习下。 我们现在分以下步骤进行安装apache: 1、 安装编译环境 2、 卸载原有apache 3、 下载解压源码包 4、 安装apache 5、 测试apache 6、 查看apache安装生成的目录 7、 查看apache的配置文件 8、 apache加入系统服务 一、安装编译环境 在安装apache之前,我们需要安装编译apache时所需要的相关软件包,如下: yum -y install gcc gcc++ zlib zlib-devel 二、卸载原有Apache 在源码安装apache之前,我们要先卸载系统中,已经通过rpm包安装的apache。如下: rpm -qa |grep httpd rpm -e –nodeps httpd-2.2.15-29.el6.centos.x86_64 rpm -e –nodeps httpd-tools-2.2.15-29.el6.centos.x86_64 三、下载解压源码包 下载apache的源码包,我们本次实验以apache的2.2.27版本为例。apache的源码包建议直接去apache官网下载,如下: 使用如下命令,下载apache源码包: wget http://apache.fayea.com/httpd/httpd-2.2.27.tar.gz 解压下载的源码包,因为下载的是tar.gz的源码包,所以我们有两种解压方法。 方法一、利用gunzip进行解压,如下: gunzip -c httpd-2.2.27.tar.gz>httpd-2.2.27.tar -c参数可以不删除源文件 tar -xf httpd-2.2.27.tar 方法二、直接使用tar解压,如下: tar -zxf httpd-2.2.27.tar.gz 或者tar -xf httpd-2.2.27.tar.gz 四、安装apache 安装apache,我们首先要编译,然后进行安装。 我们可以通过configure命令查看编译时的相关帮助,如下: ./configure –help 具体编译如下: ./configure –prefix=/usr/local/apache2 –enable-rewrite –enable-so –enable-headers –enable-expires –with-mpm=worker –enable-modules=most –enable-deflate –prefix=/usr/local/apache2表示指定apache的安装路径,默认安装路径为/usr/local/apache2 –enable-rewrite提供URL规则的重写更嫩那个,即根据已知的URL地址,转换为其它想要的URL地址 –enable-so激活apache服务的DSO(Dynamic Shared Objects动态共享目标),即在以后可以以DSO的方式编译安装共享模块,这个模块本身不能以DSO方式编译。 –enable-headers提供允许对HTTP请求头的控制。 –enable-expires激活荀彧通过配置文件控制HTTP的“Expires:”和“Cache-Control:”头内容,即对网站图片、js、css等内容,提供客户端浏览器缓存的设置。这个是apache调优的一个重要选项之一。 –with-mpm=worker选择apache mpm的模式为worker模式。为worker模式原理是更多的使用线程来处理请求,所以可以处理更多的并发请求。而系统 资源的开销小玉基于进程的MPM prefork。如果不指定此参数,默认的模式是prefork进程模式。这个是apache调优的一个重要选项之一。 –enable-deflate提供对内容的压缩传输编码支持,一般是html、js、css等内容的站点。使用此参数会打打提高传输速度,提升访问者访问的体验。在生产环境中,这是apache调优的一个重要选项之一。 make make install 安装完毕apache,查看安装后的目录,如下: tree -L 1 /usr/local/apache2/ 五、测试apache 将apache的启动脚本复制到/etc/rc.d/init.d这个目录下,如下: cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd 其实apache的启动是调用/usr/local/apache2/bin/httpd这个命令,查看该脚本的内容,如下: cat /etc/init.d/httpd|grep -v ^#|grep -v ^$ 启动apache,如下: /etc/init.d/httpd start netstat -lntp|grep 80 lsof -i :80 也可以使用/usr/local/apache2/bin/httpd进行启动。如下: /usr/local/apache2/bin/httpd –k start apache启动完毕后,我们来查看下,可以使用如下命令: wget http://192.168.1.213 通过上图,我们可以很明显的看到apache已经正常启动。 六、查看apache安装生成的目录 apache正常启动后,我们来查看apache安装生成的目录。如下: bin主要存放程序命令目录,。 conf主要存放apache配置文件。 htdocs主要存放站点目录。 logs主要存放默认日志文件。 modules主要存放apache的运行模块。例如php、memcache编译后的模块存放在这里。 七、查看apache的配置文件 apache的配置文件httpd.conf存放在conf 目录下,如下: 查看httpd.conf配置内容,如下: egrep -v ‘^[ ]*#|^$’ /usr/local/apache2/conf/httpd.conf | nl ServerRoot "/usr/local/apache2"表示apache根目录,该目录应只有root用户具有访问,一般不需要修改。 Listen 80表示apache监听端口,默认为80。如果同时监控81端口,可以加一行:Listen 81。 AddType application/x-httpd-php .php LoadModule php5_module modules/libphp5.so用于apache与php进行集成时使用。 User daemon Group daemon表示apache运行时的用户及组,默认为daemon,建议修改,如apache。 DocumentRoot "/usr/local/apache2/htdocs"表示apache默认的web站点目录,路径结尾不要添加斜线。 ServerAdmin you@example.com表示系统管理员的邮箱,此项为非重要选项。当网站出现问题时,面面会显示此页面地址。 DirectoryIndex index.php index.html配置默认的apache首页。如果虚拟主机未配置,默认应用这里的配置。 ErrorLog "logs/error_log"错误日志路径。 LogLevel warn错误日志级别。 ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"配置cgi别名。 八、apache加入系统服务 为了让apache开机启动,我们可以把apachectl启动脚本加入rc.local文件中,如下: echo "/usr/local/apache2/bin/apachectl start">>/etc/rc.local cat /etc/rc.local 我们也可以通过把apache加入系统服务,来启动apache。把apache添加为系统服务有两种方法,第一种是通过chkconfig进行添加,第二种是直接添加系统的各个启动级别。 我们先来介绍第一种方法,修改启动httpd脚本加入如下两行命令,如下: #chkconfig: 2345 70 60 #description: apache 说明: chkconfig: 2345 70 60中的2345是指脚本的运行级别,即在2345这4种模式下都可以运行,234都是文本界面,5是图形界面X。 70是指脚本将来的启动顺序号,如果别的程序的启动顺序号比70小(比如44、45),则脚本需要等这些程序都启动以后才启动。60是指系统关闭时,脚本的停止顺序号。 description: apache关于脚本的简短描述。 使用chkconfig进行添加,如下: chkconfig –add httpd chkconfig |grep httpd chkconfig –add httpd命令的作用是把/etc/init.d/httpd加入到/etc/rc.d/rc0.d到/etc/rc.d/rc6.d目录下。如下: find /etc -name *httpd 开启apache开机启动,使用如下命令: chkconfig httpd on chkconfig |grep httpd 经过以上操作apache就可以开机启动。
在安装、管理和使用mysql过程中,你是不是需要记忆很多的mysql命令。而且对于新手来说,很不多的命令不知道该如何应用,对于老手来说很多命令时间长了忘记具体的用法。 其实mysql的帮助信息,已经给我们提供很全面的使用方法。 下面我就大致介绍下,如何使用mysql的帮助信息。 说明:在此我只是为学习mysql提供一个思路,本篇文章不会过多讲解每一个命令的使用方法。 一、mysql数据库初始化 在安装mysql进行初始化时,我们要使用mysql_install_db脚本进行初始化mysql数据库,此时我们就可通过帮助命令实现。如下: /usr/local/mysql/scripts/mysql_install_db –help 图中的1、2、3表示初始化时mysql安装的bin路径、mysql数据目录,以及运行mysql所使用的用户。 现在我们进行初始化数据库,如下: /usr/local/mysql/scripts/mysql_install_db –basedir=/usr/local/mysql/ –datadir=/usr/local/mysql/data/ –user=mysql 通过上图,我们也可以看到mysql数据库已经初始化成功。同时系统也给出如何启动mysql,图中5标记出来。图中6标记出来的是如何修改root用户的密码。 二、 mysql数据库管理 2.1 启动mysql使用mysqld_safe mysql数据库安装完毕后,我们就要启动mysql。启动mysql时,我们可以通过mysql提供的脚本,也可以通过mysqld_safe命令来启动。 其实mysql的脚本也是通过该命令来实现的,如下: cat /etc/init.d/mysqld 有关mysqld_safe命令的使用,我们也可以查看帮助文档。如下: /usr/local/mysql/bin/mysqld_safe –help 我们需要关注defaults-file这个参数,这个参数加载的就是mysql的配置文件my.cnf。mysql的多实例部署就是根据加载不同的my.cnf文件来达到目的的。 现在我们来启动mysql,如下: /usr/local/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf & 注意有一个参数在帮助文档中我们是查不到的,就是跳过密码验证启动mysql,这个参数为skip-grant-table。使用该参数启动mysql,如下: /usr/local/mysql/bin/mysqld_safe –skip-grant-table & 2.2 修改root用户密码使用mysqladmin 刚刚新安装的mysql数据库,root用户密码是空的。我们可以通过mysqladmin来查看如何修改root用户密码,如下: /usr/local/mysql/bin/mysqladmin –help 修改root密码,如下: /usr/local/mysql/bin/mysqladmin -uroot password 123456 第一次修改root密码,因为此时root密码为空,我们可以这样操作。如果root已经有密码了,我们就要使用以下命令进行修改,如下: /usr/local/mysql/bin/mysqladmin -uroot -p123456 password 456789 使用新密码登录mysql,如下: /usr/local/mysql/bin/mysql -uroot –p456789 其中还要注意-S参数,这个在mysql多实例时会使用到,详见《烂泥:mysql5.5多实例部署》。 2.3 备份mysql使用mysqldump 在备份mysql数据库时,我们一般使用mysqldunmp命令,有关mysqldump命令的使用方法查看帮助文档。如下: /usr/local/mysql/bin/mysqldump –help 由于mysqldump的参数比较多,所以我们不一一介绍。但是有几个参数需要重点介绍下。 -A表示备份整个数据库 -F表示在执行导出之前将会刷新MySQL服务器的binlog -e表示使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句) –single-transaction 这个是当mysql是innodb引擎时,使用mysqldump备份建议要加上。 -S这个是mysql多实例使用的,详见《烂泥:mysql5.5多实例部署》。 mysqldump一个备份实例,如下: mysqldump -uilanni1 -p’ilanni1′ ilanni>ilanni.sql 如果需要导入备份的sql文件的话,使用mysql命令。如下: mysql -uilanni1 -p’ilanni1′ ilanni<ilanni.sql 2.4 登录mysql使用mysql 登录或者连接mysql我们可以使用mysql命令,有关mysql命令的使用,查看帮助文档。如下: /usr/local/mysql/bin/mysql –help 在此我主要介绍下-e和-S这个参数。-e参数在mysql进行主从配置查看master库的binlog文件名及pos位置节点时使用。-S参数mysql多实例使用,详见《烂泥:mysql5.5多实例部署》。如下: mysql -uroot -p123456 -S /data/3307/mysql.sock -e “show master status” 注意以上命令都可以通过man进行查询其使用方法。比如mysql命令: man mysql 三、mysql数据库使用 3.1 查看mysql数据库版本 登录mysql数据库后,我们可以看到系统的提示命令,如下: /usr/local/mysql/bin/mysql -uroot -p456789 通过上述截图,我们可以看到目前mysql的版本是5.5.39。同时我们也注意到系统的提示:输入help可以查看帮助信息,\c可以清空输入。 3.2 查看help命令 查看help命令相关信息,如下: help 通过上图我们可以看到help命令很简单的,在这我就不详细的介绍了。只介绍system命令,该参数可以在mysql命令中直接执行系统的相关命令。如下: system ifconfig eth0 3.3 查看mysql帮助索引 如果你一个mysql的使用命令都不知道,也没有关系的。mysql给我提供了一个帮助索引。现在我们随便输入一个命令,看看mysql的提示如: help eth0; 通过上图,我们可以看到。当我们输入一个不存在的命令时,系统会提示的。注意图中标记出来的黄色部分“help contents”。 我们通过help contents就可以查看到所有的mysql命令,这个就是mysql帮助索引。如下: help contents; 注意图中标记出来的都是各个mysql总命令的总目录。比如Account Management是负责管理mysql用户有关的目录、Administration是mysql管理员管理mysql有关的目录。 我们所有的mysql命令,都是可以在这个索引下找的。 3.4 查看mysql如何创建用户 我们要创建一个新的数据库用户,但是我们又不知道使用什么命令进行创建,那我们就可以使用help contents查看所有的mysql命令目录,根据目录提示的信息我们猜想该命令应该在Account Management这个目录下。那我们就可以先查看该命令的帮助,如下: help Account Management; 通过上图,我们可以看到创建用户的命令确实在该目录下,为create user命令。 有关create user命令的具体使用方法,我们可以在进一步通过help命令进行查看。如下: help create user; 通过上图,我们可以很明显看到create user的具体使用方法,并且帮助信息中也给出相应的例子。 这样我们知道,如何使用create user命令创建数据用户了。 同理我们也可以查看如何删除一个用户,使用help drop user命令,如下: help drop user; 3.5如何给用户授权 我们在创建完毕数据库用户后,就要给该用户授权。那么如何授权,该使用什么命令呢? 其实我们也可以在help Account Management命令中查看到,如下: 通过上图我们可以看到grant就是授权命令。 我们再来查看grant命令的使用方法,如下: help grant; 上图就是grant的使用方法以及实例。同时系统也给出了如何查看用户的权限使用show grants和如何删除用户的权限使用revoke。 同理我们也可以删除一个用户权限,使用help revoke命令进行查看,如下: help revoke; 在这有一点需要说明下,我们在给用户进行授权时,有时候不知道数据库对用户的权限都是什么,其实我们也是可以通过系统给出的数据库进行查询到的。该数据库为information_schema,如下: use information_schema; desc user_privileges; select privilege_type from user_privileges; 表user_privileges的privilege_type字段存储的就是mysql数据库用户的所有权限。 除此之外,我们也可以通过Administration下的privileges查看所有权限,这个方法是最简单的。如下: show privileges; 3.6 修改用户密码 修改数据库用户的密码,我们也可以在help Account Management下进行查看。如下: help Account Management; 通过上图,我们可以知道修改用户密码的命令是set password。 下面我们来查看set password的具体用法,如下: help set password; 通过上图,我们可以知道set password的使用方法以及使用实例。 3.7如何新建mysql数据库 如何新建一个mysql数据库,我们可以通过help contents查看应该是在data definition。如下: help contents; help data definition; 通过上图,我们可以看到创建数据库的命令是create database。现在我们来具体查看下有关create database命令的使用方法,如下: help create database; 上图就是有关create database命令的详细使用方法。 同时还要注意我们在查看help data definition命令时,标记出来的部分,如下: 我们可以看到这里面还有创建表、创建表空间,删除数据库、删除表、删除表空间等命令,这个些命令我们就不一一介绍了。我们只需按照create database命令进行查询其使用方法即可。 3.8如何更新数据库的一个记录 现在我们要更新数据库中一张表的某一个字段的记录,我们知道可以使用update命令。但是update命令的具体用法,我们忘记了。 嘿嘿,没事,我们也可以通过help信息查看update命令的使用方法。 通过查看相关的信息,我们知道update命令在data manipulation目录下面。如下: help data manipulation; 现在我们来查看update的使用方法,如下: help update; 通过上图,我们就可以知道update命令的使用方法。 同时需要注意的是,我们在查看data manipulation时,也可以查看有关表的其他操作,查询命令select、删除命令delete、插入命令insert。 如下: help data manipulation; 有关这些命令的使用方法,在此就不一一介绍了。我们只需按照update命令进行查询其使用方法即可。 3.9如何刷新mysql日志 现在我们来查看如何在命令行下,刷新mysql日志。这个我们可以在help contents下的Administration进行查看。如下: help Administration; 通过上图,我们可以知道刷新mysql日志的命令为flush。现在查看该命令的具体使用方法。如下: help flush; 通过上图,我们可以看到刷新日志使用flush logs命令即可。如下: show master status\G; flush logs; 同时该帮助信息中,还给出了如何重置日志,使用reset命令。如下: help reset; 其实在help Administration中,我们也能看到reset命令。如下: 3.10 刷新权限 有时候我们在使用update命令进行更新后,会发现相关权限没有生效。这个时候我们就需要使用flush privileges命令进行刷新。 如下命令: flush privileges; 其实flush帮助信息中,已经给我们进行说明了。如下: 3.11 查看show命令 通过3.9我们知道在Administration中有一个比较特别的命令show。 我们可以看到很多show相关的命令,如下: help Administration; 这个show命令可以查看,我们在用户授权、创建数据库、创建表等执行时所使用的SQL语句。还可以查看数据库引擎、数据库状态、表状态等信息。 查看数据库ilanni创建时执行的sql语句,如下: show create database ilanni; 注意我们在创建数据库ilanni时,是没有指定数据库使用的语言编码的。但是系统会在执行sql语句时,自动加上语言编码,并且使用默认的语言编码latin1。 如果你记不清楚如何加上语言编码的话,我们就可以创建一个数据库。然后通过show create database命令进行查看,系统是是如何加上语言编码的。然后我们再次删除该数据库,再次按照系统创建时的sql语言执行即可。 如下: create database ilanni default character set utf8; 查看系统中的数据库,如下: show databases; 查看master库binlog相关信息,如下: show master status; 查看ilanni用户授权sql语句,如下: show grants for ilanni; 查看mysql数据库的表,如下: show tables; 3.12 查看主从相关的命令 我们在进行mysql主从配置时,会使用到很多很多的命令。这些命令,我们也可以通过帮助信息获得。如下: help contents; help transactions; 注意上图中,我们黄色标记出来的部分。主库授予从库的命令、锁表命令、主库master重置数据库、开启与关闭同步等命令。 我们在从库上执行主库的授权命令时,使用change master to命令。有关change master to命令的具体使用方法,查看帮助。如下: help change master to; 通过上述两张图,我们就能很容易的知道change master to使用方法,并且帮助信息中也给出实际的例子。 我们在进行导出mysql数据库时,为了保持主从数据库的一致性,此时我们会通过lock命令进行锁表。有关lock命令的使用,我们也可以通过帮助信息进行查看,如下: help lock; 重置主库master日志,如下: help reset master; reset master; 在从库slave上开启同步,如下: help start slave; start slave; show slave status\G 在从库slave上关闭同步,如下: help stop slave; stop slave; show slave status\G 有关mysql主从同步的具体配置方法详见《烂泥:mysql5.5主从同步复制配置》。
mysql5.5数据库多实例部署,我们可以分以下几个步骤来完成。 1、 mysql多实例的原理 2、 mysql多实例的特点 3、 mysql多实例应用场景 4、 mysql5.5多实例部署方法 一、mysql多实例的原理 mysql多实例,简单的说,就是在一台服务器上开启多个不同的mysql服务端口(如3306,3307),运行多个mysql服务进程。这些服务进程通过不同的socket监听不同的服务端口,来提供各自的服务。 这些mysql实例共用一套mysql安装程序,使用不同的my.cnf配置文件、启动程序、数据文件。在提供服务时,mysql多实例在逻辑上看来是各自独立的,各个实例之间根据配置文件的设定值,来取得服务器的相关硬件资源。 二、mysql多实例的特点 2.1 有效的利用服务器资源 当单个服务器资源有剩余时,可以充分利用剩余的服务器资源来提供更多的服务。 2.2 节约服务器资源 当公司资金紧张,但是数据库需要各自提供独立服务,而且需要主从同步等技术时,使用多实例就最好了。 2.3 出现资源互相抢占问题 当某个实例服务并发很高或者有慢查询时,会消耗服务器更多的内存、CPU、磁盘IO等资源,这时就会导致服务器上的其它实例提供访问的质量下降,出现服务器资源互相抢占的现象。 三、mysql多实例应用场景 3.1 资金紧张型公司的选择 当公司业务访问量不太大,又舍不得花钱,但同时又希望不同业务的数据库服务各自独立,而且需要主从同步进行等技术提供备份或读写分离服务时,使用多实例是最好不过的。 3.2 并发访问不是特别大的业务 当公司业务访问量不太大,服务器资源基本闲置的比较多,这是就很适合多实例的应用。如果对SQL语句优化的好,多实例是一个很值得使用的技术。即使并发很大,只要合理分配好系统资源,也不会有太大问题。 四、mysql5.5多实例部署方法 4.1 mysql5.5多实例部署方法 mysql5.5多实例部署方法一个是通过多个配置文件启动多个不同进程的方法,第二个是使用官方自带的mysqld_multi来实现。 第一种方法我们可以把各个实例的配置文件分开,管理比较方便。第二种方法就是把多个实例都放到一个配置文件中,这个管理不是很方便。所以在此我们选择第一种方法,而且以下实验我们全部是在此方法下进行的。 4.2 mysql5.5的安装及配置 要配置mysql5.5多实例,我们首先要安装mysql5.5,有关mysql5.5的安装可以查看《烂泥:mysql5.5数据库cmake源码编译安装》这篇文章。 mysql5.5安装完毕后,我们不要启动mysql,因为此时mysql是单实例的。 4.3 创建mysql多实例的数据目录 现在我们来创建mysql5.5多实例的数据目录,在此我们创建两个mysql实例3306和3307。创建各自的数据目录,如下: mkdir -p /data/{3306,3307}/data tree -L 2 /data/ 4.4 修改mysql5.5多实例my.cnf文件 实例3306和3307的数据目录创建完毕后,我们来配置实例3306与3307的my.cnf配置文件。 复制mysql5.5安装目录support-files下的my-medium.cnf为my.cnf,并把内容修改为下。现在以3306这个实例为例,如下: [client] port = 3306 socket = /data/3306/mysql.sock [mysqld] port = 3306 socket = /data/3306/mysql.sock basedir = /usr/local/mysql datadir = /data/3306/data skip-external-locking key_buffer_size = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M skip-name-resolve log-bin=mysql-bin binlog_format=mixed max_binlog_size = 500M server-id = 1 [mysqld_safe] log-error=/data/3306/ilanni.err pid-file=/data/3306/ilanni.pid [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout 注意图中黄色标记出来的部分,就是我们主要修改的,其他默认保持不变。 以上是实例3306的my.cnf配置文件,现在我们来配置实例3307的my.cnf。实例3307的配置文件my.cnf我们直接复制实例3306的my.cnf文件,然后通过sed命令把该文件中的3306修改为3307即可。如下: cp /data/3306/my.cnf /data/3307/my.cnf sed -i ‘s/3306/3307/g’ /data/3307/my.cnf 或者 sed -e ‘s/3306/3307/g’ /data/3306/my.cnf >/data/3307/my.cnf 4.5 初始化mysql多实例 实例3306和3307的my.cnf配置文件修改完毕后,我们需要来初始化这两个实例,使用mysql_install_db命令。如下: /usr/local/mysql/scripts/mysql_install_db –basedir=/usr/local/mysql –datadir=/data/3306/data –user=mysql /usr/local/mysql/scripts/mysql_install_db –basedir=/usr/local/mysql –datadir=/data/3307/data –user=mysql 注意mysql5.5的mysql_install_db在mysql5.5的/usr/local/mysql/scripts/mysql_install_db目录下。 查看实例初始化后的情况,如下: tree -L 3 /data/ 通过上图我们可以看到mysql实例在初始化后会创建基本的数据库。 现在再来看看初始化创建文件的属性,如下: 通过上图可以看到初始化创建的文件都是属于mysql这个用户的。 为什么会是这样呢? 这个是因为我们初始化加入–user=mysql这个选项。当然这个也是我们所需要的,因为这增加了mysql的安全性。 4.6 修改mysql实例的数据库目录权限 mysql实例初始化完毕后,我们现在把实例3306和实例3307的数据目录权限重新赋予给mysql用户。如下: chown -R mysql:mysql /data/3306 chown -R mysql:mysql /data/3307 这个地方建议一定要操作一遍,否则在启动mysql实例时,会提示出错。导致mysql实例无法启动。 4.7 启动mysql5.5多实例 我们现在来启动实例。使用如下命令: /usr/local/mysql/bin/mysqld_safe –defaults-file=/data/3306/my.cnf & /usr/local/mysql/bin/mysqld_safe –defaults-file=/data/3307/my.cnf & ps aux |grep mysqld 通过上图,我们可以看到实例3306和3307 都已经正常启动。也说明我们的mysql5.5多实例已经配置成功。 其实单实例mysql的启动也是通过mysqld_safe命令来启动。它默认会加载/etc/my.cnf文件。 4.8 登录mysql5.5多实例 登录多实例数据库时,我们需要加入该实例的socket文件,才能正常登录。现在以3306实例为例。 本地登录3306实例,如下: mysql -uroot -p -S /data/3306/mysql.sock 本地登录进去后,我们在实例3306上创建一个ilanni3306的数据库。如下: create database ilanni3306; show databases; 现在我们远程登录实例3306,并查看刚刚新建的数据库。如下: mysql -h192.168.1.213 -uroot -p -S /data/3306/mysql.sock 或者:mysql -h192.168.1.213 -uroot -p –P 3306 通过上图,我们可以看到远程也是可以连接3306实例的。 4.9 修改mysql5.5多实例root密码 修改实例3306的root密码,使用mysqladmin命令。如下: mysqladmin -uroot -p password 123456 -S /data/3306/mysql.sock 到此我们的mysql多实例部署就已经完成。
mysql5.5数据库多实例部署,我们可以分以下几个步骤来完成。 1、 mysql多实例的原理 2、 mysql多实例的特点 3、 mysql多实例应用场景 4、 mysql5.5多实例部署方法 一、mysql多实例的原理 mysql多实例,简单的说,就是在一台服务器上开启多个不同的mysql服务端口(如3306,3307),运行多个mysql服务进程。这些服务进程通过不同的socket监听不同的服务端口,来提供各自的服务。 这些mysql实例共用一套mysql安装程序,使用不同的my.cnf配置文件、启动程序、数据文件。在提供服务时,mysql多实例在逻辑上看来是各自独立的,各个实例之间根据配置文件的设定值,来取得服务器的相关硬件资源。 二、mysql多实例的特点 2.1 有效的利用服务器资源 当单个服务器资源有剩余时,可以充分利用剩余的服务器资源来提供更多的服务。 2.2 节约服务器资源 当公司资金紧张,但是数据库需要各自提供独立服务,而且需要主从同步等技术时,使用多实例就最好了。 2.3 出现资源互相抢占问题 当某个实例服务并发很高或者有慢查询时,会消耗服务器更多的内存、CPU、磁盘IO等资源,这时就会导致服务器上的其它实例提供访问的质量下降,出现服务器资源互相抢占的现象。 三、mysql多实例应用场景 3.1 资金紧张型公司的选择 当公司业务访问量不太大,又舍不得花钱,但同时又希望不同业务的数据库服务各自独立,而且需要主从同步进行等技术提供备份或读写分离服务时,使用多实例是最好不过的。 3.2 并发访问不是特别大的业务 当公司业务访问量不太大,服务器资源基本闲置的比较多,这是就很适合多实例的应用。如果对SQL语句优化的好,多实例是一个很值得使用的技术。即使并发很大,只要合理分配好系统资源,也不会有太大问题。 四、mysql5.5多实例部署方法 4.1 mysql5.5多实例部署方法 mysql5.5多实例部署方法一个是通过多个配置文件启动多个不同进程的方法,第二个是使用官方自带的mysqld_multi来实现。 第一种方法我们可以把各个实例的配置文件分开,管理比较方便。第二种方法就是把多个实例都放到一个配置文件中,这个管理不是很方便。所以在此我们选择第一种方法,而且以下实验我们全部是在此方法下进行的。 4.2 mysql5.5的安装及配置 要配置mysql5.5多实例,我们首先要安装mysql5.5,有关mysql5.5的安装可以查看《烂泥:mysql5.5数据库cmake源码编译安装》这篇文章。 mysql5.5安装完毕后,我们不要启动mysql,因为此时mysql是单实例的。 4.3 创建mysql多实例的数据目录 现在我们来创建mysql5.5多实例的数据目录,在此我们创建两个mysql实例3306和3307。创建各自的数据目录,如下: mkdir -p /data/{3306,3307}/data tree -L 2 /data/ 4.4 修改mysql5.5多实例my.cnf文件 实例3306和3307的数据目录创建完毕后,我们来配置实例3306与3307的my.cnf配置文件。 复制mysql5.5安装目录support-files下的my-medium.cnf为my.cnf,并把内容修改为下。现在以3306这个实例为例,如下: [client] port = 3306 socket = /data/3306/mysql.sock [mysqld] port = 3306 socket = /data/3306/mysql.sock basedir = /usr/local/mysql datadir = /data/3306/data skip-external-locking key_buffer_size = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M skip-name-resolve log-bin=mysql-bin binlog_format=mixed max_binlog_size = 500M server-id = 1 [mysqld_safe] log-error=/data/3306/ilanni.err pid-file=/data/3306/ilanni.pid [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout 注意图中黄色标记出来的部分,就是我们主要修改的,其他默认保持不变。 以上是实例3306的my.cnf配置文件,现在我们来配置实例3307的my.cnf。实例3307的配置文件my.cnf我们直接复制实例3306的my.cnf文件,然后通过sed命令把该文件中的3306修改为3307即可。如下: cp /data/3306/my.cnf /data/3307/my.cnf sed -i ‘s/3306/3307/g’ /data/3307/my.cnf 或者 sed -e ‘s/3306/3307/g’ /data/3306/my.cnf >/data/3307/my.cnf 4.5 初始化mysql多实例 实例3306和3307的my.cnf配置文件修改完毕后,我们需要来初始化这两个实例,使用mysql_install_db命令。如下: /usr/local/mysql/scripts/mysql_install_db –basedir=/usr/local/mysql –datadir=/data/3306/data –user=mysql /usr/local/mysql/scripts/mysql_install_db –basedir=/usr/local/mysql –datadir=/data/3307/data –user=mysql 注意mysql5.5的mysql_install_db在mysql5.5的/usr/local/mysql/scripts/mysql_install_db目录下。 查看实例初始化后的情况,如下: tree -L 3 /data/ 通过上图我们可以看到mysql实例在初始化后会创建基本的数据库。 现在再来看看初始化创建文件的属性,如下: 通过上图可以看到初始化创建的文件都是属于mysql这个用户的。 为什么会是这样呢? 这个是因为我们初始化加入–user=mysql这个选项。当然这个也是我们所需要的,因为这增加了mysql的安全性。 4.6 修改mysql实例的数据库目录权限 mysql实例初始化完毕后,我们现在把实例3306和实例3307的数据目录权限重新赋予给mysql用户。如下: chown -R mysql:mysql /data/3306 chown -R mysql:mysql /data/3307 这个地方建议一定要操作一遍,否则在启动mysql实例时,会提示出错。导致mysql实例无法启动。 4.7 启动mysql5.5多实例 我们现在来启动实例。使用如下命令: /usr/local/mysql/bin/mysqld_safe –defaults-file=/data/3306/my.cnf & /usr/local/mysql/bin/mysqld_safe –defaults-file=/data/3307/my.cnf & ps aux |grep mysqld 通过上图,我们可以看到实例3306和3307 都已经正常启动。也说明我们的mysql5.5多实例已经配置成功。 其实单实例mysql的启动也是通过mysqld_safe命令来启动。它默认会加载/etc/my.cnf文件。 4.8 登录mysql5.5多实例 登录多实例数据库时,我们需要加入该实例的socket文件,才能正常登录。现在以3306实例为例。 本地登录3306实例,如下: mysql -uroot -p -S /data/3306/mysql.sock 本地登录进去后,我们在实例3306上创建一个ilanni3306的数据库。如下: create database ilanni3306; show databases; 现在我们远程登录实例3306,并查看刚刚新建的数据库。如下: mysql -h192.168.1.213 -uroot -p -S /data/3306/mysql.sock 或者:mysql -h192.168.1.213 -uroot -p –P 3306 通过上图,我们可以看到远程也是可以连接3306实例的。 4.9 修改mysql5.5多实例root密码 修改实例3306的root密码,使用mysqladmin命令。如下: mysqladmin -uroot -p password 123456 -S /data/3306/mysql.sock 到此我们的mysql多实例部署就已经完成。
MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能、更高可靠性要求的场合。与之对应的是另一个同步技术是MySQL Cluster,但因为MySQL Cluster配置比较复杂,所以使用者较少。 MySQL的Replication是一个异步复制的过程(mysql5.1.7以上版本分为异步复制和半同步两种模式),它是从一个Mysql instance(instance英文为实例)(我们称之为Master)复制到另一个Mysql instance(我们称之slave)。在master与slave之间实现整个复制过程主要由三个线程来完成,其中两个线程(SQL线程和IO线程)在slave端,另外一个线程(IO线程)在master端。 要实现MySQL的Replication,首先必须打开master端的binlog (mysql-bin.xxxxxx)日志功能,否则无法实现mysql的主从复制。因为mysql的整个主从复制过程实际上就是:slave端从master端获取binlog日志,然后再在自己身上完全顺序的执行该日志中所记录的各种SQL操作。 有关具体如何开启mysql的binlog日志功能,可以查看这篇文章《烂泥:学习mysql的binlog配置》。 MySQL主从复制的基本交互过程,如下: 1、slave端的IO线程连接上master端,并请求从指定binlog日志文件的指定pos节点位置(或者从最开始的日志)开始复制之后的日志内容。 2、master端在接收到来自slave端的IO线程请求后,通知负责复制进程的IO线程,根据slave端IO线程的请求信息,读取指定binlog日志指定pos节点位置之后的日志信息,然后返回给slave端的IO线程。该返回信息中除了binlog日志所包含的信息之外,还包括本次返回的信息在master端的binlog文件名以及在该binlog日志中的pos节点位置。 3、slave端的IO线程在接收到master端IO返回的信息后,将接收到的binlog日志内容依次写入到slave端的relaylog文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的master端的binlog文件名和pos节点位置记录到master-info(该文件存在slave端)文件中,以便在下一次读取的时候能够清楚的告诉master“我需要从哪个binlog文件的哪个pos节点位置开始,请把此节点以后的日志内容发给我”。 4、slave端的SQL线程在检测到relaylog文件中新增内容后,会马上解析该log文件中的内容。然后还原成在master端真实执行的那些SQL语句,并在自身按顺丰依次执行这些SQL语句。这样,实际上就是在master端和slave端执行了同样的SQL语句,所以master端和slave端的数据是完全一样的。 以上mysql主从复制交互过程比较拗口,理解起来也比较麻烦,我简化了该交互过程。如下: 1、master在执行sql之后,记录二进制log文件(bin-log)。 2、slave连接master,并从master获取binlog,存于本地relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步。 从以上mysql的Replication原理可以看出: * 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间主从数据不一致的情况。 * 如果主从的网络断开,则从库会在网络恢复正常后,批量进行同步。 * 如果对从库进行修改数据,那么如果此时从库正在在执行主库的bin-log时,则会出现错误而停止同步,这个是很危险的操作。所以一般情况下,我们要非常小心的修改从库上的数据。 * 一个衍生的配置是双主、互为主从配置,只要双方的修改不冲突,则可以工作良好。 * 如果需要多主库的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。
上一篇文章,我们讲解了如何通过mysql的binlog日志恢复mysql数据库,文章连接为《烂泥:通过binlog恢复mysql数据库》。其中我们提到了的备份数据库要晚与要恢复的数据库时间,即要恢复的数据库在前,而备份的数据库在后。 当时我提到说会单独写一篇文章讲解这个情况,本篇文章我就来介绍如何通过binlog日志恢复比备份数据库早时的数据库状态。我们还是以上篇文章的数据及备份文件为基础,来进行本篇文章的讲解。 ailanni数据库完整备份时,其数据库中有1、2、3、4,这四条数据。而此时mysql总共有三个binlog日志文件:mysql-bin.000001、mysql-bin.000002、mysql-bin.000003。其中在mysql-bin.000001中,我们向ilannitable表中插入两个数据1、2。在mysql-bin.000002中我们向ilannitable表中插入两个数据3、4。 现在我们要求把ailanni数据库恢复到插入数据3后,未插入数据4时的状态。即数据库ailanni中只有数据1、2、3,这三条数据。 分析:要达到上述的要求,我们需要使用到mysql-bin.000002,这个binlog日志文件。然后根据binlog日志恢复数据库使,可以指定pos位置节点的方法,来恢复ailanni数据库。 除此非常重要的是,我们还要先把ailanni数据库先恢复到完整备份时的状态,如果不先把ailanni数据库先恢复到完整备份时的状态,我们在使用binlog日志进行恢复时,系统会报错。 我们需要分以下几个步骤,可以恢复题目要求的ailanni数据库状态。如下: 1、 完整恢复ailanni数据库 2、 删除恢复后ailanni数据库中的全部数据 3、 通过binlog日志恢复ailanni数据库 一、完整恢复ailanni数据库 要完整恢复ailanni数据库,我们可以通过mysql命令来实现。但是在这之前,我们还要就有关ailanni数据库是否存在的情况要说明下。 如果目前mysql数据库服务器上有ailanni这个数据库,那么我们在恢复数据时,就不需要重新创建ailanni数据库。如果目前mysql数据库服务器上没有ailanni这个数据库,那么我们就需要重新创建一个空的ailanni数据库。即该数据库只是一个空的库,里面没有任何表或者其他的元素。 如果不创建ailanni数据库的话,我们在通过mysql命令恢复数据库时,系统就会报错,如下: 现在我们来执行mysql命令导入备份的sql文件,如下: create database ailanni; /usr/local/mysql/bin/mysql -uroot -p123456 ailanni</root/ailanni.sql mysql -uroot -p123456 use ailanni; select id from ilannitable; 通过上图,我们可以看到ailanni数据库已经完全恢复。 二、删除恢复后ailanni数据库中的全部数据 在第一步中我们已经把ailanni数据库全部恢复,现在我们需要清空ailanni数据库。如下: delete from ilannitable; select id from ilannitable; 通过上图,我们可以看到目前ailanni数据库中已经没有数据,是一个空的数据库。 三、通过binlog日志恢复ailanni数据库 第二步已经清空ailanni数据库,这样我们就可以通过mysql的binlog日志来恢复ailanni数据库。 也许你会问我们为什么要先完整恢复ailanni数据库,然后再把ailanni数据库清空? 这个是因为如果我们不先完整恢复ailanni数据库的话,我们在使用binlog进行恢复ailanni数据库时,系统会报错的。如下: 如果我们不清空ailanni数据库的话,你会发下恢复后的ailanni数据库,还是没有达到我们的要求。如下: 所以我们要进行第一、二步的操作。 现在我们来查看mysql-bin.000002文件,以确定ailanni数据库恢复的pos位置节点,如下: /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002 注意图中标记出来的数字304,这个就是binlog的pos节点位置。我们可以看到在该pos节点后mysql才执行插入数据4的SQL语句。那么我们只需要把数据恢复这个节点即可。 使用如下命令进行恢复数据,如下: /usr/local/mysql/bin/mysqlbinlog –stop-position=304 /usr/local/mysql/data/mysql-bin.000002 |mysql -uroot -p123456 通过上图,我们现在可以看到ailanni数据库已经恢复到插入数据3之后,未插入4的状态。现在ailanni数据库中确实只有1、2、3,这三条数据,已经达到我们的要求。 其实我们还可以这样说,目前只有mysql的所有binlog日志,而且还有一个比较完整的数据库备份,那么该如何恢复数据库呢? 按照上述方法也是可以恢复的。
在上一篇文章,我们讲解了有关mysql的binlog日志的基础知识。这篇文章,我们来讲解如何通过mysql的binlog日志来恢复数据库。 在使用binlog日志来恢复数据库之前,我们有一些前提工作需要做。步骤如下: 1、创建新的数据库ailanni 2、创建新的表ilannitable 3、向表ilannitable插入数据 4、刷新mysqlbin日志 5、完整备份ailanni数据库 6、删除表ilannitable插入的部分数据 7、删除数据库ailanni 8、各个binlog日志的内容解析 9、恢复ailanni全部数据 10、恢复ailanni数据库指定的部分 一、 创建新的数据库ailanni 使用以下命令创建数据库,如下: mysql –h 192.168.1.213 -uroot -p123456 create database ailanni; show databases; 二、 创建新的表ilannitable 使用以下命令创建表,如下: use ailanni; create table ilannitable(id int(4)); show tables; 三、 向表ilannitable插入数据 使用以下命令向表ilannitable中插入数据1、2,如下: insert into ilannitable values(1); insert into ilannitable values(2); select id from ilannitable; 四、 刷新mysqlbin日志 此时mysql的binlog日志文件只有一个mysql-bin.000001,如下: show master logs; 注意:此时mysql的binlog文件为mysql-bin.000001,并且数据库ailanni中只有1、2两条数据。如下: select id from ilannitable; 现在我们来刷新binlog日志,生成新的binlog日志文件mysql-bin.000002,如下: flush logs; show master logs; 现在我们再次向ailanni数据库中插入新的数据3、4,如下: insert into ilannitable values(3); insert into ilannitable values(4); 数据3、4插入完毕后,我们再次刷新binlog日志,生成新的binlog日志文件为mysql-bin.000003,如下: 现在我们总共有三个binlog日志文件:mysql-bin.000001、mysql-bin.000002、mysql-bin.000003。其中在mysql-bin.000001中,我们向ilannitable表中插入两个数据1、2。在mysql-bin.000002中我们向ilannitable表中插入两个数据3、4。 我们可以查看binlog中的内容如下: /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002 五、 完整备份ailanni数据库 现在我们来完整的备份ailanni数据库,使用mysqldump命令,如下: /usr/local/mysql/bin/mysqldump -uroot -p123456 ailanni >/root/ailanni.sql 查看备份文件是否与ailanni数据库的内容一致,如下: cat ailanni.sql 通过上图可知,备份的数据库文件与ailanni数据库的内容是一致的。 六、 删除表ilannitable插入的部分数据 在第三、四步中,我们向表ilannitable中插入了1、2、3、4四个数据。为了模拟在ailanni数据库被破坏后的实际情形,我们现在把ailanni数据库中的3这条数据给删除,如下: delete from ilannitable where id=3; 此时我们再次刷新binlog日志,生成新的binlog日志文件为mysql-bin.000004,如下: flush logs; show master logs; 七、 删除数据库ailanni 在第六步中,我们删除了数据记录3,现在我们来删除ailanni数据库。如下: drop database ailanni; show databases; 删除完毕后,我们再次刷新binlog日志,生成新的binlog日志文件为mysql-bin.000005,如下: flush logs; show master logs; 八、 各个binlog日志的内容解析 现在mysql的binlog日志文件有5个,从mysql-bin.000001到mysql-bin.000005,其中在mysql-bin.000001中我们向ilannitable表中插入了1、2两条数据。 在mysql-bin.000002中我们向ilannitable表中插入了3、4两条数据,在mysql-bin.000003中我们从表ilannitable删除了3这条数据。在mysql-bin.000004中我们把ailanni数据库给删除了。 各个binlog日志的SQL操作语句,如下: /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002 /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003 /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000004 九、 恢复ailanni全部数据 现在我们要恢复ailanni数据库,在此首先有关ailanni数据库是否存在的情况要说明下。 如果目前mysql数据库服务器上有ailanni这个数据库,那么我们在恢复数据时,就不需要重新创建ailanni数据库。如果目前mysql数据库服务器上没有ailanni这个数据库,那么我们就需要重新创建一个空的ailanni数据库。即该数据库只是一个空的库,里面没有任何表或者其他的元素。 如果不创建ailanni数据库的话,我们在通过mysql命令恢复数据库时,系统就会报错,如下: 在第五步时,我们备份的数据库是ailanni数据库全部的数据。如果要恢复ailanni数据库全部数据的话,我们只需要执行mysql命令导入备份的sql文件即可。如下: create database ailanni; /usr/local/mysql/bin/mysql -uroot -p123456 ailanni</root/ailanni.sql 查看恢复后的ailanni数据库是否和被删除之前的数据一样,如下: mysql -uroot -p123456 use ailanni; select id from ilannitable; 通过上图,我们可以很明显的看到目前ailanni数据库已经被全部恢复,而且数据一个也没有丢失。 十、 恢复ailanni数据库指定的部分 在通过mysql的binlog日志恢复数据库时,我们可以指定数据库恢复的位置、恢复的时间,同时也可以不指定数据库恢复的位置和时间。 有关mysqlbinlog命令的使用方法,我们可以通过mysqlbinlog的帮助命令进行查看,如下: /usr/local/mysql/bin/mysqlbinlog –help 注意图中标记出来的数字,其中1和2是表示通过binlog恢复数据的开始和结束时间,3和4表示的binlog恢复数据的开始和结束位置。 其中时间我们都知道,看下binlog的日志文件内容就知道了。而位置就是我们在前面查看各个binlog日志内容时标记出来的数字部分。如下: 图中被标出来的黄色部分数字5表示时间,6表示位置的节点,位置节点我们也称为binlog的pos点。 10.1不指定位置和时间来恢复数据库 我们先来测试不指定时间和位置来恢复数据库。 在第九步中我们恢复了ailanni全部的数据库,现在我们要求把数据库恢复到删除数据记录3时的状态。即ailanni数据库中只有1、2、4,这三条数据。这个时候我们就要根据mysql的binlog日志进行恢复,要不然达不到这个要求。 在第八步中我们已经分析了各个binlog日志中执行的SQL语句。根据分析,我们需要使用mysql-bin.000003这个binlog日志来恢复数据库。现在我们再次查看该binlog日志,如下: /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003 删除3这条数据后,ailanni数据库中的数据记录情况也就是我们恢复数据库后所要的状态。如下: 现在我们来通过mysqlbin来恢复删除3这条数据时的数据库,使用如下命令: /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003 |mysql -uroot -p123456 通过上图我们可以看到此时数据库ailanni已经恢复到删除数据3时的状态了,ailanni数据库中确实只有1、2、4,这三条数据。这样也达到我们的要求了。 重要说明: 通过上面的文章,我们知道现在ailanni数据库的情况是,已经恢复全部数据。 为了做下面的实验,我们就要把ailanni数据库恢复到还没有进行完全备份之前的状态,即ailanni数据库还没有数据的状态。我们需要做的是清空现在的ailanni数据库,保持ailanni是一个空的数据库。但是ailanni数据库的表结构、主键、外键等等信息都是完整的。 同时还要说明下:如果在同一个时间点,binlog日志中有执行过多条sql语句的话,那么我们在恢复数据库时,一定要根据pos点的位置来恢复数据,切记切记。因为此时在binlog日志中,时间节点是一样的,但是pos位置节点是唯一的。 因此在通过binlog恢复数据库时,强烈建议使用pos位置节点的方法来恢复数据。 清空ailanni数据库使用以下命令,如下: delete from ilannitable; select id from ilannitable; 有关这个情况,我会再写一篇文章。 现在我们得到的是一个没有数据的ailanni数据库,这样我们下面的实验就可以继续进行。 10.2指定时间来恢复数据库 要求恢复到删除数据记录3时的数据库。即数据库中只有1、2、4,这三条数据。 还是和10.1要求是一样的,但是这次我们根据时间点来恢复数据。我们也需要一个空的ailanni数据库,这个我们可以通过前面的说明可以得到。 现在我们再次查看mysql-bin.000003文件,如下: /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003 注意图中黄色部分标记出来的时间点,我们可以看到在这个时间点之后,数据3就被删除了。我们恢复数据,就恢复到这个时间点即可达到要求。使用以下命令进行恢复,如下: /usr/local/mysql/bin/mysqlbinlog –stop-datetime=’2014-11-17 11:30:43′ /usr/local/mysql/data/mysql-bin.000003 |mysql -uroot -p123456 mysql -uroot -p123456 use ailanni; select id from ilannitable; 通过上图,我们可以看到通过时间点来恢复数据库也达到我们的要求,并且ailanni数据库中确实只有1、2、4,这三条数据。 10.3指定位置来恢复数据库 要求把数据库ailanni恢复到插入数据3后,未插入数据4时的状态。即数据库ailanni中只有数据1、2、3,这三条数据。 分析要达到此要求,我们只能通过binlog日志的方式来恢复数据。根据第八步的binlog日志可以得知,要想恢复到此时的数据库,那么我们就要使用mysql-bin.000002这个日志文件。 要到达上述的目的,我们需要先来恢复数据1、2,使用mysql-bin.000001文件,如下: /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 |mysql -uroot -p123456 数据1、2恢复后,我们现在正式开始恢复插入数据3后,未插入数据4时的数据库。 再次查看mysql-bin.000002日志文件,如下: /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002 注意图中标记出来的数字304,这个就是binlog的pos节点位置。我们可以看到在该pos节点后mysql才执行插入数据4的SQL语句。那么我们只需要把数据恢复这个节点即可。 使用如下命令进行恢复数据,如下: /usr/local/mysql/bin/mysqlbinlog –stop-position=304 /usr/local/mysql/data/mysql-bin.000002 |mysql -uroot -p123456 通过上图,我们现在可以看到ailanni数据库已经恢复到插入数据3之后,未插入4的状态。现在ailanni数据库中确实只有1、2、3,这三条数据,已经达到我们的要求。 到此我们有关通过binlog日志恢复mysql数据库告一段落。
今天在ESXI上的一台windows系统的虚拟机(以下简称VM),突然nagios报警提示说:该机器发生故障。 既然问题出来了,就要解决。先在本机ping下那台VM,发现不能ping通。使用vsphere登录到ESXI,发现该VM还处于运行状态,但是无法远程进去,一直显示的是黑屏。 打算直接在ESXI上重启该机器,但是却提示如下的错误信息: 因为不想安装ESXI的其他管理工具,所以就打算通过ESXI的SSH直接重启VM。 通过SSH关闭VM有两种方法:一是使用ESXi命令行工具vim-cmd来关闭VM,二是通过系统发送信号关闭VM。 方法一、 我们先来介绍方法一,通过ssh终端登录到ESXI上。 第一、使用如下命令获取ESXI上的所有虚拟机清单,如下: vim-cmd vmsvc/getallvms 可以看到目前该ESXI上有5台VM。 第二、获取报错VM的当前状态: vim-cmd vmsvc/power.getstate VM_ID 可以看到目前该VM是处于运行状态的。 第三、使用第一步获取的VM_ID来关闭虚拟机: vim-cmd vmsvc/power.shutdown VM_ID 根据上图,我们发下还是无法关闭VM。我们可以使用以下命令,强制关闭虚拟机: vim-cmd vmsvc/power.off VM_ID 方法二、 现在我们来看方法二,要使用方法二关闭VM,我们要知道该ESXi上目前是否有VM正在运行,我们可以通过如下命令进行查看: ps |grep vmx 注意上图中,我标记出来的pid号。该pid就是该VM进程的父pid。我们只需把该进程父pid杀死即可关闭VM,如下: kill -9 9823 以上是就是在SSH下关闭ESXI的VM。那么下面我们通过SSH开启VM。命令如下: vim-cmd vmsvc/power.on VM_ID
1、基础知识 日志是把数据库的每一个变化都记载到一个专用的文件里,这种文件就叫做日志文件。mysql默认只开启错误日志,因为过多的日志将会影响系统的处理性能。 在mysql5.0以前版本支持文本格式和二进制格式的日志,但是在mysql5.0后版本就只支持二进制格式的日志。因为二进制日志在性能、信息处理等方面有更多的优点。 2、启用mysql二进制日志 mysql二进制日志由配置文件my.cnf的log-bin选项负责启用的。 mysql服务器默认会在数据根目录创建两个新文件:XXX-bin.000001和XXX-bin.index。若配置选项没有给出文件名,mysql将使用mysql-bin来命名这两个文件,其中.index文件包含一份完整的日志文件清单。如下: cat /etc/my.cnf ll /usr/local/mysql/data/ cat /usr/local/mysql/data/mysql-bin.index mysql会把用户对所有数据库的内容和结构的修改情况记入XXX-bin.n文件,但是不会记录SELECT和没有实际更新的UPDATE语句。 当然我们也可以同过相关命令查询,mysql是否已经开启binlog日志。如下: show variables like ‘log_%’; 3、binlog日志文件的生成 当mysql停止或重启时,服务器会把日志文件记入下一个日志文件,mysql会在重启时生成一个新的日志文件,文件序号依次递增。 如果日志文件超过max_binlog_size(在my.cnf文件中配置)系统变量配置的上限时,也会生成新的日志文件。 除此之外,如果在mysql命令中执行flush logs命令也会生成新的日志文件。 4、查看系统中的binlog日志 查看系统中的binlog日志,使用show master logs命令。如下: show master logs; 5、查看binlog日志文件 mysql提供了mysqlbinlog命令来查看日志文件,在记录每条变更日志的时候,日志文件都会把当前时间给记录下来,以便进行数据库恢复。如下: mysqlbinlog mysql-bin.000001| more 6、使用binlog日志进行数据库恢复 如果遇到灾难事件,应该用最近一次制作的完整备份恢复数据库,然后使用备份之后的binlog日志件把数据库恢复到最接近现在的可用状态。 使用binlog日志进行恢复时需要依次进行,即最早生成的日志文件要最先恢复。恢复数据的命令格式如下: mysqlbinlog xxx-bin.000001|mysql -u root –p password dataname 有关使用binlog进行数据库的恢复,可以看这篇文章《烂泥:通过binlog恢复mysql数据库》。 7、binlog命令行参数详解 log-bin [=file_name] 此参数表示启用binlog日志功能,并可以定制路径名称,默认为mysql-bin。 binlog_format 此参数配置binlog的日志格式,默认为mixed。 max_binlog_size此参数配置binlog的日志最大值,最大和默认值是1GB。 max_binlog_cache_size此参数表示binlog使用最大内存的数。 binlog-do-db=db_name 此参数表示只记录指定数据库的二进制日志。 binlog-ignore-db=db_name此参数表示不记录指定的数据库的二进制日志。 expire_logs_days 此参数表示binlog日志保留的时间,默认单位是天。 my.cnf配置文件有关binlog配置如下: cat /etc/my.cnf |grep -v ^#|grep -v ^$ 8、删除binlog日志 8.1删除部分binlog日志 删除binlog部分日志,我们可以日志名称和日志生成的时间来进行删除。删除命令如下: purge {master|binary} logs to ‘log_name’; 根据日志名称删除,只删除log_name之前的日志,log_name本身不会被删除。 通过上图我们可以看到,mysql-bin.000003之前的日志已经被全部删除。 purge {master|binary} logs before ‘date’; 根据日志生成的时间删除,只删除date之前的日志,date本身不会被删除。 8.2删除全部binlog日志 删除之前所有的binlog日志,并重新生成新的binlog,后缀从000001开始。使用命令: reset master;
-------------------------
-------------------------