X

网络质量拨测有高招!腾讯云搭建网络质量拨测工具SmokePing

如今,定期的提供网络服务质量报告,让用户和开发者清楚的知道自己的网络质量的好坏至关重要,大家需要更为高效的网络质量拨测工具。

SmokePing是由RRDtool的作者Tobi Oetiker开发的一款监控网络状态和稳定性的开源软件。SmokePing 会不断向目标发送各种类型的数据包,并对返回值进行测量和记录,通过 RRDtool 制图程序图形化地展示在各个时段内网络的延迟和丢包情况,帮助我们更清楚、更直观地了解监控机和监控目标之间短期和长期的网络状况。   

本文以腾讯云轻量应用服务器香港地域为例,演示和教学网络质量拨测工具 SmokePing 的编译和个性化配置。腾讯云轻量应用服务器目前提供北京、广州、上海、南京、成都、中国香港、新加坡、东京、硅谷和莫斯科等10个地域的机器供用户购买。

一、准备工作

1.1 服务器及其系统选择

  SmokePing 需要的资源不多,正常运行的话仅需 128 MB 左右的内存,因此低配高配轻量套餐均可搭建。

  目前经过严密测试,SmokePing 2.7.3 及以上版本支持 Amazon Linux 2 (AMI), CentOS 7 及以上、Debian 9 及以上、Oracle Linux 7 及以上和 Ubuntu 18 及以上的 Linux 发行版。因此系统选择时可以在 CentOS, Debian 和 Ubuntu 之间随意选择。

1.2 安装依赖

  CentOS 用户请依次执行:

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

setenforce 0

yum install wget curl ca-certificates dmidecode epel-release -y

update-ca-trust force-enable

yum install tar zip unzip openssl openssl-devel lsof git jq socat crontabs make gcc rrdtool rrdtool-perl perl-core spawn-fcgi traceroute zlib zlib-devel wqy-zenhei-fonts -y

  Debian/Ubuntu 用户请依次执行:

apt update

apt install wget curl gnupg2 ca-certificates dmidecode lsb-release -y

update-ca-certificates

apt install tar zip unzip openssl libssl-dev lsof git jq socat cron make gcc rrdtool librrds-perl spawn-fcgi traceroute zlib1g zlib1g-dev fonts-droid-fallback -y

1.3 获取 TCP Ping 组件

  新建文件 /usr/bin/tcpping-sp 并填入以下内容:

#!/bin/sh -e

#

# Copyright (c) 2016, Torbjörn Lönnemark

#

# Permission to use, copy, modify, and/or distribute this software for any

# purpose with or without fee is hereby granted, provided that the above

# copyright notice and this permission notice appear in all copies.

#

# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES

# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF

# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR

# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES

# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN

# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF

# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

if [ $# != 5 -a $# != 4 ]

then

echo "Wrong number of arguments"

exit

fi

output="$4 :"for i in $(seq $3)do

portflag=""

if [ $# = 5 ]

then

portflag="-p $5"

fi

tr=$(traceroute -n -T -f 255 -m 255 -q 1 -w 3 $portflag $4 2>&1| tail -n1 | sed 's/ / /g')

if ! echo "$tr" | grep 'ms$' > /dev/null

then

output="$output -"

else

ms=$(echo "$tr" | cut -d" " -f3)

output="$output $ms"

fi

done

echo $output

  执行 chmod +x /usr/bin/tcpping-sp 赋予其执行权。

1.4 获取 SmokePing 源码包

  海外用户请执行 wget https://github.com/oetiker/SmokePing/releases/download/2.7.3/smokeping-2.7.3.tar.gz,国内用户请执行 wget https://oss.oetiker.ch/smokeping/pub/smokeping-2.7.3.tar.gz,并执行 tar xzvf smokeping-2.7.3.tar.gz 以解压。

二、开始编译

  执行 cd smokeping-2.7.3 进入 SmokePing 源代码目录,执行 ./configure --prefix=/usr/local/smokeping 执行 SmokePing 编译检查和配置。

  执行 make install 进行编译。

三、配置 FsatCGI 前端程序

  较为流行的教程均以 Apache 2 作为 SmokePing 的默认 FCGI 程序,但目前 Nginx 较为流行。本文以 Nginx 作为 SmokePing 的 FastCGI 程序。

3.1 安装 Nginx

  注意:如果你已经安装 Nginx,则无需再次安装 Nginx。本文以包安装的 Nginx 为例。   安装 Nginx 的教程多如牛毛,使用包安装方案、LNMP.org 一键包方案和通过宝塔面板安装的 Nginx 均可。

3.2 配置 Nginx 站点配置文件

3.2.1 获取 Nginx 的 fastcgi_params 位置

  执行 find / -name fastcgi_params 查找 Nginx 的 fastcgi_params 位置。一般情况下,包安装的 Nginx 的 fastcgi_params 位置为 /etc/nginx/fastcgi_params,LNMP.org 一键包方案安装的 Nginx 的 fastcgi_params 位置为 /usr/local/nginx/conf/fastcgi_params宝塔面板安装的 Nginx 的 fastcgi_params 位置为 /www/server/nginx/conf/fastcgi_params

3.2.2 初创建 Nginx 站点配置文件

  使用包安装的 Nginx 的用户请在 /etc/nginx/conf.d 目录新建一个空白文件,文件名为 域名.conf (请自定义 域名)。

  使用 LNMP.org 一键包方案安装的 Nginx 的用户请执行 lnmp vhost add 以添加一个站点,暂时不要配置 SSL。

  使用宝塔面板安装的 Nginx 的用户请新建一个站点。

3.2.3 修改 Nginx 站点配置文件

  使用包安装的 Nginx 的用户请将如下内容粘贴到 /etc/nginx/conf.d/域名.conf;使用 LNMP.org 一键包方案安装的 Nginx 的用户请使用如下内容将 /usr/local/nginx/conf/vhost/域名.conf 的原始内容覆盖掉;使用宝塔面板安装的 Nginx 的用户请使用如下内容将站点配置的原始内容覆盖掉。

server {

listen 80;

listen [::]:80;

listen 127.0.0.1:9006;

server_name $domain;

index index.html index.htm smokeping.fcgi;

root /usr/local/smokeping/htdocs/;

#error_page 404/404.html;


location ~ .*\.fcgi\$ {

fastcgi_pass 127.0.0.1:9007;

include $nginx_fastcgi/fastcgi_params;

}

access_log /dev/null;

error_log /dev/null;}

  其中,请将 domain替换为先前定义的域名,将nginx_fastcgi/fastcgi_params 替换为先前获得的 Nginx 的 fastcgi_params 位置。

  使用包安装的 Nginx 的用户和使用 LNMP.org 一键包方案安装的 Nginx 的用户请执行 nginx -s reload;使用宝塔面板安装的 Nginx 的用户请在修改站点配置后单击“保存”按钮。

四、SmokePing 守护和配置

4.1 守护进程

  新建文件 /etc/systemd/system/smokeping.service,填入以下内容:

[Unit]

Description=SmokePing Service

After=network-online.target remote-fs.target nss-lookup.target

Wants=network-online.target

[Service]

Type=oneshot

ExecStart=/bin/bash /usr/local/smokeping/bin/slave.sh

RemainAfterExit=yes

[Install]

WantedBy=multi-user.target

  执行 systemctl enable smokeping 使其开机启动。

4.2 配置从服务器运行脚本

  新建文件 /usr/local/smokeping/bin/slave.sh,填入以下内容:

#/bin/bash

kill -9 $(ps -ef|grep smokeping_cgi|awk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')

kill -9 $(ps -ef|grep 'smokeping/bin/smokeping'|awk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')

chown -R www:www /usr/local/smokeping/htdocs/usr/local/smokeping/bin/smokeping --config=/usr/local/smokeping/etc/config &/usr/local/smokeping/bin/smokeping --master-url=http://127.0.0.1:9006/smokeping.fcgi --cache-dir=/usr/local/smokeping/cache/ --shared-secret=/usr/local/smokeping/etc/secrets --slave-name=SLAVE_CODE &/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9007 -P /var/run/smokeping-fastcgi.pid -u www -f /usr/local/smokeping/htdocs/smokeping.fcgi

  将 SLAVE_CODE 替换为自定义的英文+数字组合。

4.3 配置 SmokePing 主服务器

  新建文件 /usr/local/smokeping/etc/config,填入以下内容:

*** General ***

owner = X

contact = some@address.nowhere

mailhost = my.mail.host

imgcache = /usr/local/smokeping/htdocs/cache

imgurl = cache

datadir = /usr/local/smokeping/htdocs/data

piddir = /usr/local/smokeping/htdocs/var

cgiurl = http://some.url/smokeping.cgi

smokemail = /usr/local/smokeping/etc/smokemail.dist

tmail = /usr/local/smokeping/etc/tmail.dist

syslogfacility = local0

*** Alerts ***

to = alertee@address.somewhere

from = smokealert@company.xy

+someloss

type = loss

pattern = >0%,*12*,>0%,*12*,>0%

comment = loss 3 times in a row

*** Database ***

step = 10

pings = 5

AVERAGE 0.5 1 1008AVERAGE 0.5 12 4320

MIN 0.5 12 4320

MAX 0.5 12 4320AVERAGE 0.5 144 720

MAX 0.5 144 720

MIN 0.5 144 720

*** Presentation ***

template = /usr/local/smokeping/etc/basepage.html.dist

charset = utf-8

+ overview

width = 600

height = 200

range = 24h

+ detail

width = 600

height = 200

unison_tolerance = 2

"Last 5 Minutes" 5m"Last 10 Minutes" 10m"Last 30 Minutes" 30m"Last 1 Hour" 1h"Last 3 Hours" 3h"Last 24 Hours" 24h"Last 3 Days" 3d"Last 7 Days" 7d"Last 30 Days" 30d"Last 1 Year" 1y

*** Probes ***

+ TCPPing

binary = /usr/bin/tcpping-sp

forks = 5

offset = 50%

step = 10

timeout = 5

*** Slaves ***

secrets=/usr/local/smokeping/etc/smokeping_secrets.dist

+ SLAVE_CODE

display_name = SLAVE_NAME

location = SLAVE_NAME

color = 0000ff

*** Targets ***

probe = TCPPing

menu = Top

title = Network Latency Grapher

remark = Welcome to this SmokePing website.

+ mainland

menu = 大陆方向

title = 大陆方向

nomasterpoll = yes

host = /mainland/ct-gz~SLAVE_CODE /mainland/ct-sh~SLAVE_CODE /mainland/cu-gz~SLAVE_CODE /mainland/cu-sh~SLAVE_CODE /mainland/cm-gz~SLAVE_CODE /mainland/cm-sh~SLAVE_CODE

++ ct-gz

menu = 广州电信

title = 广州电信

slaves = SLAVE_CODE

host = 14.215.116.1

++ ct-sh

menu = 上海电信

title = 上海电信

slaves = SLAVE_CODE

host = 180.153.28.5

++ cu-gz

menu = 广州联通

title = 广州联通

slaves = SLAVE_CODE

host = 157.255.70.5

++ cu-sh

menu = 上海联通

title = 上海联通

slaves = SLAVE_CODE

host = 211.95.52.116

++ cm-gz

menu = 广州移动

title = 广州移动

slaves = SLAVE_CODE

host = 120.232.176.254

++ cm-sh

menu = 上海移动

title = 上海移动

slaves = SLAVE_CODE

host = 221.183.55.22

+ global

menu = 国际方向

title = 国际方向

nomasterpoll = yes

host = /global/cf~SLAVE_CODE /global/hk-pccw~SLAVE_CODE /global/sg-vu~SLAVE_CODE

++ cf

menu = Cloudflare

title = Cloudflare

slaves = SLAVE_CODE

host = www.cloudflare.com

++ hk-pccw

menu = 香港 PCCW

title = 香港 PCCW

slaves = SLAVE_CODE

host = 63.216.151.43

++ sg-vu

menu = 新加坡 Vultr

title = 新加坡 Vultr

slaves = SLAVE_CODE

host = 45.32.100.168

  将第 10 行的 some.url 修改为第三部分使用的域名;将 SLAVE_CODE 替换为与步骤 4.2 相同的自定义的英文+数字组合;将 SLAVE_NAME 替换为自定义的名字,支持包括中文在内的任何 UTF-8 字符。

4.4 配置通信密钥

  新建文件 /usr/local/smokeping/etc/smokeping_secrets.dist,填入以下内容:

$code:$sec

  其中,code为步骤4.2相同的自定义的英文+数字组合;sec 为自定义的英文+数字组合。

  新建文件 /usr/local/smokeping/etc/secrets,将 上面的 $sec 填入。

4.5 安全和收尾

  依次执行以下命令:

chmod 700 /usr/local/smokeping/etc/secrets /usr/local/smokeping/etc/smokeping_secrets.dist

chown www:www /usr/local/smokeping/etc/smokeping_secrets.dist

  依次执行以下命令:

cd /usr/local/smokeping/htdocs

mkdir -p data var cache ../cache

mv smokeping.fcgi.dist smokeping.fcgi

  执行 systemctl start smokeping 以启动 SmokePing。

五、个性化配置 SmokePing

  SomkePing 所监控的节点全部配置在 /usr/local/smokeping/etc/config 中;监控节点可以分目录层级,+ 为第一级目录,++ 为第二级目录,+++ 为第三级目录,以此类推。增加或修改节点时请保持 slaves = 相同。

六、结语

手动编译 SmokePing 太复杂了,在此推荐我自己写的项目 KukiSa/smokeping-lnmp,一键脚本直接安装(适用于已经安装了 Nginx 的用户)以及 jiuqi9997/smokeping (适用于未安装 Nginx 的用户)。

本文参考来源/iks