在购买VPS主机之前,我一般都会先查看一下别人使用该VPS主机的评价,尤其是VPS主机的线路是我最关心的地方。因为国外的VPS主机商非常多,但是真正从国内访问速度快的机房也就是那么几个。线路不好,速度慢的VPS,并不适合搭建中文网站。
同时,我也发现了另一个问题,那就是某一个VPS主机在最开始测试时线路质量很好,但是随着用户的增多VPS主机访问也越来越不稳定了,这是最开始使用VPS主机没有想到的。所以,迫切需要一个国外VPS主机线路监控报告,能够直观地了解VPS主机线路的变化。
满足上面要求的,恐怕只有Smokeping了。Smokeping是一个开源免费的网络性能监控工具,主要用于监视网络性能,包括常规的 ping,dig,echoping,curl等,可以 监视 www 服务器性能,监视 dns 查询性能,监视 s-s-h 性能等。最重要的是Smokeping的图表非常直观。
Smokeping采用rrdtool做支持,生成的网络延迟数据转化图表非常漂亮,支持交互式图形浏览,你可以查看任意时间段的监控数据。Smokeping也可以部署主/从分布式测量,即用一台服务器作为“主”,其它的服务器作为“从”并向“主”服务器传输数据,最后汇总形成系统监控数据图表。
本篇文章就来分享一下Smokeping安装与配置方法,更多关于VPS主机性能与速度评测可以参考:VPS主机排行榜单,你也可以自己按照下面的方法来给VPS主机作一个“体检”:
PS:2017年10月21日更新,如果你发现自己的VPS服务器经常出现宕机或者异常,你或许可以使用这个工具找出“真凶”:服务器日志分析利器:ngxtop和GoAccess-实时监控可视化管理快速找出异常来源。
PS:2018年10月27日更新,Smokeping手动安装比较麻烦,有兴趣的朋友可以试试SmokePing Nginx一键安装包:网络监控工具:SmokePing Nginx一键安装/管理脚本。
一、Smokeping安装前准备
Smokeping官网:
- https://oss.oetiker.ch/smokeping/index.en.html
- https://github.com/oetiker/SmokePing
Smokeping需要以下组件依赖(有optional为可选项):
RRDtool 1.2.x or later
FPing (optional)
EchoPing (Optional)
Curl (Optional)
dig (Optional)
S-S-H (Optional)
Webserver
Perl 5.8.8 or later(对应的模块如下)
FCGI
CGI, CGI::Fast
Config::Grammar
LWP
Socket6 (optional)
Net::Telnet (optional)
Net::OpenS-S-H (optional)
Net::.DNS (optional)
Net::LDAP (optional)
IO::Socket::SSL (optional)
Authen::Radius (optional)
Smokeping官网推荐用Apache来运行,当然也可以使用Nginx,但是你需要配置好Nginx FCGI才行。本篇文章测试的环境是:CentOS 6.8+Apache。执行以下命令安装相关组件依赖:
#临时修改hostname
sudo hostname ping.wzfou.com
#查看是否成功
hostname
#永久修改Hostname
vi /etc/sysconfig/network
#修改原hostname为
ping.wzfou.com
#查看是否成功
hostname
//如果是CentOS 7,永久性的修改主机名称,重启后能保持修改后的。
hostnamectl set-hostname ping.wzfou.com
//重启后可以看到
hostnamectl
#禁用SELinux
vi /etc/selinux/config
SELINUX = disabled
#同步时间
yum -y install ntpdate
ntpdate times.aliyun.com
#安装epel源
wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
#备用地址:https://do.wzfou.net/wzfou/epel-release-6-8.noarch.rpm
#安装rrdtool与依赖库
yum -y install perl perl-Net-Telnet perl-Net-DNS perl-LDAP perl-libwww-perl perl-RadiusPerl perl-IO-Socket-SSL perl-Socket6 perl-CGI-SpeedyCGI perl-FCGI perl-CGI-SpeedCGI perl-Time-HiRes perl-ExtUtils-MakeMaker perl-RRD-Simple rrdtool rrdtool-perl curl fping echoping httpd httpd-devel gcc make wget libxml2-devel libpng-devel glib pango pango-devel freetype freetype-devel fontconfig cairo cairo-devel libart_lgpl libart_lgpl-devel mod_fastcgi mod_ssl git bind-utils fping
#安装中文字体
yum -y install wqy-zenhei-fonts
#DNS需要用到TCPPing命令,安装方法如下: 首先安装tcptraceroute: yum install tcptraceroute 然后下载: wget http://www.vdberg.org/~richard/tcpping 赋予权限后移动到/usr/bin目录下即可使用: chmod 755 tcpping mv tcpping /usr/bin/ 经过测试,发现tcpping的IP必须要有80服务才行
安装过程中可能会出现某个依赖找不到情况,一般影响不大,你只要在下面的操作中能够正常进行就可以了。
二、下载Smokeping安装并配置
执行以下命令开始安装Smokeping:
wget http://oss.oetiker.ch/smokeping/pub/smokeping-2.6.9.tar.gz
tar zxvf smokeping-2.6.9.tar.gz
cd smokeping-2.6.9
./configure --prefix=/usr/local/smokeping
./setup/build-perl-modules.sh /usr/local/smokeping/thirdparty
#备用地址:https://do.wzfou.net/wzfou/smokeping-2.6.9.tar.gz
安装过程中,可能会出现下面的提示:
** Aborting Configure ******************************
If you know where perl can find the missing modules, set
the PERL5LIB environment variable accordingly.
FIRST though, make sure that 'perl' starts the perl
binary you want to use for SmokePing.
Now you can install local copies of the missing modules
by running
./setup/build-perl-modules.sh /usr/local/smokeping/thirdparty
The RRDs perl module is part of RRDtool. Either use the rrdtool
package provided by your OS or install rrdtool from source.
If you install from source, the RRDs module is located
PREFIX/lib/perl
#这是因为缺少相应的perl模块,直接按照提示执行:
./setup/build-perl-modules.sh /usr/local/smokeping/thirdparty
#继续执行操作:
./configure --prefix=/usr/local/smokeping
/usr/bin/gmake install
执行以下命令开始配置Smokeping:
#创建 cache、data、var 数据目录
cd /usr/local/smokeping
mkdir cache data var
#创建日志
touch /var/log/smokeping.log
#授权
chown apache:apache cache data var
chown apache:apache /var/log/smokeping.log
#修改配置文件
cd /usr/local/smokeping/htdocs/
mv smokeping.fcgi.dist smokeping.fcgi
cd /usr/local/smokeping/etc
mv config.dist config
#vim config
#cgiurl = http://some.url/smokeping.cgi
...
#step = 300
#ping = 5
你可以用Vim打开config文件,或者自己使用SFTP登录用编辑器打开config文件,此处你需要修改一下cgiurl,替换成你的IP或者域名,详细的config请看下一部分。
最后,给密码文件赋予权限:
chmod 600 /usr/local/smokeping/etc/smokeping_secrets.dist
三、安装Apache并配置Smokeping
刚才我们通过Yum的方法已经安装好了Apache,这里我们需要修改Apache的配置文件,将IP或者域名调整访问到Smokeping路径,命令如下:
vim /etc/httpd/conf/httpd.conf
#在最后添加以下内容
Alias /cache "/usr/local/smokeping/cache/"
Alias /cropper "/usr/local/smokeping/htdocs/cropper/"
Alias /smokeping "/usr/local/smokeping/htdocs/smokeping.fcgi"
<Directory "/usr/local/smokeping">
AllowOverride None
Options All
AddHandler cgi-script .fcgi .cgi
Order allow,deny
Allow from all
DirectoryIndex smokeping.fcgi
</Directory>
#######################################################
#如果你想让你的Smokeping访问不公开,你可以设置访问密码
vim /etc/httpd/conf/httpd.conf
Alias /cache "/usr/local/smokeping/cache/"
Alias /cropper "/usr/local/smokeping/htdocs/cropper/"
Alias /smokeping "/usr/local/smokeping/htdocs/smokeping.fcgi"
<Directory "/usr/local/smokeping">
AllowOverride None
Options All
AddHandler cgi-script .fcgi .cgi
AllowOverride AuthConfig
Order allow,deny
Allow from all
AuthName "Smokeping"
AuthType Basic
AuthUserFile /usr/local/smokeping/htdocs/htpasswd
Require valid-user
DirectoryIndex smokeping.fcgi
</Directory>
#再执行设置密码
htpasswd -c /usr/local/smokeping/htdocs/htpasswd admin
以上你可以用Vim命令,也可以自己用编辑器将配置文件下载到本地进行编辑。
设置 Smokeping、Apache 开机启动:
echo "/usr/local/smokeping/bin/smokeping --logfile=/var/log/smokeping.log 2>&1 &" >> /etc/rc.local
chkconfig httpd on
四、 Smokeping启动和遇到的问题
执行以下命令即启动 Smokeping:
/etc/init.d/httpd start
/usr/local/smokeping/bin/smokeping --logfile=/var/log/smokeping.log2>&1&
打开你的浏览器访问:ip或者域名/smokeping,你就可以看到Smokeping默认的界面了。
4.1 Smokeping支持中文问题
默认的Smokeping显示中文会乱码,我们刚刚在上面给Linux安装了中文字体,现在执行:vim /usr/local/smokeping/lib/Smokeping/Graphs.pm
,在'--end', $tasks[0][2],
增加一行字体配置部分('--font', "TITLE:20:WenQuanYi Zen Hei Mono",)
,如下:
...
if ($mode =~ /[anc]/){
my $val = 0;
for my $host (@hosts){
my ($graphret,$xs,$ys) = RRDs::graph
("dummy",
'--start', $tasks[0][1],
'--end', $tasks[0][2],
'--font', "TITLE:20:WenQuanYi Zen Hei Mono",
"DEF:maxping=$cfg->{General}{datadir}${host}.rrd:median:AVERAGE",
'PRINT:maxping:MAX:%le' );
my $ERROR = RRDs::error();
return "RRDtool did not understand your input: $ERROR." if $ERROR;
$val = $graphret->[0] if $val < $graphret->[0];
}
$val = 1e-6 if $val =~ /nan/i;
$max = { $tasks[0][1] => $val * 1.5 };
}
...
如下图设置:
然后,执行:vim /usr/local/smokeping/etc/config
,增加一行代码charset= utf-8,如下:
...
***Presentation ***
charset= utf-8
template = /usr/local/smokeping/etc/basepage.html.dist
...
4.2 Smokeping域名访问及SSL证书
如果你不想让Smokeping访问时带上/Smokeping这么一个尾巴,你可在Apache配置中修改如下:
Alias / "/usr/local/smokeping/htdocs/smokeping.fcgi"
给域名添加SSL证书也很简单,首先为你的域名申请一个SSL证书,阿里云、腾讯云等都提供了免费一年的SSL证书可供申请。更多的免费SSL证书请看这里:免费SSL证书收集整理汇总-免费给网站添加Https安全加密访问。
刚才我们已经通过Yum的方式安装了mod_ssl,现在你可以进入到:/etc/httpd/conf.d,然后替换你的Key、CRT、CA路径,找到如下代码(注意你的证书路径):
# Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that a kill -HUP will prompt again. A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/pki/tls/certs/domain.crt
# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/pki/tls/certs/domain.key
# Certificate Authority (CA):
# Set the CA certificate verification path where to find CA
# certificates for client authentication or alternatively one
# huge file containing all of them (file must be PEM encoded)
SSLCACertificateFile /etc/pki/tls/certs/domainca.crt
请将你下载下来的CA根证书、CRT域名证书和密钥Key上传到/etc/pki/tls/certs/目录,然后将上面的三个路径进行替换。最后重启Apache,就可以看到SSL证书生效了。
4.3 Smokeping不显示数据的问题
这个问题一般是由于目录权限导致的,你可以查看Apache日志错误提示,同时保持cache data var这三个文件夹里面生成的文件属性为可读写且拥有者为:apache:apache。
五、Smokeping模板及Config配置详解
Smokeping模板文件basepage.html.dist。在basepage.html.dist里你可以修改Smokeping的CSS样式、增加Html内容(包括图片、文字)、修改标题链接等等。
Smokeping Config配置文件详解,相关的中文说明如下:
*** General *** ##全局配置
owner = charlie.cui@zerounix.com ##联系人(显示在网页上)
contact = charlie.cui@zerounix.com ##联系人邮箱
mailhost = mail.zerounix.com ##邮件服务主机
sendmail = /usr/sbin/sendmail ##发送邮件件的二进制可执行程序
# NOTE: do not put the Image Cache below cgi-bin
# since all files under cgi-bin will be executed ... this is not
# good for images.
imgcache = /usr/local/smokeping/cache ##生成图片的缓存
imgurl = cache ##cache 定义cgi程序显示图片的url目录
datadir = /usr/local/smokeping/data ##rrd文件的位置
piddir = /usr/local/smokeping/var
cgiurl = http://some.url/smokeping.cgi ##smokeping访问地址
smokemail = /usr/local/smokeping/etc/smokemail ##发送邮件的邮件内容模板
tmail = /usr/local/smokeping/etc/tmail ##HTML邮件模板的路径
# specify this to get syslog logging
syslogfacility = local0 ##syslog日志记录的设备编号
# each probe is now run in its own process
# disable this to revert to the old behaviour
# concurrentprobes = no
*** Alerts *** ##报警配置
to = monitor@zerounix.com
from = mon@zerounix.com
+网络中断
type = rtt
pattern = !=U,==U
comment = 网络中断
priority = 1
+中断恢复
type = rtt
pattern = ==U,!=U,!=U
comment = 中断恢复
priority = 2
+严重丢包
type = loss
pattern = >50%
comment = 丢包大于50%
priority = 3
+丢包报警
type = loss
pattern = >10%,>10%,>10%
comment = 连续3次丢包10%以上
priority = 4
+网络延迟
type = rtt
pattern = >180,>180,>180
comment = 连续3次延时180以上
priority = 5
*** Database ***
step = 60
pings = 10
# consfn mrhb steps total
AVERAGE 0.5 1 1008
AVERAGE 0.5 12 4320
MIN 0.5 12 4320
MAX 0.5 12 4320
AVERAGE 0.5 144 720
MAX 0.5 144 720
MIN 0.5 144 720
*** Presentation *** ##模板文件路径
template = /tmp/smokeping-31631-build/etc/basepage.html.dist
+ charts
menu = Charts
title = The most interesting destinations
++ stddev
sorter = StdDev(entries=>4)
title = Top Standard Deviation
menu = Std Deviation
format = Standard Deviation %f
++ max
sorter = Max(entries=>5)
title = Top Max Roundtrip Time
menu = by Max
format = Max Roundtrip Time %f seconds
++ loss
sorter = Loss(entries=>5)
title = Top Packet Loss
menu = Loss
format = Packets Lost %f
++ median
sorter = Median(entries=>5)
title = Top Median Roundtrip Time
menu = by Median
format = Median RTT %f seconds
+ overview
width = 600
height = 50
range = 10h
+ detail
width = 600
height = 200
unison_tolerance = 2
"Last 3 Hours" 3h
"Last 30 Hours" 30h
"Last 10 Days" 10d
"Last 400 Days" 400d
#+ hierarchies
#++ owner
#title = Host Owner
#++ location
#title = Location
*** Probes *** ##探针
+ FPing
binary = /usr/local/sbin/fping
+ DNS
binary = /usr/bin/dig
lookup = name.example
*** Slaves *** ##“从”服务器设置
secrets=/usr/local/smokeping/etc/smokeping_secrets
+boomer
display_name=boomer
color=0000ff
+slave2
display_name=another
color=00ff00
*** Targets *** ##监控目标
probe = FPing
menu = Top
title = Network Latency Grapher
remark = Welcome to the SmokePing website of xxx Company.
Here you will learn all about the latency of our network.
+ Test
menu= Targets
#parents = owner:/Test/James location:/
++ James
menu = James
title =James
alerts = someloss
slaves = boomer slave2
host = james.address
++ MultiHost
menu = Multihost
title = James and James as seen from Boomer
host = /Test/James /Test/James~boomer
添加监控目标。*** Targets ***监控主机是分层结构,用+表示,例如第一层“+”,第二层“++”一次类推。这里给出一个从本地Ping到三大网络并返回数据的示例代码:
+ Other
menu = 三大网络监控
title = 监控统计
++ dianxin
menu = 电信网络监控
title = 电信网络监控列表
host = /Other/dianxin/dianxin-bj /Other/dianxin/dianxin-hlj /Other/dianxin/dianxin-tj /Other/dianxin/dianxin-sc /Other/dianxin/dianxin-sh /Other/dianxin/dianxin-gz
+++ dianxin-bj
menu = 北京电信
title = 北京电信
alerts = someloss
host = 202.96.199.133
+++ dianxin-hlj
menu = 黑龙江电信
title = 黑龙江电信
alerts = someloss
host = 219.147.198.242
+++ dianxin-tj
menu = 天津电信
title = 天津电信
alerts = someloss
host = 219.150.32.132
+++ dianxin-sc
menu = 四川电信
title = 四川电信
alerts = someloss
host = 61.139.2.69
+++ dianxin-sh
menu = 上海电信
title = 上海电信
alerts = someloss
host = 116.228.111.118
+++ dianxin-gz
menu = 广东电信
title = 广东电信
alerts = someloss
host = 113.111.211.22
++ liantong
menu = 联通网络监控
title = 联通网络监控列表
host = /Other/liantong/liantong-bj /Other/liantong/liantong-hlj /Other/liantong/liantong-tj /Other/liantong/liantong-sc /Other/liantong/liantong-sh /Other/liantong/liantong-gz
+++ liantong-bj
menu = 北京联通
title = 北京联通
alerts = someloss
host = 61.135.169.121
+++ liantong-hlj
menu = 黑龙江联通
title = 黑龙江联通
alerts = someloss
host = 202.97.224.69
+++ liantong-tj
menu = 天津联通
title = 天津联通
alerts = someloss
host = 202.99.96.68
+++ liantong-sc
menu = 四川联通
title = 四川联通
alerts = someloss
host = 119.6.6.6
+++ liantong-sh
menu = 上海联通
title = 上海联通
alerts = someloss
host = 210.22.84.3
+++ liantong-gz
menu = 广东联通
title = 广东联通
alerts = someloss
host = 221.5.88.88
++ yidong
menu = 移动网络监控
title = 移动网络监控列表
host = /Other/yidong/yidong-bj /Other/yidong/yidong-hlj /Other/yidong/yidong-tj /Other/yidong/yidong-sc /Other/yidong/yidong-sh /Other/yidong/yidong-gz
+++ yidong-bj
menu = 北京移动
title = 北京移动
alerts = someloss
host = 221.130.33.52
+++ yidong-hlj
menu = 黑龙江移动
title = 黑龙江移动
alerts = someloss
host = 211.137.241.35
+++ yidong-tj
menu = 天津移动
title = 天津移动
alerts = someloss
host = 211.137.160.5
+++ yidong-sc
menu = 四川移动
title = 四川移动
alerts = someloss
host = 218.201.4.3
+++ yidong-sh
menu = 上海移动
title = 上海移动
alerts = someloss
host = 117.131.19.23
+++ yidong-gz
menu = 广东移动
title = 广东移动
alerts = someloss
host = 211.136.192.6
六、Smokeping主从服务器分布式部署
上面我们在配置文件中看到了:*** Slaves *** ,这就是部署主从服务器用的。说明如下:
*** Slaves ***
secrets=/usr/local/smokeping/etc/smokeping_secrets.dist
# 定义通信用的秘钥文件,里面包含slave的名字以及对应密码
+ wzfou # slave的名字
display_name=挖站否 # slave的别名
location=杭州电信机房 # 这个字段用来定义slave主机的位置,类似于description
color=0000ff # slave收集的数据在图像中显示的颜色
6.1 Smokeping主服务器设置
先按照上面的方法部署好主服务器Smokeping,然后修改smokeping_secrets.dist里面的内容,如下图设置好Slave名称和密码:
通信用的秘钥文件内容为“slave的名字:密码”,这里需要注意秘钥文件的权限,由于smokeping的master/slave是通过smokeping程序进行验证的,所以这个秘钥文件owner必须是smokeping进程的运行用户身份,并且权限为600。命令如下:
chown apache:apache
/usr/local/smokeping/etc/smokeping_secrets.dist
chmod 600 /usr/local/smokeping/etc/smokeping_secrets.dist
接着,将定义的Slave节点分配给你需要监控的主机,如下说明:
*** Targets ***
++ changzhou ## 一级菜单,这个值将会作为data下的一个目录名被创建
menu = 常州机房 ## 定义web上显示的菜单名
title = 常州机房 ## 标题名称
+++ dianxin ## 监控主机,数据将会被存放在 data/changzhou/dianxin目录下
menu = 电信机房 ## web上显示的名称
title = 电信机房监控 ##网页标题
alerts = someloss ## 报警
slaves = wzfou ## slave节点
host = wzfou.com ## 被监控的主机IP或者域名
从上面的配置我们可以看出关键地方是要在*** Targets *** 中添加一行:
slaves = wzfou ## slave节点,表示slaves 会像主服务器一样在此目标展开监控。
6.2 Smokeping从服务器设置
请按照上文的方法在从服务器中配置好Smokeping,不需要任何配置,也不需要修改Apache配置,只要保证Smokeping正常安装并运行即可。Smokeping启动从服务器有几个参数需要了解:
–master-url:当smokeping运行在slave模式下,使用该项指定master的访问url(web接口,用以通信)
–slave-name:默认情况下,不指定此项时,slave连接到master后,master会以slave的hostname作为slavename,如果不希望这样做,就需要手动指定改选项
–shared-secret:和master通信认证的密码文件
–cache-dir:当smokeping运行在slave模式下,临时数据存放在master上的目录路径
–pid-dir:slave模式下,其pid存放的目录路径。可选参数,默认继承–cache-dir参数的值
同样的,确保你的Smokeping从服务器的smokeping_secrets.dist文件owner是smokeping进程的运行用户身份,并且权限为600,且从服务器的smokeping_secrets.dist中只要写密码,这一点和主服务器不同。
这是我的Smokeping从服务器启动命令示例(需要注意的就是替换slave的名称):
/usr/local/smokeping/bin/smokeping --master-url=https://ping.wzfou.com/ --cache-dir=/usr/local/smokeping/cache/ --shared-secret=/usr/local/smokeping/etc/smokeping_secrets.dist --slave-name=wzfou --logfile=/var/log/smokeping_slave.logCopy
七、总结
Smokeping真的是一个非常强大的网络性能监控工具,效果可以查看:ping.wzfou.com。Smokeping还有不少的探针可供使用,例如Ping、DNS、Curl、Https、SMTP、FTP、TCP、LDAP等,甚至还有不少的插件可以自己安装并开发。(点击放大)
这是Smokeping的图表,非常直观,且容易看懂。(点击放大)
文件权限问题。这是一个很容易出现问题的地方,修改了config文件后都会在datacachevar中产生数据,如果文件权限不是apache将直接导致rrd文件不更新,web页面没有图像,或者web页面有图像但没有数据。
你可以在在服务器执行以下命令解决问题:
pkill smokeping
chown -R apache:apache /usr/local/smokeping/data
chown -R apache:apache /usr/local/smokeping/cache
/etc/init.d/httpd restart ##重启Apache
/usr/local/smokeping/bin/smokeping --reload
重启smokeping。每次修改配置文件后需要重启smokeping进程,否则会出现各种问题。重启smokeping命令如下:
/usr/local/smokeping/bin/smokeping --restart
或
/usr/local/smokeping/bin/smokeping --reload
或
pkill smokeping
/usr/local/smokeping/bin/smokeping
master/slave服务器没有数据。对于master/slave的架构,首先确保slave-name和master配置文件中配置的slave节点名以及密钥文件中的节点名相对应。再查看一下master的密钥文件(包含slave节点名和密码)与slave的密码文件(只有密码)是否对应。最后就是密钥属性权限一定要是600。
PS:2017年11月11日更新,Smokeping在服务器网络监控方面比较出色,但是如果想要对整个服务器的内存、CPU、连接等指数进行详细的监控,可以试试企业级的Zabbix:Zabbix安装与使用-强大的服务器性能监控工具掌控服务器软硬件资源。