Cacti安装配置

Nagios安装配置

下载Cacti
Linux安装Cacti

监控软件Cacti搭建

环境准备

安装epel扩展源

1
yum install -y epel-release

搭建lamp环境

1
[root@cacti ~]# yum install -y  httpd php php-mysql mysql mysql-server mysql-devel php-gd  libjpeg libjpeg-devel libpng-devel
1
2
3
4
5
6
7
/etc/init.d/httpd start
/etc/init.d/mysqld start
#初始化mysql
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h cacti password 'new-password'
#或者
/usr/bin/mysql_secure_installation

服务端

安装cacti监控主机

1
yum install -y cacti  net-snmp  net-snmp-utils  rrdtool net-snmp-devel net-snmp-libs lm-sensors php-xml zlib libpng freetype cairo-devel pango-devel gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/etc/init.d/snmpd start
#新建cacti数据库
mysql -u root
mysql> create database cacti;
mysql> grant all on cacti.* to 'cactiuser'@'localhost' identified by 'cactiuser';
mysql> exit
#导入cacti数据库结构
mysql -u root cacti < /usr/share/doc/cacti-0.8.8b/cacti.sql
#设置cacti配置文件中的mysql数据库账号密码
vim /usr/share/cacti/include/config.php
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "cactiuser";
$database_port = "3306";
$database_ssl = false;

#修改httpd中的cacti配置
vim /etc/httpd/conf.d/cacti.conf
Deny from all 修改为 Allow from all
#重启httpd
/etc/init.d/httpd restart

通过浏览器访问
如果访问不了,请检查主机的iptables和selinux
到了登陆,默认的账号为admin,密码为admin
登陆之后,系统会强制用户更改密码
点击graphs-Default Tree-Host Localhost,进入系统监控界面
我们看到监控界面,没有出图,设置一下出图

1
2
3
4
5
6
7
8
9
10
11
/usr/bin/php /usr/share/cacti/poller.php 
OK u:0.00 s:0.00 r:0.00
OK u:0.00 s:0.00 r:0.01
OK u:0.00 s:0.00 r:0.03
OK u:0.00 s:0.00 r:0.05
OK u:0.00 s:0.00 r:0.08
06/13/2015 09:59:49 PM - SYSTEM STATS: Time:0.1974 Method:cmd.php Processes:1 Threads:N/A Hosts:2 HostsPerProcess:2 DataSources:5 RRDsProcessed:5

crontab -e
# 让命令每5分钟执行一次
*/5 * * * * /usr/bin/php /usr/share/cacti/poller.php > /dev/null 2>&1

我们在刷新一下,图就出来了, 数据需要等待一会儿,才能出来

接下来我们添加被监控的主机

客户端

在被监控的主机上安装

1
yum install -y net-snmp lm_sensors

vim /etc/snmp/snmpd.conf

1
2
3
4
5
6
7
#syslocation Unknown (edit /etc/snmp/snmpd.conf)
syslocation 192.168.1.118

# group context sec.model sec.level prefix read write notif
access notConfigGroup "" any noauth exact all none none

view all included .1 80 去掉注释符“#”

启动 snmpd

1
/etc/init.d/snmpd start

使用

  • 依次点击console -> Devices -> add,添加主机
  • 开始添加被监控主机的信息,填写完毕,点击Create
  • 创建完毕,看是否通信正常,创建完主机,创建要监控的项目点击 Create Graphs for this Host,
  • 根据需要,去选择要监控的项目
  • 监控项目添加完毕,将主机添加到监控主干线上,点击左侧Graph Trees
  • 点击Add,添加被监控的主机
    • 类型选择Host,再选择要添加的主机
    • 添加完毕,点击Save
  • 到主界面查看,是否添加成功,最好在监控服务器上刷新一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/usr/bin/php /usr/share/cacti/poller.php --force
OK u:0.00 s:0.00 r:0.00
OK u:0.00 s:0.00 r:0.01
OK u:0.00 s:0.00 r:0.03
OK u:0.00 s:0.00 r:0.05
OK u:0.00 s:0.00 r:0.08
OK u:0.00 s:0.00 r:0.09
OK u:0.00 s:0.00 r:0.09
OK u:0.00 s:0.00 r:0.09
OK u:0.00 s:0.00 r:0.09
OK u:0.00 s:0.00 r:0.09
OK u:0.00 s:0.00 r:0.09
OK u:0.00 s:0.00 r:0.09
OK u:0.00 s:0.00 r:0.09
OK u:0.00 s:0.00 r:0.09
OK u:0.00 s:0.00 r:0.09
OK u:0.00 s:0.00 r:0.09
OK u:0.00 s:0.00 r:0.10
06/13/2015 05:16:53 PM - SYSTEM STATS: Time:0.2109 Method:cmd.php Processes:1 Threads:N/A Hosts:3 HostsPerProcess:3 DataSources:20 RRDsProcessed:17

成功添加!!

CentOS7 Shadowsocks配置文档

Shadowsocks服务器配置文档

为Debian / Ubuntu 安装shadowsocks服务端:
apt-get install python-pip
pip install shadowsocks
为CentOs 安装shadowsocks服务端;
yum install python-setuptools
easy_install pip
pip install shadowsocks

在 /etc目录下创建 shadowsocks.json 文件,将下面的内容放进去:
{
“server”:”my_server_ip”,
“server_port”:8388,
“local_address”: “127.0.0.1”,
“local_port”:1080,
“password”:”mypassword”,
“timeout”:300,
“method”:”aes-256-cfb”,
“fast_open”: false,
“workers”: 1
}

每个字段的的解释:
server 服务端监听的地址,服务端可填写 0.0.0.0
server_port 服务器的端口(只要不与现有的端口冲突,随你填写了,我填8137)
local_address 本地监听的地址,直接写127.0.0.1
local_port 本地的端口,随便写,只要不冲突,我填的是1345
password 你的shadowsocks连接密码
timeout 超时时间,单位秒
method 加密方式。默认是: “aes-256-cfb”, 详见:see https://github.com/clowwindy/shadowsocks/wiki/Encryption
workers 应该是进程数,这个我没该,大家可以改后看看进程是否增多。不理解的化,就别改了,这个参数只有unix/linux下可用。
然后启动运行 shadowsocks服务器端:
ssserver -c /etc/shadowsocks.json
此时不要关闭终端命令操作窗口,

后台运行
CentOS:
运行命令:
sudo yum install python-pip supervisor
sudo pip install shadowsocks
编辑 /etc/supervisord.conf 在末尾添加:
[program:shadowsocks]
command=ssserver -c /etc/shadowsocks.json
autorestart=true
user=nobody
运行:
sudo chkconfig –add supervisord //添加开机启动supervisor服务守护进程 systemctl enable supervisord.service
sudo chkconfig supervisord on
service supervisord start //官方Git上的写错了,将“supervisord”少了个d,否则提示supervisor: unrecognized service,意思是不能识别该服务
supervisorctl reload //可以通过该命令重启shadowsocks。
Supervisord 是后台管理服务器, 用来依据配置文件的策略管理后台守护进程, 它会随系统自动启动
Supervisorctl 用于管理员向后台管理程序发送 启动/重启/停止 等指令;
下面一步貌似可有可无,我没在iptables上加这条规则,没遇到问题:
-A INPUT -m state –state NEW -m tcp -p tcp –dport your_server_port -j ACCEPT
//其中的your_server_port表示你刚才的shadowsocks的服务器的端口。表示允许连接vps的这个端口。

Rsync 配置

Rsync

简介

rsync是linux下的文件同步服务,功能简单来说就是服务端打开873端口,客户端连接这个端口,并对服务器端配置的目录进行同步,可以理解为客户端比对服务器端资源后,对增量或者差异的数据进行增删改操作,功能支持上传(推送)或下载(获取)比对,也就是远程数据比对本地数据而后对远程数据进行增删改操作,以及本地数据比对远程数据然后对本地数据进行增删改操作。
centos6.3下默认已经安装,只需保证依赖服务xinetd开启即可。

配置

首先关闭selinux与iptables

1
2
3
4
5
6
# vi /etc/sysconfig/selinux
---------
SELINUX=disabled
---------
# setenforce 0
# service iptables stop

配置分为2个部分

server端:

  1. 安装rsync(centos6.3默认已安装)
1
2
# yum install rsync -y
# yum install xinetd -y
  1. 启动rsync依赖服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# /etc/init.d/xinetd start
# chkconfig xinetd on
3.配置/etc/rsyncd.conf
----------------------
uid = root
gid = root
use chroot = no
max connections = 10
strict modes = yes
port = 873
address = 172.24.40.30
[mail]
path = /home/domains/
comment = mirror for extmail
ignore errors
read only = no
list = no
auth users = user
secrets file = /etc/rsync.pas
hosts allow = 172.24.40.50
hosts deny = 0.0.0.0/0
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
--------------------------
# 表示可写
read only = no
# 端口
port = 873
  1. 配置/etc/rsync.pas
    在服务器端,必须加入登陆名和密码,在client上,只需要输入密码
1
2
3
4
5
6
# vi /etc/rsync.pas
----------------
user:123456
---------------
并给与相关权限(重要,必须是600)
# chmod 600 /etc/rsync.pas
  1. 配置/etc/rsync.motd
1
2
# vi /etc/rsyncd.motd
welcome to use the rsync services!
  1. 启动rsync
1
# rsync --daemon --config=/etc/rsyncd.conf

client端:

  1. 安装rsync(centos6.3默认已安装)
1
2
# yum install rsync -y
# yum install xinetd -y
  1. 启动rsync依赖服务
1
2
# /etc/init.d/xinetd start
# chkconfig xinetd on

3.客户端必须配置密码文件

1
2
3
4
5
6
# vi /etc/rsync.pas
------------------------
123456
----------------------
并给与相关权限(重要,必须是600)
# chmod 600 /etc/rsync.pas
  1. 然后在客户端输入命令同步:
1
2
3
4
下载(获取):
# rsync -auzv --progress --delete --password-file=/etc/rsync.pas user@172.24.40.30::mail /home/domains
上传(推送):
# rsync -auzv --progress --delete --password-file=/etc/rsync.pas /home/domains/* user@172.24.40.30::mail
1
2
3
4
5
6
7
8
9
10
11
注:后面加 --port 873 可添加端口号信息,若在配置文件中自定义端口,这里需要加--port参数。
请注意这部分:
user@172.24.40.30::mail /home/domains
----------------
user对应server端配置文件的auth users = user
和server端/etc/rsync.pas内用户名:密码(user:123456)
172.24.40.30对应服务端IP地址
mail对应server端配置文件的[mail]
/home/domains表示client端同步server端数据后数据保存在client端目录的路径
@与::均起到字符连接功能
----------------

以上方法为明文传输,传输过程中密码可能会被sniffer截取:
所以推荐线上使用ssh秘钥认证+rsync加密传输,
ssh秘钥认证配置

按照上面的格式加密重写(完整格式):

1
2
3
4
下载(获取):
# rsync -auzvP --delete -e "ssh -p22" root@172.24.40.30:/home/domains/ /home/domains/ --port 873
上传(推送):
# rsync -auzvP --delete -e "ssh -p22" /home/domains/ root@172.24.40.30:/home/domains/ --port 873

注: –progress 可以简写为 -P

  1. 定时计划任务:
    在crontab中增加一条命令,设置每分钟自动执行一次。
1
2
3
4
# crontab -e
----------------------
* * * * * /usr/bin/rsync -auzv --progress --delete --password-file=/etc/rsync.pas user@172.24.40.30::mail /home/domains
---------------------
  1. 为了安全,若系统启用防火墙,建议增加一条iptables命令
1
# iptables -A INPUT -P tcp --dport:873 -j ACCEPT
  1. 如果需要多个不同目录支持同步,再增加一个
1
2
3
4
5
6
7
8
9
10
11
12
13
[MYSQL]
path = /usr/local/mysql/data
comment = mysql mirror
ignore errors
read only = yes
list = no
auth users = root
secrets file = /etc/rsync.pas
hosts allow = 172.24.40.50
hosts deny = 0.0.0.0/0
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

重启rsync

1
2
# pkill rsync
# rsync --daemon --config=/etc/rsyncd.conf

然后在客户端输入命令同步

1
rsync  -auzv --progress --delete  --password-file=/etc/rsync.pas user@172.24.40.30::MYSQL /usr/local/mysql/data

##问题

注:配置过程问题:

问题1:

1
2
3
4
5
6
7
8
在client上遇到问题:
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.133.128::backup /home/
rsync: could not open password file "/etc/rsync.pas": No such file or directory (2)
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到这个问题:client端没有设置/etc/rsync.pas这个文件,而在使用rsync命令的时候,加了这个参数--
password-file=/etc/rsync.pas

问题2:

1
2
3
4
5
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.133.128::backup /home/
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到这个问题:client端已经设置/etc/rsync.pas这个文件,里面也设置了密码111111,和服务器一致,但是
服务器段设置有错误,服务器端应该设置/etc/rsync.pas ,里面内容root:111111 ,这里登陆名不可缺少

问题3:

1
2
3
4
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.133.128::backup /home/
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到这个问题,是因为服务器端的/home/backup 其中backup这个目录并没有设置,所以提示:chdir failed

问题4:

1
2
3
4
5
6
rsync: write failed on "/home/backup2010/wensong": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(302) [receiver=3.0.7]
rsync: connection unexpectedly closed (2721 bytes received so far) [generator]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [generator=3.0.7]
磁盘空间不够,所以无法操作。
可以通过df /home/backup2010 来查看可用空间和已用空间

问题5:网络收集问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1、权限问题
类似如下的提示:rsync: opendir "/kexue" (in dtsChannel) failed: Permission denied (13)注意查看同步的目录权限是否为755
2、time out
rsync: failed to connect to 203.100.192.66: Connection timed out (110)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]
检查服务器的端口netstat –tunlp,远程telnet测试。
3、服务未启动
rsync: failed to connect to 10.10.10.170: Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]
启动服务:rsync --daemon --config=/etc/rsyncd.conf
4、磁盘空间满
rsync: recv_generator: mkdir "/teacherclubBackup/rsync……" failed: No space left on device (28)
*** Skipping any contents from this failed directory ***
5、Ctrl+C或者大量文件
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [receiver=3.0.5]
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [generator=3.0.5]
6、xnetid启动
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [receiver=3.0.5]

查看rsync日志
rsync: unable to open configuration file “/etc/rsyncd.conf”: No such file or directory
xnetid查找的配置文件位置默认是/etc下,根据具体情况创建软链接。例如:
ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf
或者更改指定默认的配置文件路径,在/etc/xinetd.d/rsync配置文件中

使用

使用 ssh 同步文件到本地

1
rsync -P --bwlimit=300 -e 'ssh -p 22 -i ./key' root@servername:/path/filename /var/www/local_dir

–bwlimit=300 限速。

#Systemd使用技巧

1
2
#生成一张启动详细信息矢量图
systemd-analyze plot >boot.svg

Python 模块

Python 3.x Module Index

urllib

hashlib
cookielib
re

getpass
json
pickle
pickletools
functools
glob

configparser

python的ConfigParser模块

logging

优雅地记录Python程序日志1:logging模块简介

优雅地记录Python程序日志2:模块组件化日志记录器

os
sys
queue
random
socket
socketserver
threading
multiprocessing

第三方模块

Requests
Scrapy
Pillow
BeautifulSoup
lxml

selenium

胡志恒
虫师

Chrome headless 模式

Web接口开发与自动化测试基于Python语言–第1章

Web接口开发与自动化测试基于Python语言–第2章

Tomcat+Nginx动静分离和负载均衡

nginx反向代理tomcat集群实现动静分离

我们都知道,nginx作为一个轻量级的web服务器,其在高并发下处理静态页面的优越性能是tomcat这样的web容器所无法媲美的,tomcat更倾向于处理动态文件,所以一个web应用可以通过nginx反向代理来实现动静分离,静态文件由nginx处理,动态文件由tomcat处理。

环境

环境:
hadoop0.updb.com 192.168.0.100 nginx server
hadoop2.updb.com 192.168.0.102 tomcat server
hadoop3.updb.com 192.168.0.103 tomcat server
hadoop4.updb.com 192.168.0.104 tomcat server
hadoop5.updb.com 192.168.0.105 tomcat server

操作系统:
centos

Nginx版本:
nginx-1.7.6.tar.gz,采用源码编译安装

Tomcat版本:
apache-tomcat-7.0.56.tar.gz

JDK版本:
jdk-7u60-linux-x64.rpm

最终架构:
client->Nginx反向代理动静分离->{tomcat1,tomcat2,tomcat3,tomcat4}

配置

在弄明白架构之后,我们开始着手一步步来实现:
1、安装jdk + tomcat
hadoop2、hadoop3、hadoop4、hadoop5上安装jdk

1
rpm -ivh jdk-7u60-linux-x64.rpm

配置环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@hadoop2 ~]# cat  .bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export JAVA_HOME=/usr/java/jdk1.7.0_60
export JRE_HOME=/usr/java/jdk1.7.0_60/jre
export CLASSPATH=./:/usr/java/jdk1.7.0_60/lib:/usr/java/jdk1.7.0_60/jre/lib
export PATH

使环境变量生效,并验证java环境是否安装成功

1
2
[root@hadoop2 ~]# . .bash_profile 
[root@hadoop2 ~]# java -version

hadoop2、 hadoop3、hadoop4、hadoop5上安装tomcat,在webapps下创建测试目录shop和测试文件test.html和 test.jsp,测试文件中的内容为每个tomcat节点的主机名和IP地址,方便后边测试负载均衡。

1
2
3
4
5
6
7
[root@hadoop2 ~]# tar xf  apache-tomcat-7.0.56.tar.gz -C /opt/
[root@hadoop2 ~]# cd /opt/apache-tomcat-7.0.56/webapps/
[root@hadoop2 webapps]# mkdir shop
[root@hadoop2 webapps]# vi shop/test.html
this is hadoop2 root`s html!
[root@hadoop2 webapps]# vi shop/test.jsp
this is hadoop2 root`s jsp!

将tomcat的bin目录配置到环境变量,并使更改生效,并启动tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
## 设置环境变量
[root@hadoop2 ~]# cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/opt/apache-tomcat-7.0.56/bin
export JAVA_HOME=/usr/java/jdk1.7.0_60
export JRE_HOME=/usr/java/jdk1.7.0_60/jre
export CLASSPATH=./:/usr/java/jdk1.7.0_60/lib:/usr/java/jdk1.7.0_60/jre/lib
export PATH

## 使设置生效
[root@hadoop2 ~]# . .bash_profile
## 启动tomcat
[root@hadoop2 ~]# /opt/apache-tomcat-7.0.56/bin/startup.sh

测试tomcat是否正常工作,浏览器中访问,能够正常显示测试页面,表明工作正常。
http://IP:8080

2、安装nginx

1
2
3
4
[root@hadoop0 ~]# tar  xf nginx-1.7.6.tar.gz  -C /opt/
[root@hadoop0 ~]# cd /opt/nginx-1.7.6/
[root@hadoop0 ~]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
[root@hadoop0 ~]# make && make install

关于源码安装nginx,比较简单,如果过程中遇到问题可以到网上看看,都能找到答案,也可以在下面留言,一起讨论。

为了方便管理,为nginx编写服务脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
[root@hadoop0 ~]# vi /etc/init.d/nginx 
#!/bin/bash
#
#chkconfig: - 85 15
#description: this script use to manage nginx process.
#

#set -x
. /etc/rc.d/init.d/functions

procnum=`ps -ef |grep "/usr/local/nginx/sbin/nginx"|grep -v "grep"|wc -l`

start () {
if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then
echo -n "Starting nginx:"
success
echo
else
/usr/local/nginx/sbin/nginx
if [ "$?" -eq 0 ]; then
echo -n "Starting nginx:"
success
echo
else
echo -n "Starting nginx:"
failure
echo
exit 4
fi
fi
}

stop () {
if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then
/usr/local/nginx/sbin/nginx -s stop
if [ "$?" -eq 0 ]; then
echo -n "Stopping nginx:"
success
echo
else
echo -n "Stopping nginx:"
failure
echo
exit 3
fi
else
echo -n "Stopping nginx:"
success
echo
fi
}

case $1 in

start)
start
;;

stop)
stop
;;

restart)
stop
sleep 1
start
;;

reload)
if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then
/usr/local/nginx/sbin/nginx -s reload
else
echo "nginx is not running!please start nginx first..."
exit 2
fi
;;

status)
if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then
echo "nginx is running..."
else
echo "nginx is not running..."
fi
;;

*)
echo "Usage : nginx [ start|stop|reload|restart|status ]"
exit 1
;;
esac

然后授予脚本可执行权限,并加入chkconfig开机自启动,并测试

1
2
3
4
5
6
7
8
[root@hadoop0 ~]# chmod +x /etc/init.d/nginx
[root@hadoop0 ~]# chkconfig nginx on
[root@hadoop0 ~]# /etc/init.d/nginx start
Starting nginx: [ OK ]
[root@hadoop0 ~]# /etc/init.d/nginx status
nginx is running...
[root@hadoop0 ~]# /etc/init.d/nginx stop
Stopping nginx: [ OK ]

3、配置nginx,实现反向代理和动静分离

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
[root@hadoop0 ~]# cat /usr/local/nginx/conf/nginx.conf
user www www;
worker_processes 8;

error_log /usr/local/nginx/logs/error.log crit;

pid /usr/local/nginx/logs/nginx.pid;


events {
use epoll;
worker_connections 65535;
}


http {
include mime.types;
default_type application/octet-stream;
access_log /usr/local/nginx/logs/access.log;
charset utf-8;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;

client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;

## 配置反向代理的后端tomcat集群
upstream web_server {
server 192.168.0.102:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.103:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.104:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.105:8080 weight=1 max_fails=2 fail_timeout=30s;
}

server {
listen 80;
server_name 192.168.0.100;
root html;
index index.html index.htm;

## 网页、视频、图片文件从本地读取,且定义在浏览器中缓存30天
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
expires 30d;
}
## js、css文件从本地读取,且定义在浏览器中缓存1小时
location ~ .*\.(js|css)?$
{
expires 1h;
}

## 动态文件转发到后端的tomcat集群
location ~ .*\.(php|jsp|cgi|jhtml)?$ {
proxy_pass http://web_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
## 关闭访问日志
access_log off;
}
}

4、测试反向代理的负载均衡和动静分离
在nginx的html目录下创建测试目录shop、测试文件test.html和test.jsp

1
2
3
4
5
6
[root@hadoop0 ~]# cd /usr/local/nginx/html/
[root@hadoop0 html]# mkdir shop
[root@hadoop0 html]# vi shop/test.jsp
this is nginx root`s jsp!
[root@hadoop0 html]# vi shop/test.html
this is nginx root`s html!

在浏览器中访问http://192.168.0.100/shop/test.html ,无论怎样刷新,页面都显示如下:

this is nginx root’s html!

在浏览器中访问http://192.168.0.100/shop/test.jsp ,刷新几次,页面显示结果依次如下:

this is hadoop2 root’s jsp!
this is hadoop3 root’s jsp!
this is hadoop4 root’s jsp!
this is hadoop5 root’s jsp!

从结果来看,访问html静态文件时,返回的是nginx中的文件,而访问jsp动态页面时则是轮询后端的tomcat集群。至此,反向代理+动静分离已经实现。

5、接着我们来比较动静分离与单纯的反向代理的性能差异

首先安装模拟并发访问的压力测试工具

1
yum install httpd-tools -y

首先测试访问nginx代理

1
[root@hadoop0 ~]# ab -n 20000 -c 3000

一共请求20000次,每次3000的并发访问,总共用的时间为4.090秒,吞吐量为1.806M/s,再看直接访问tomcat的结果:

1
[root@hadoop0 ~]# ab -n 20000 -c 3000 http://192.168.0.105:8080/shop/test.html

相同压力下,访问tomcat需要8.591秒,且吞吐量只有0.67M/s,可见nginx在处理静态页面上远优于tomcat。

结束语:我在实现了动静分离之后,想通过nginx自带的proxy_cache模块来实现nginx缓存自身代理的静态页面,发现无法成功缓存到,认为porxy_cache无法缓存作为静态服务器的nginx中的文件,但无法求证,如果您知道,拜托指点一二。拜谢!

前端nginx时,让后端tomcat记录真实IP

前端nginx时,让后端tomcat记录真实IP
对于nginx+tomcat这种架构,如果后端tomcat配置保持默认,那么tomcat的访问日志里,记录的就是前端nginx的IP地址,而不是真实的访问IP。因此,需要对nginx、tomcat做如下配置:

1)nginx配置

1
2
3
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

2)tomcat配置

1
2
3
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs/tomcat"
prefix="search_access" suffix=".log"
pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %{User-Agent}i" resolveHosts="false"/>

3)日志效果

1
2
3
10.0.11.162 - - [12/Nov/2015:11:22:11 +0800] GET /elesearch-search-api/search/restaurant.json?start=0&end=1&lbs=POINT%28120.285468902%2031.5033700783%29&rt=id&tq=id:328864 HTTP/1.0 200 102 2 python-requests/2.4.3 CPython/2.7.5 Linux/3.10.0-229.11.1.el7.x86_64
10.0.50.54 - - [12/Nov/2015:11:22:11 +0800] GET /elesearch-search-api/search/restaurantv5home.json?rt=id%2Cdelivery_price&lbs=POINT%28120.387601+36.273438%29&end=500&uid=22454922&start=0&from=webapi HTTP/1.0 200 6404 11 python-requests/2.7.0 CPython/2.7.5 Linux/3.10.0-229.el7.x86_64
10.0.40.91 - - [12/Nov/2015:11:22:11 +0800] GET /elesearch-search-api/search/restaurant.json?start=0&end=1&lbs=POINT%28116.316306833%2039.9776800442%29&rt=id&tq=id:376608 HTTP/1.0 200 119 3 python-requests/2.4.3 CPython/2.7.5 Linux/3.10.0-229.11.1.el7.x86_64

现在我们主要来看一下pattern配置段,它用于指定日志的输出格式。有效的日志格式模式可以参见下面内容,如下字符串,其对应的信息由指定的响应内容取代:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
%a - 远程IP地址
%A - 本地IP地址
%b - 发送的字节数,不包括HTTP头,或“ - ”如果没有发送字节
%B - 发送的字节数,不包括HTTP头
%h - 远程主机名
%H - 请求协议
%l (小写的L)- 远程逻辑从identd的用户名(总是返回' - ')
%m - 请求方法
%p - 本地端口
%q - 查询字符串(在前面加上一个“?”如果它存在,否则是一个空字符串
%r - 第一行的要求
%s - 响应的HTTP状态代码
%S - 用户会话ID
%t - 日期和时间,在通用日志格式
%u - 远程用户身份验证
%U - 请求的URL路径
%v - 本地服务器名
%D - 处理请求的时间(以毫秒为单位)
%T - 处理请求的时间(以秒为单位)
%I (大写的i) - 当前请求的线程名称

此外,您可以指定以下别名来设置为普遍使用的模式之一:
common - %h %l %u %t “%r” %s %b
combined - %h %l %u %t “%r” %s %b “%{Referer}i” “%{User-Agent}i”

另外,还可以将request请求的查询参数、session会话变量值、cookie值或HTTP请求/响应头内容的变量值等内容写入到日志文件。
它仿照了apache的语法:

1
2
3
4
5
%{XXX}i xxx代表传入的头(HTTP Request)
%{XXX}o xxx代表传出的响应头(Http Resonse)
%{XXX}c xxx代表特定的Cookie名
%{XXX}r xxx代表ServletRequest属性名
%{XXX}s xxx代表HttpSession中的属性名

Zabbix安装配置

Zabbix安装配置

Zabbix 3.0
Zabbix 3.4

Zabbix手册Zabbix安装要求

服务端

安装源码库配置部署包

安装源码库配置部署包。这个部署包包含了yum配置文件。
查询最新的包访问Zabbix repo

1
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

安装Zabbix部署包

安装Zabbix部署包。以下是使用Mysql数据库安装Zabbix server、WEB前端

1
yum install -y zabbix-server-mysql zabbix-web-mysql

安装初始化数据库

在MySQL上安装Zabbix数据库和用户,请参看下列指导步骤。

MySQL数据库创建脚本。

1
2
3
4
5
mysql -uroot -p

create database zabbix character set utf8 collate utf8_bin;
grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
exit;

然后导入初始架构(Schema)和数据。

1
2
cd /usr/share/doc/zabbix-server-mysql-3.4.4
zcat create.sql.gz | mysql -uroot -p zabbix

启动Zabbix Server进程

在zabbix_server.conf中编辑数据库配置

1
2
3
4
5
6
vi /etc/zabbix/zabbix_server.conf

DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix

启动Zabbix Server进程

1
systemctl start zabbix-server

编辑Zabbix前端的PHP配置

修改Zabbix前端的Apache配置文件位于 。
/etc/httpd/conf.d/zabbix.conf

1
2
3
4
5
6
7
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 Europe/Riga

据所在时区,你可以取消 “date.timezone” 设置的注释,并正确配置它。

Zabbix前端可以在浏览器中通过 http://IP/zabbix 进行访问。默认的用户名/密码为 Admin/zabbix

初始化配置后,最终会生成如下文件:/etc/zabbix/web/zabbix.conf.php

客户端

安装源码库配置部署包

安装源码库配置部署包。这个部署包包含了yum配置文件。

1
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

安装Zabbix Agent

1
yum install zabbix-agent

配置

1
2
vi /etc/zabbix/zabbix_agentd.conf
Server=10.8.8.8

启动

1
2
3
systemctl start zabbix-agent
systemctl enable zabbix-agent
systemctl status zabbix-agent

Zabbix

CentOS 7.4.1708
Zabbix

Zabbix安装配置

主机

IP 用途 角色 版本 软件版本
10.8.8.81 服务器 Zabbix Server zabbix-server zabbix-web
10.8.8.82 数据库 MariaDB
10.8.8.83 代理服务器 Zabbix Proxy Server
1
2
systemctl stop firewalld;systemctl disable firewalld
setenforce 0;sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

安装Zabbix

rpm安装

下载Zabbix安装包

Zabbix Download

添加zabbix yum源

1
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

安装服务端

1
2
yum install zabbix-server-mysql
yum install zabbix-web-mysql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Installing:
zabbix-server-mysql x86_64 3.4.4-2.el7 zabbix 2.0 M
Installing for dependencies:
OpenIPMI-libs x86_64 2.0.19-15.el7 base 502 k
OpenIPMI-modalias x86_64 2.0.19-15.el7 base 15 k
fping x86_64 3.10-1.el7 zabbix-non-supported 40 k
gnutls x86_64 3.3.26-9.el7 base 677 k
iksemel x86_64 1.4-2.el7.centos zabbix-non-supported 49 k
libevent x86_64 2.0.21-4.el7 base 214 k
libtool-ltdl x86_64 2.4.2-22.el7_3 base 49 k
net-snmp-libs x86_64 1:5.7.2-28.el7 base 748 k
nettle x86_64 2.7.1-8.el7 base 327 k
trousers x86_64 0.3.14-2.el7 base 289 k
unixODBC x86_64 2.3.1-11.el7 base 413 k
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Installing:
zabbix-web-mysql noarch 3.4.4-2.el7 zabbix 6.4 k
Installing for dependencies:
apr x86_64 1.4.8-3.el7 base 103 k
apr-util x86_64 1.5.2-6.el7 base 92 k
dejavu-fonts-common noarch 2.33-6.el7 base 64 k
dejavu-sans-fonts noarch 2.33-6.el7 base 1.4 M
fontpackages-filesystem noarch 1.44-8.el7 base 9.9 k
httpd x86_64 2.4.6-67.el7.centos.6 updates 2.7 M
httpd-tools x86_64 2.4.6-67.el7.centos.6 updates 88 k
libX11 x86_64 1.6.5-1.el7 base 606 k
libX11-common noarch 1.6.5-1.el7 base 164 k
libXau x86_64 1.0.8-2.1.el7 base 29 k
libXpm x86_64 3.5.12-1.el7 base 55 k
libjpeg-turbo x86_64 1.2.90-5.el7 base 134 k
libpng x86_64 2:1.5.13-7.el7_2 base 213 k
libxcb x86_64 1.12-1.el7 base 211 k
libxslt x86_64 1.1.28-5.el7 base 242 k
libzip x86_64 0.10.1-8.el7 base 48 k
mailcap noarch 2.1.41-2.el7 base 31 k
php x86_64 5.4.16-43.el7_4 updates 1.4 M
php-bcmath x86_64 5.4.16-43.el7_4 updates 57 k
php-cli x86_64 5.4.16-43.el7_4 updates 2.7 M
php-common x86_64 5.4.16-43.el7_4 updates 565 k
php-gd x86_64 5.4.16-43.el7_4 updates 127 k
php-ldap x86_64 5.4.16-43.el7_4 updates 52 k
php-mbstring x86_64 5.4.16-43.el7_4 updates 505 k
php-mysql x86_64 5.4.16-43.el7_4 updates 101 k
php-pdo x86_64 5.4.16-43.el7_4 updates 98 k
php-xml x86_64 5.4.16-43.el7_4 updates 125 k
t1lib x86_64 5.1.2-14.el7 base 166 k
zabbix-web noarch 3.4.4-2.el7 zabbix 2.5 M

配置Zabbix数据库

1
2
3
4
5
# vi /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=<password>

设置php时区

1
2
3
vi /etc/httpd/conf.d/zabbix.conf

# php_value date.timezone Europe/Riga

SELinux configuration

1
2
3
4
5
6
7
8
9
10
11
12
13
Having SELinux status enabled in enforcing mode, you need to execute the following commands to enable communication between Zabbix frontend and server:

RHEL 7 and later:

# setsebool -P httpd_can_connect_zabbix on
If the database is accessible over network (including 'localhost' in case of PostgreSQL), you need to allow Zabbix frontend to connect to the database too:
# setsebool -P httpd_can_network_connect_db on
RHEL prior to 7:

# setsebool -P httpd_can_network_connect on
# setsebool -P zabbix_can_network on
As frontend and SELinux configuration is done, you need to restart Apache web server:
# service httpd restart
1
2
3
4
systemctl enable zabbix-server
systemctl start zabbix-server
systemctl enable httpd
systemctl restart httpd

安装数据库服务器

1
yum install mariadb-server mariadb
1
2
3
4
5
6
7
8
9
10
11
Installing:
mariadb-server x86_64 1:5.5.56-2.el7 base 11 M
Installing for dependencies:
perl-Compress-Raw-Bzip2 x86_64 2.061-3.el7 base 32 k
perl-Compress-Raw-Zlib x86_64 1:2.061-4.el7 base 57 k
perl-DBD-MySQL x86_64 4.023-5.el7 base 140 k
perl-DBI x86_64 1.627-4.el7 base 802 k
perl-Data-Dumper x86_64 2.145-3.el7 base 47 k
perl-IO-Compress noarch 2.061-2.el7 base 260 k
perl-Net-Daemon noarch 0.48-5.el7 base 51 k
perl-PlRPC noarch 0.2020-14.el7 base 36 k
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Installing:
mariadb x86_64 1:5.5.56-2.el7 base 8.7 M
Installing for dependencies:
perl x86_64 4:5.16.3-292.el7 base 8.0 M
perl-Carp noarch 1.26-244.el7 base 19 k
perl-Encode x86_64 2.51-7.el7 base 1.5 M
perl-Exporter noarch 5.68-3.el7 base 28 k
perl-File-Path noarch 2.09-2.el7 base 26 k
perl-File-Temp noarch 0.23.01-3.el7 base 56 k
perl-Filter x86_64 1.49-3.el7 base 76 k
perl-Getopt-Long noarch 2.40-2.el7 base 56 k
perl-HTTP-Tiny noarch 0.033-3.el7 base 38 k
perl-PathTools x86_64 3.40-5.el7 base 82 k
perl-Pod-Escapes noarch 1:1.04-292.el7 base 51 k
perl-Pod-Perldoc noarch 3.20-4.el7 base 87 k
perl-Pod-Simple noarch 1:3.28-4.el7 base 216 k
perl-Pod-Usage noarch 1.63-3.el7 base 27 k
perl-Scalar-List-Utils x86_64 1.27-248.el7 base 36 k
perl-Socket x86_64 2.010-4.el7 base 49 k
perl-Storable x86_64 2.45-3.el7 base 77 k
perl-Text-ParseWords noarch 3.29-4.el7 base 14 k
perl-Time-HiRes x86_64 4:1.9725-3.el7 base 45 k
perl-Time-Local noarch 1.2300-2.el7 base 24 k
perl-constant noarch 1.27-2.el7 base 19 k
perl-libs x86_64 4:5.16.3-292.el7 base 688 k
perl-macros x86_64 4:5.16.3-292.el7 base 43 k
perl-parent noarch 1:0.225-244.el7 base 12 k
perl-podlators noarch 2.5.1-3.el7 base 112 k
perl-threads x86_64 1.87-4.el7 base 49 k
perl-threads-shared x86_64 1.43-6.el7 base 39 k
1
2
systemctl enable mariadb
systemctl start mariadb
1
mysql_secure_installation
新建数据库
1
2
3
4
5
6
7
8
mysql -uroot -p

create database zabbix character set utf8 collate utf8_bin;
#和zabbix server安装在一个服务器
grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
#独立服务器,允许10.8.8.0网段的IP访问。
grant all privileges on zabbix.* to zabbix@'10.8.8.%' identified by 'zabbix';
quit;
倒入数据库模版

create.sql.gz这个文件由zabbix-server-mysql软件包提供,数据库是单独安装的。需要从zabbix-server上拷贝到数据库服务器。

1
2
3
scp root@10.8.8.81:/usr/share/doc/zabbix-server-mysql-3.4.4/create.sql.gz /root/create.sql.gz

zcat /root/create.sql.gz | mysql -uzabbix -p zabbix
1
zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -p zabbix

登录
http://IP/zabbix
用户名:Admin
密码:zabbix

安装代理服务器

1
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
1
yum -y install zabbix-proxy-mysql
1
zcat /usr/share/doc/zabbix-proxy-mysql/schema.sql.gz | mysql -uzabbix -p zabbix

Configure database for Zabbix server/proxy

1
2
3
4
5
# vi /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=<password>

安装agent客户端

1
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
1
yum -y install zabbix-agent
1
2
Installing:
zabbix-agent x86_64 3.4.4-2.el7 zabbix 358 k
1
2


/etc/zabbix/zabbix_agentd.conf
Server=127.0.0.1
ServerActive=127.0.0.1
Hostname=Zabbix server

1
2
3
systemctl enable zabbix-agent
systemctl start zabbix-agent
systemctl status zabbix-agent

源码安装

配置Zabbix

,