Rootop 服务器运维与web架构

2014-05-19
发表者 Venus
暂无评论

CentOS6.5下安装Redis-2.8.9

Redis是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。
它提供了Python,Ruby,Erlang,PHP客户端,支持复制。
目前最新版本为:redis-2.8.9
下载地址:http://download.redis.io/releases/redis-2.8.9.tar.gz
安装:
[root@localhost ~]# yum install -y gcc gcc-c++ tcl
[root@localhost redis-2.8.9]# make
[root@localhost redis-2.8.9]# make test #检查是否有错误

 328 seconds - unit/memefficiency

\o/ All tests passed without errors!

Cleanup: may take some time... OK
make[1]: Leaving directory `/root/redis-2.8.9/src'

如果看到上面几行信息,表明通过。
因为redis不支持configure配置预配置环境,所以为了管理方便,手动创建redis家目录用来存放命令和配置文件。
[root@localhost redis-2.8.9]# mkdir -p /usr/local/redis/bin
[root@localhost redis-2.8.9]# mkdir /usr/local/redis/conf
[root@localhost redis-2.8.9]# cd src/
[root@localhost src]# cp redis-benchmark redis-check-aof redis-check-dump redis-sentinel redis-server redis-cli /usr/local/redis/bin/ #相关命令
[root@localhost src]# cd .. && cp redis.conf /usr/local/redis/conf/ #拷贝主配置文件

修改配置文件:
[root@localhost ~]# vi /usr/local/redis/conf/redis.conf
daemonize yes #no改为yes,启动守护进程。
保存退出,启动redis。
[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
[root@localhost ~]# lsof -i:6379 #6379为redis默认监听端口
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 7324 root 4u IPv6 22814 0t0 TCP *:6379 (LISTEN)
redis-ser 7324 root 5u IPv4 22816 0t0 TCP *:6379 (LISTEN)

测试:
redis自带命令行工具,也可以通过telnet到端口测试。
[root@localhost ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> set test rootop
OK
127.0.0.1:6379> get test
“rootop”
127.0.0.1:6379> exit

redis配置参数详解:
daemonize
如果值是“yes”,则启动服务的时候是后台守护进程形式,如果值是“no”,则相反

pidfile
指定存储Redis进程号的文件路径

port
指定当前Redis服务的端口,默认为6379

tcp-backlog
此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。

timeout
客户端和Redis服务端的连接超时时间,默认是0,表示永不超时。

tcp-keepalive
如果值非0,单位是秒,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,避免服务器一直阻塞,官方给出的建议值是60S。

loglevel
Redis总共支持四个级别:debug、verbose、notice、warning。
Debug:记录很多信息,用于开发和测试;
Varbose:有用的信息,不像debug会记录那么多;
Notice:普通的verbose,常用于生产环境;
Warning:只有非常重要或者严重的信息会记录到日志;
默认是notice级别。

logfile
日志的存储路径

databases
可用的数据库数,默认值为16,默认数据库为0,数据库范围在0-(database-1)之间,个人觉得DB的概念类似于命名空间

save
保存数据库快照信息到磁盘,其对应的值有两个,比如save 300 10表示:300秒内至少有300个key被改变时,触发保存信息到磁盘的事件。

stop-writes-on-bgsave-error
当持久化出现错误之后,是否继续提供写服务

rdbcompression
持久化到RDB文件时,是否压缩,“yes”为压缩,“no”则反之

rdbchecksum
读取和写入的时候是否支持CRC64校验,默认是开启的

dbfilename
镜像文件的名字

dir
当前工作目录,配置文件和镜像文件等都在此目录下

masterauth
设置访问master服务器的密码

slave-serve-stale-data
当slave服务器和master服务器失去连接后,或者当数据正在复制传输的时候,如果此参数值设置“yes”,slave服务器可以继续接受客户端的请求,否则,会返回给请求的客户端如下信息“SYNC with master in progress”

slave-read-only
是否允许slave服务器节点只提供读服务

repl-disable-tcp-nodelay
指定向slave同步数据时,是否禁用socket的NO_DELAY选项。若配置为“yes”,则禁用NO_DELAY,则TCP协议栈会合并小包统一发送,这样可以减少主从节点间的包数量并节省带宽,但会增加数据同步到slave的时间。若配置为“no”,表明启用NO_DELAY,则TCP协议栈不会延迟小包的发送时机,这样数据同步的延时会减少,但需要更大的带宽。通常情况下,应该配置为no以降低同步延时,但在主从节点间网络负载已经很高的情况下,可以配置为yes。

slave-priority
指定slave的优先级。在不只1个slave存在的部署环境下,当master宕机时,Redis Sentinel会将priority值最小的slave提升为master。需要注意的是,若该配置项为0,则对应的slave永远不会自动提升为master。

appendonly
开启append only 模式之后,redis 会把所接收到的每一次写操作请求都追加到appendonly.aof 文件中,当redis 重新启动时,会从该文件恢复出之前的状态。但是这样会造成appendonly.aof 文件过大,所以redis 还支持了BGREWRITEAOF 指令,对appendonly.aof 进行重新整理。默认是不开启的。

appendfilename
默认为appendonly.aof。

appendfsync
设置aof的同步频率,有三种选择always、everysec、no,默认是everysec表示每秒同步一次。

no-appendfsync-on-rewrite
指定是否在后台aof文件rewrite期间调用fsync,默认为no,表示要调用fsync(无论后台是否有子进程在刷盘)。Redis在后台写RDB文件或重写afo文件期间会存在大量磁盘IO,此时,在某些linux系统中,调用fsync可能会阻塞。

auto-aof-rewrite-percentage
指定Redis重写aof文件的条件,默认为100,表示与上次rewrite的aof文件大小相比,当前aof文件增长量超过上次afo文件大小的100%时,就会触发background rewrite。若配置为0,则会禁用自动rewrite

auto-aof-rewrite-min-size
指定触发rewrite的aof文件大小。若aof文件小于该值,即使当前文件的增量比例达到auto-aof-rewrite-percentage的配置值,也不会触发自动rewrite。即这两个配置项同时满足时,才会触发rewrite。

lua-time-limit
一个Lua脚本最长的执行时间,单位为毫秒,如果为0或负数表示无限执行时间,默认为5000

notify-keyspace-events

aof-rewrite-incremental-fsync
aof rewrite过程中,是否采取增量文件同步策略,默认为“yes”。 rewrite过程中,每32M数据进行一次文件同步,这样可以减少aof大文件写入对磁盘的操作次数

2014-05-15
发表者 Venus
暂无评论

Nginx用log_format设置日志格式

编辑 /usr/local/nginx/conf/nginx.conf 配置文件:

log_format www.rootop.org '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" $http_x_forwarded_for';

 server
 {
 listen 80;
 server_name www.rootop.org;
 index index.html index.htm index.php;
 root /mnt/data/web/www.rootop.org;

 location ~ .*\.(php|php5)?$
 {
 try_files $uri =404;
 fastcgi_pass unix:/tmp/php-cgi.sock;
 fastcgi_index index.php;
 include fcgi.conf;
 }

 location ~ .*\.(js|css)?$
 {
 expires 12h;
 }

 location ~* \.(jpg|gif|png|sh|zip|rar)$
 {
 expires 30d;
 valid_referers none blocked *.rootop.org rootop.org;
 if ($invalid_referer) {
 rewrite ^/ http://imgs.rootop.org/images/denylink.jpg;
 }
 }

 access_log /var/logs/www.rootop.org.log www.rootop.org;

 }

相关说明解释
1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
2.$remote_user :用来记录客户端用户名称;
3.$time_local : 用来记录访问时间与时区;
4.$request : 用来记录请求的url与http协议;
5.$status : 用来记录请求状态;成功是200,
6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
7.$http_referer :用来记录从那个页面链接访问过来的;
8.$http_user_agent :记录客户端浏览器的相关信息;

Nginx作为Web服务器,位于负载均衡设备、Squid、Nginx反向代理之后,就不能获取到客户端的真实IP地址。
原因是经过反向代理后,由于在客户端和Web服务器之间增加了中间层,因此Web服务器无法直接拿到客户端的IP。
通过$remote_addr变量拿到的将是反向代理服务器的IP地址。但是反向代理服务器在转发请求的HTTP头信息中,
可以增加X-Forwarded-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址。
这时候,就要用log_format指令设置日志格式,让日志记录X-Forearded-For信息中的IP地址,即客户的真实IP。

2014-05-14
发表者 Venus
暂无评论

linux创建带特殊符号的文件夹

比如说创建一个-test文件夹,在mkdir的时候,命令会认为-a是一个参数,当成参数执行的话会报错:

[root@localhost tmp]# mkdir -test
mkdir: invalid option -- 't'
Try `mkdir --help' for more information.

无效选项,那么这样一来需要通过某种方式,让命令不会认为其是一个参数:
这里想到了个方法,用绝对路径或者是相对路径。
比如:

[root@localhost tmp]# mkdir /tmp/-test
[root@localhost tmp]# ll
total 4
drwxr-xr-x 2 root root 4096 May 14 17:30 -test
[root@localhost tmp]#

或者:

[root@localhost tmp]# mkdir ./-test2
[root@localhost tmp]# ll
total 8
drwxr-xr-x 2 root root 4096 May 14 17:30 -test
drwxr-xr-x 2 root root 4096 May 14 17:31 -test2
[root@localhost tmp]#

这样通过绝对路径或者相对路径就可以创建特殊字符的文件夹了。
删除的话,也是如此。

[root@localhost tmp]# rm -rf /tmp/*
[root@localhost tmp]# ll
total 0
[root@localhost tmp]#

2014-05-14
发表者 Venus
暂无评论

ntop监控网络流量

NTOP是一种网络嗅探器,MRTG基于SNMP获取信息,能够更加直观地将网络
使用量的情况和每个节点计算机的网络带宽使用详细情况显示出来。
NTOP提供以下一些功能:
① 自动从网络中识别有用的信息;
② 将截获的数据包转换成易于识别的格式;
③ 对网络环境中的通信失败进行分析;
④ 探测网络环境下的通信瓶颈;
⑤ 记录网络通信时间和过程;
⑥ 自动识别客户端正在使用的操作系统;
⑦ 可以在命令行和Web两种方式下运行。

目前市场上可网管型的交换机、路由器都支持SNMP,NTOP支持简单网络管理协议,所以可以进行网络流量监控。
NTOP几乎可以监测网络上的所有协议:TCP/UDP/ICMP, (R)ARP, IPX, Telnet, DLC, Decnet, DHCP-BOOTP
AppleTalk, Netbios, TCP/UDP, FTP, HTTP, DNS, Telnet, SMTP/POP/IMAP, SNMP, NNTP, NFS, X11
SSH和基于P2P技术的协议eDonkey, Overnet, BitTorrent, Gnutella (Bearshare, Limewire,etc), Kazaa, Imesh, Grobster。

在早期是通过rrdtool和ntop结合,目前最新版本为ntopng,名字已经改为ntopng,安装应该相对简单。不过我这里依旧采用老方法安装,新版本回头再装一下。

ntop最后一个版本:ntop-5.0.1 发布日期:2012-08-13
http://oss.oetiker.ch/rrdtool/pub/rrdtool.tar.gz
http://nchc.dl.sourceforge.net/project/ntop/ntop/Stable/ntop-5.0.1.tar.gz
http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz  #编译ntop时会用到

安装编译环境:

[root@localhost ~]# yum install -y libtool automake autoconf subversion libpcap libpcap-devel python python-devel libpng gdbm gd gd-devel libxml2 libxml2-devel glib2 glib2-devel pango pango-devel

安装rrdtool(绘图)

[root@localhost rrdtool-1.4.8]# ./configure --prefix=/usr/local/
[root@localhost rrdtool-1.4.8]# make && make install

安装ip地址库:

[root@localhost GeoIP-1.4.8]# ./configure
[root@localhost GeoIP-1.4.8]# make && make install

安装ntop(过程好奇葩啊···)

[root@localhost ntop-5.0.1]# sh autogen.sh --with-tcpwrap
[root@localhost ntop-5.0.1]# make && make install

得到一个提示:
************************************************************
************************************************************

WARNING: This install created a directory for the ntop
files and databases:

/usr/local/share/ntop

This directory MUST be owned by the user
which you are going to use to run ntop.

The command you must issue is something like:

chown -R ntop.ntop /usr/local/share/ntop
or chown -R ntop:users /usr/local/share/ntop

man chown to check the syntax for YOUR system

************************************************************
************************************************************

echo “Shall you be using SELinux please run:”
Shall you be using SELinux please run:
echo “make install-selinux-policy”
make install-selinux-policy
说需要修改/usr/local/share/ntop权限,看意思还支持selinux开启状态下的支持。

[root@localhost ntop-5.0.1]# chown -R nobody /usr/local/share/ntop/ #必须修改为ntop运行账户
[root@localhost ntop-5.0.1]# ntop -A #设置admin用户密码

Wed May 14 13:50:14 2014 Initializing gdbm databases
Wed May 14 13:50:14 2014 Setting administrator password…

ntop startup – waiting for user response!

Please enter the password for the admin user:
Please enter the password again:
Wed May 14 13:50:19 2014 Admin user password has been set
Wed May 14 13:50:19 2014 Admin password set…

因为编译的时候开启了tcp wrapper,所以通过修改tcp wrapper进行访问控制:

[root@localhost ~]# echo "ntop:192.168.0.123" >> /etc/hosts.allow #允许192.168.0.123访问
[root@localhost ~]# echo "ntop:All" >> /etc/hosts.deny     #拒绝其他

启动ntop服务:

[root@localhost ~]# ntop -d -i eth0   #-d 守护进程 -i指定检测网卡,多块网卡通过逗号隔开ntop -d -i eth0,eth1 -M

ntop参数:
-c / –sticky-hosts   保留非活动主机的记录
-P / –db-file-path   指定新的数据存放记录
-u / –user                 指定运行程序的用户身份
-b / –disable-decoders       关闭协议解码器
-n / –numeric-ip-address  使用数字形式的主机标识(不做NDS解析)
-w / –http-server               指定监听HTTP访问的端口(默认为3000)

访问:
通过浏览器访问 http://IPADDRESS:3000/ 即可。
安装完成后,试用了一下,比较适合做局域网的流量监控、分析网络协议什么的。

2014-05-13
发表者 Venus
暂无评论

linux下安装mongodb非关系型数据库

MongoDB简介
MongoDB是一个高性能,开源,无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发,官方网站地址是:http://www.mongodb.org/

NoSql,全称是 Not Only Sql,指的是非关系型的数据库。
下一代数据库主要解决几个要点:非关系型的、分布式的、开源的、水平可扩展的。原始的目的是为了大规模web应用。通常特性应用如:模式自由、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等。NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。

特点:
高性能、易部署、易使用,存储数据非常方便。
主要功能特性有:
面向集合存储,易存储对象类型的数据。
模式自由。
支持动态查询。
支持完全索引,包含内部对象。
支持查询。
支持复制和故障恢复。
使用高效的二进制数据存储,包括大型对象(如视频等)。
自动处理碎片,以支持云计算层次的扩展性
支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。
文件存储格式为BSON(一种JSON的扩展)。
可通过网络访问。

功能:
面向集合的存储:适合存储对象及JSON形式的数据。
动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。

适用场合:
网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。

系统环境:centos6.5_x64
安装:
下载mongodb(支持windows、linux、mac、Solaris):
linux64位下载:http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.1.tgz

[root@localhost ~]# wget -c http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.1.tgz
[root@localhost ~]# tar zxvf mongodb-linux-x86_64-2.6.1.tgz
[root@localhost ~]# cp -R mongodb-linux-x86_64-2.6.1 /usr/local/mongodb/ #mongodb不需要编译,解压后是可执行文件。
[root@localhost ~]# mkdir /usr/local/mongodb/data #创建数据存放路径
[root@localhost ~]# mkdir /usr/local/mongodb/logs #日志存放路径
[root@localhost ~]# /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/logs/mongodb.log --logappend &
[root@localhost ~]# lsof -i:27017
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mongod  26578 root    8u  IPv4  76661      0t0  TCP *:27017 (LISTEN)
[root@localhost ~]# echo "/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/logs/mongodb.log --logappend &" >> /etc/rc.local #开机启动

至此mongodb安装完成。

安装php的mongodb扩展模块:
在php源码包中是没有mongodb扩展的,需要单独从github下载:
各版本下载地址:https://github.com/mongodb/mongo-php-driver/releases
最新linux版本:mongo-php-driver-1.5.2.tar.gz
如果php是yum安装,那么需要安装php-devel包中的phpize命令:

[root@localhost ~]# yum install -y php-devel
[root@localhost ~]# tar zxvf mongo-php-driver-1.5.2.tar.gz
[root@localhost ~]# cd mongo-php-driver-1.5.2
[root@localhost mongo-php-driver-1.5.2]# phpize #生成预配置环境
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
[root@localhost mongo-php-driver-1.5.2]# ./configure
[root@localhost mongo-php-driver-1.5.2]# make && make install
Installing shared extensions:     /usr/lib64/php/modules/

编辑php.ini配置文件,加载php模块路径:
[root@localhost ~]# vi /etc/php.ini
extension_dir = /usr/lib64/php/modules/  #指定php模块路径
编辑/etc/php.d/json.ini:
[root@localhost ~]# vi /etc/php.d/json.ini
extension=mongo.so #添加加载模块

至于为什么要编辑/etc/php.d/json.ini ?是因为之前是yum装的php,重启web服务后,默认先去读/etc/php.ini,再去/etc/php.d/下读配置文件。导致json.so模块加载顺序落后于mongo.so模块。但是mongo.so需要json.so的支持,由于顺序颠倒导致php无法正确加载mongo.so模块。如果是源码编译的php,一般不会出现这种情况。接着重启web服务。service httpd restart

[root@localhost ~]# php -m | grep mongo  #查看模块已加载
mongo

通过phpinfo就可以看到模块信息了。

json.so落后于mongo.so模块加载时的报错信息:
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules/mongo.so’ – /usr/lib64/php/modules/mongo.so: undefined symbol: php_json_encode in Unknown on line 0