Rootop 服务器运维与web架构

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

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

nagios添加图表(小太阳)支持

nagios监控服务器只显示当前的信息,没有图表功能,不能查看历史状态,为了解决这个问题
需要安装PNP来实现这个功能,pnp基于PHP和Perl可以利用rrdtool工具将Nagios采集的数据绘制成图表显示主机或服务在一段时间内的运行情况。

系统环境:
centos6.4_x64,selinux关闭,iptables关闭。

下载rrdtool:
http://oss.oetiker.ch/rrdtool/pub/rrdtool.tar.gz
下载pnp:
wget -c http://nchc.dl.sourceforge.net/project/pnp4nagios/PNP/pnp-0.4.14/pnp-0.4.14.tar.gz

安装rrdtool和pnp需要几个rpm包支持,有gd、gd-devel、zlib、zlib-devel、pango、pango-devel、perl-devel、perl-CPAN、perl-Time-HiRes

[root@localhost rrdtool-1.4.8]# yum install pango pango-devel perl-devel perl-CPAN perl-Time-HiRes -y  #其它的包之前已经装过
[root@localhost rrdtool-1.4.8]# ./configure --prefix=/usr/local/rrdtool
[root@localhost rrdtool-1.4.8]# make && make install

安装pnp:
在安装pnp之前需要执行一个命令来检查是否有相关模块:

[root@localhost pnp-0.4.14]# perl -MRRDs -le 'print q(ok!)'
Can't locate RRDs.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .).
BEGIN failed--compilation aborted.

提示找不到RRDs.pm,通过软链接解决:

[root@localhost pnp-0.4.14]# ln -s /usr/local/rrdtool/lib/perl/5.10.1/x86_64-linux-thread-multi/RRDs.pm /usr/lib64/perl5/

再次检查,出现另一个错误:

[root@localhost pnp-0.4.14]# perl -MRRDs -le 'print q(ok!)'
Can't locate loadable object for module RRDs in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at -e line 0
Compilation failed in require.
BEGIN failed--compilation aborted.

提示库文件找不到,解决办法:

[root@localhost pnp-0.4.14]# ln -s /usr/local/rrdtool/lib/perl/5.10.1/x86_64-linux-thread-multi/auto/RRDs/RRDs.so /usr/lib64/perl5/
[root@localhost pnp-0.4.14]# perl -MRRDs -le 'print q(ok!)'  #重新检查,通过。
ok!
[root@localhost pnp-0.4.14]# mkdir /usr/local/nagios/share/perfdata  #保存RRD Database Files
[root@localhost pnp-0.4.14]# ./configure --with-nagios-user=nagios --with-nagios-group=nagios --with-rrdtool=/usr/local/rrdtool/bin/rrdtool --with-perfdata-dir=/usr/local/nagios/share/perfdata --with-perl_lib=/usr/local/rrdtool/lib/perl/5.10.1/x86_64-linux-thread-multi/
[root@localhost pnp-0.4.14]# make all
[root@localhost pnp-0.4.14]# make install
[root@localhost pnp-0.4.14]# make install-config
[root@localhost pnp-0.4.14]# make install-init

配置pnp:
在PNP安装完成后,默认安装目录下自带了模板配置文件,只需将模板文件全部复制一份即可。

[root@localhost pnp-0.4.14]# cd /usr/local/nagios/etc/pnp/
[root@localhost pnp]# ls
background.pdf  check_commands  config.php  npcd.cfg-sample  pages  pnp4nagios_release  process_perfdata.cfg-sample  rra.cfg-sample
[root@localhost pnp]# cp process_perfdata.cfg-sample process_perfdata.cfg
[root@localhost pnp]# cp npcd.cfg-sample npcd.cfg
[root@localhost pnp]# cp rra.cfg-sample rra.cfg
[root@localhost pnp]# chown nagios:nagios *  #将所有配置文件属主属组都改为nagios运行账户nagios

编辑process_perfdata.cfg:
LOG_LEVEL = 2 #把0改为2
修改nagios配置文件来增加小太阳图标:
修改templates.cfg,增加一个定义PNP的host和service。

[root@localhost ~]# vi /usr/local/nagios/etc/objects/templates.cfg
#pnp host definition
define host {
        name                            hosts-pnp
        register                        0
        action_url                      /nagios/pnp/index.php?host=$HOSTNAME$
        process_perf_data               0
}
#pnp service
define service {
        name                            services-pnp
        register                        0
        action_url                      /nagios/pnp/index.php?host=$HOSTNAME$&srv=$SERVICEDESC$
        process_perf_data               0
}

修改nagios.cfg:

[root@localhost ~]# vi /usr/local/nagios/etc/nagios.cfg
process_performance_data=1  #0改为1
host_perfdata_command=process-host-perfdata  #将前面的注释去掉
service_perfdata_command=process-service-perfdata

修改commands.cfg:
process-host-perfdata和process-service-perfdata指令声明了nagios输出哪些值到输出文件中。不过这些定义相对简单,而PNP提供了一个Perl脚本,非常详细地定义了一个输出数据的方法,process_perfdata.pl就是PNP自带的一个脚本,这个脚本在PNP安装完成后会自动生成。因此可以将process-host-perfdata和process-service-perfdata指令中对应的执行命令的内容替换成此脚本。

[root@localhost ~]# vi /usr/local/nagios/etc/objects/commands.cfg
# 'process-host-perfdata' command definition
define command{
        command_name    process-host-perfdata        command_line    /usr/local/nagios/libexec/process_perfdata.pl
        }


# 'process-service-perfdata' command definition
define command{
        command_name    process-service-perfdata        command_line    /usr/local/nagios/libexec/process_perfdata.pl
        }

修改hosts.cfg文件和services.cfg文件:
将hosts-pnp和services-pnp引用到hosts.cfg和services.cfg中

define host{
        use                     linux-server,hosts-pnp            ; Name of host template to use
                                                        ; This host definition will inherit all variables that are defined
                                                        ; in (or inherited by) the linux-server host template definition.
        host_name               localhost
        alias
        address                 127.0.0.1
        }

define service{
        use                             local-service,services-pnp         ; Name of service template to use
        host_name                       localhost
        service_description             PING
        check_command                   check_ping!100.0,20%!500.0,60%
        }

重启nagios服务。
完成。

PS:
编译rrdtool时的一个错误,因为当时没安装pango和pango-devel包。

configure: error: Please fix the library issues listed above and try again
[root@localhost rrdtool-1.4.8]# yum install pango pango-devel -y

编译rrdtool时在make的时候一个报错,因为当时没安装perl-devel perl-CPAN:

Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 1.
BEGIN failed--compilation aborted at Makefile.PL line 1.

解决方法:
[root@localhost rrdtool-1.4.8]# yum install -y perl-devel perl-CPAN
重新configure

如果不通过perl -MRRDs -le ‘print q(ok!)’来检查环境,可能在编译安装pnp的时候报错:
WARNING: The RRDs Perl Modules are not found on your system
Using RRDs will speedup things in larger installations.

安装pnp,在configure时一个报错,因为最开始的时候没有安装perl-Time-HiRes:
checking for Perl Module Time::HiRes… no
configure: error: Perl Module Time::HiRes not available
解决办法:
[root@localhost pnp-0.4.14]# yum install -y perl-Time-HiRes