嘟嘟社区

使用腾讯云轻量应用服务器搭建网络质量拨测工具 SmokePing


本文原载于 https://www.idc.moe/archives/qcloud-Lighthouse-SmokePing.html
作者:iks
  SmokePing (https://oss.oetiker.ch/smokeping) 是由 RRDtool (https://oss.oetiker.ch/rrdtool) 的作者 Tobi Oetiker (https://www.oetiker.ch) 开发的一款监控网络状态和稳定性的开源软件。SmokePing 会不断向目标发送各种类型的数据包,并对返回值进行测量和记录,通过 RRDtool 制图程序图形化地展示在各个时段内网络的延迟和丢包情况,帮助我们更清楚、更直观地了解监控机和监控目标之间短期和长期的网络状况。
  腾讯云轻量应用服务器目前提供北京、广州、上海、南京、成都、中国香港、新加坡、东京、硅谷和莫斯科等10个地域的机器供用户购买。由于众所周知的原因,我国大陆地区的国际互联网出入口总带宽较小,在日常特别是晚高峰期间较为拥堵,因此在服务器上安装网络质量拨测工具用于监控和记录不同时段的服务器至国内方向测速节点和国际方向的终结点的延迟和丢包率,获取具有连续性的十分直观的数据以便我们进行分析非常有帮助。
  本文以腾讯云轻量应用服务器香港地域为例,演示和教学网络质量拨测工具 SmokePing 的编译和个性化配置。
一、准备工作
1.1 服务器及其系统选择
  SmokePing 需要的资源不多,正常运行的话仅需 128 MB 左右的内存,因此低配高配轻量套餐均可搭建。
使用腾讯云轻量应用服务器搭建网络质量拨测工具 SmokePing
  目前经过严密测试,SmokePing 2.7.3 及以上版本支持 Amazon Linux 2 (AMI), CentOS 7 及以上、Debian 9 及以上、Oracle Linux 7 及以上和 Ubuntu 18 及以上的 Linux 发行版。因此系统选择时可以在 CentOS, Debian 和 Ubuntu 之间随意选择。

1.2 安装依赖
  CentOS 用户请依次执行:

  1. sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config
  2. setenforce 0
  3. yum install wget curl ca-certificates dmidecode epel-release -y
  4. update-ca-trust force-enable
  5. 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 用户请依次执行:

  1. apt update
  2. apt install wget curl gnupg2 ca-certificates dmidecode lsb-release -y
  3. update-ca-certificates
  4. 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 并填入以下内容:

  1. #!/bin/sh -e
  2. if [ $# != 5 -a $# != 4 ]
  3. then
  4.         echo "Wrong number of arguments"
  5.         exit
  6. fi
  7. output="$4 :"
  8. for i in $(seq $3)
  9. do
  10.         portflag=""
  11.         if [ $# = 5 ]
  12.         then
  13.                 portflag="-p $5"
  14.         fi
  15.         tr=$(traceroute -n -T -f 255 -m 255 -q 1 -w 3 $portflag $4 2>&1| tail -n1 | sed ‘s/  / /g’)
  16.         if ! echo "$tr" | grep ‘ms
  17.   执行 chmod +x /usr/bin/tcpping-sp 赋予其执行权。
  18. [size=5]1.4 获取 SmokePing 源码包[/size]
  19.   海外用户请执行 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 以解压。
  20. [size=6]二、开始编译[/size]
  21.   执行 cd smokeping-2.7.3 进入 SmokePing 源代码目录,执行 ./configure –prefix=/usr/local/smokeping 执行 SmokePing 编译检查和配置。
  22. [img]https://p.itxe.net/images/2021/10/28/image92c00cb7ed49d71d.png[/img]
  23.   执行 make install 进行编译。
  24. [img]https://p.itxe.net/images/2021/10/28/image.png[/img]
  25. [size=6]三、配置 FsatCGI 前端程序[/size]
  26.   较为流行的教程均以 Apache 2 作为 SmokePing 的默认 FCGI 程序,但目前 Nginx 较为流行。本文以 Nginx 作为 SmokePing 的 FastCGI 程序。
  27. [size=5]3.1 安装 Nginx[/size]
  28. [img]https://p.itxe.net/images/2021/10/28/image46789f4df89a3402.png[/img]
  29.   注意:如果你已经安装 Nginx,则无需再次安装 Nginx。本文以包安装的 Nginx 为例。
  30.   安装 Nginx 的教程多如牛毛,使用包安装方案、LNMP.org 一键包方案和通过宝塔面板安装的 Nginx 均可,本文不再赘述。
  31. [size=5]3.2 配置 Nginx 站点配置文件[/size]
  32. [b]3.2.1 获取 Nginx 的 fastcgi_params 位置[/b]
  33.   执行 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
  34. [img]https://p.itxe.net/images/2021/10/28/imageb4daefb96699bc35.png[/img]
  35. [b]3.2.2 初创建 Nginx 站点配置文件[/b]
  36.   使用包安装的 Nginx 的用户请在 /etc/nginx/conf.d 目录新建一个空白文件,文件名为 域名.conf (请自定义 域名)。
  37. [img]https://p.itxe.net/images/2021/10/28/image15d50484faffdbca.png[/img]
  38.   使用 LNMP.org 一键包方案安装的 Nginx 的用户请执行 lnmp vhost add 以添加一个站点,暂时不要配置 SSL。
  39. [img]https://p.itxe.net/images/2021/10/28/image41ea192e300b222b.png[/img]
  40.   使用宝塔面板安装的 Nginx 的用户请新建一个站点。
  41. [img]https://p.itxe.net/images/2021/10/28/image32b5e7a26e50e036.png[/img] > /dev/null
  42.         then
  43.                 output="$output -"
  44.         else
  45.                 ms=$(echo "$tr" | cut -d" " -f3)
  46.                 output="$output $ms"
  47.         fi
  48. done
  49. 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 的用户请使用如下内容将站点配置的原始内容覆盖掉。
  1. server {
  2.         listen 80;
  3.         listen [::]:80;
  4.         listen 127.0.0.1:9006;
  5.         server_name $domain;
  6.         index index.html index.htm smokeping.fcgi;
  7.         root /usr/local/smokeping/htdocs/;
  8.         #error_page 404/404.html;
  9.        
  10.         location ~ .*.fcgi$ {
  11.                 fastcgi_pass 127.0.0.1:9007;
  12.                 include $nginx_fastcgi/fastcgi_params;
  13.         }
  14.         access_log /dev/null;
  15.         error_log /dev/null;
  16. }

复制代码

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



  使用包安装的 Nginx 的用户和使用 LNMP.org 一键包方案安装的 Nginx 的用户请执行 nginx -s reload;使用宝塔面板安装的 Nginx 的用户请在修改站点配置后单击“保存”按钮。
四、SmokePing 守护和配置
4.1 守护进程
  新建文件 /etc/systemd/system/smokeping.service,填入以下内容:

  1. [Unit]
  2. Description=SmokePing Service
  3. After=network-online.target remote-fs.target nss-lookup.target
  4. Wants=network-online.target
  5. [Service]
  6. Type=oneshot
  7. ExecStart=/bin/bash /usr/local/smokeping/bin/slave.sh
  8. RemainAfterExit=yes
  9. [Install]
  10. WantedBy=multi-user.target

复制代码

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

4.2 配置从服务器运行脚本
  新建文件 /usr/local/smokeping/bin/slave.sh,填入以下内容:
  1. #/bin/bash
  2. kill -9 $(ps -ef|grep smokeping_cgi|awk ‘$0 !~/grep/ {print $2}’ |tr -s ‘n’ ‘ ‘)
  3. kill -9 $(ps -ef|grep ‘smokeping/bin/smokeping’|awk ‘$0 !~/grep/ {print $2}’ |tr -s ‘n’ ‘ ‘)
  4. chown -R www:www /usr/local/smokeping/htdocs
  5. /usr/local/smokeping/bin/smokeping –config=/usr/local/smokeping/etc/config &
  6. /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 &
  7. /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,填入以下内容:

  1. *** General ***
  2. owner    = X
  3. contact  = [email protected]
  4. mailhost = my.mail.host
  5. imgcache = /usr/local/smokeping/htdocs/cache
  6. imgurl   = cache
  7. datadir  = /usr/local/smokeping/htdocs/data
  8. piddir  = /usr/local/smokeping/htdocs/var
  9. cgiurl   = http://some.url/smokeping.cgi
  10. smokemail = /usr/local/smokeping/etc/smokemail.dist
  11. tmail = /usr/local/smokeping/etc/tmail.dist
  12. syslogfacility = local0
  13. *** Alerts ***
  14. to = [email protected]
  15. from = [email protected]
  16. +someloss
  17. type = loss
  18. pattern = >0%,*12*,>0%,*12*,>0%
  19. comment = loss 3 times  in a row
  20. *** Database ***
  21. step     = 10
  22. pings    = 5
  23. AVERAGE  0.5   1  1008
  24. AVERAGE  0.5  12  4320
  25.     MIN  0.5  12  4320
  26.     MAX  0.5  12  4320
  27. AVERAGE  0.5 144   720
  28.     MAX  0.5 144   720
  29.     MIN  0.5 144   720
  30. *** Presentation ***
  31. template = /usr/local/smokeping/etc/basepage.html.dist
  32. charset = utf-8
  33. + overview
  34. width = 600
  35. height = 200
  36. range = 24h
  37. + detail
  38. width = 600
  39. height = 200
  40. unison_tolerance = 2
  41. "Last 5 Minutes"    5m
  42. "Last 10 Minutes"    10m
  43. "Last 30 Minutes"    30m
  44. "Last 1 Hour"    1h
  45. "Last 3 Hours"    3h
  46. "Last 24 Hours"   24h
  47. "Last 3 Days"    3d
  48. "Last 7 Days"   7d
  49. "Last 30 Days"    30d
  50. "Last 1 Year"    1y
  51. *** Probes ***
  52. + TCPPing
  53. binary = /usr/bin/tcpping-sp
  54. forks = 5
  55. offset = 50%
  56. step = 10
  57. timeout = 5
  58. *** Slaves ***
  59. secrets=/usr/local/smokeping/etc/smokeping_secrets.dist
  60. + SLAVE_CODE
  61. display_name = SLAVE_NAME
  62. location = SLAVE_NAME
  63. color = 0000ff
  64. *** Targets ***
  65. probe = TCPPing
  66. menu = Top
  67. title = Network Latency Grapher
  68. remark = Welcome to this SmokePing website. <br />
  69. + mainland
  70. menu = 大陆方向
  71. title = 大陆方向
  72. nomasterpoll = yes
  73. 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
  74. ++ ct-gz
  75. menu = 广州电信
  76. title = 广州电信
  77. slaves = SLAVE_CODE
  78. host = 14.215.116.1
  79. ++ ct-sh
  80. menu = 上海电信
  81. title = 上海电信
  82. slaves = SLAVE_CODE
  83. host = 180.153.28.5
  84. ++ cu-gz
  85. menu = 广州联通
  86. title = 广州联通
  87. slaves = SLAVE_CODE
  88. host = 157.255.70.5
  89. ++ cu-sh
  90. menu = 上海联通
  91. title = 上海联通
  92. slaves = SLAVE_CODE
  93. host = 211.95.52.116
  94. ++ cm-gz
  95. menu = 广州移动
  96. title = 广州移动
  97. slaves = SLAVE_CODE
  98. host = 120.232.176.254
  99. ++ cm-sh
  100. menu = 上海移动
  101. title = 上海移动
  102. slaves = SLAVE_CODE
  103. host = 221.183.55.22
  104. + global
  105. menu = 国际方向
  106. title = 国际方向
  107. nomasterpoll = yes
  108. host = /global/cf~SLAVE_CODE /global/hk-pccw~SLAVE_CODE /global/sg-vu~SLAVE_CODE
  109. ++ cf
  110. menu = Cloudflare
  111. title = Cloudflare
  112. slaves = SLAVE_CODE
  113. host = www.cloudflare.com
  114. ++ hk-pccw
  115. menu = 香港 PCCW
  116. title = 香港 PCCW
  117. slaves = SLAVE_CODE
  118. host = 63.216.151.43
  119. ++ sg-vu
  120. menu = 新加坡 Vultr
  121. title = 新加坡 Vultr
  122. slaves = SLAVE_CODE
  123. 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,填入以下内容:
  1. $code:$sec

复制代码

  其中,$code 为步骤 4.2 相同的自定义的英文+数字组合;$sec 为自定义的英文+数字组合。
  新建文件 /usr/local/smokeping/etc/secrets,将 上面的 $sec 填入。

4.5 安全和收尾
  依次执行以下命令:

  1. chmod 700 /usr/local/smokeping/etc/secrets /usr/local/smokeping/etc/smokeping_secrets.dist
  2. chown www:www /usr/local/smokeping/etc/smokeping_secrets.dist

复制代码

  依次执行以下命令:

  1. cd /usr/local/smokeping/htdocs
  2. mkdir -p data var cache ../cache
  3. mv smokeping.fcgi.dist smokeping.fcgi

复制代码

  执行 systemctl start smokeping 以启动 SmokePing。



五、个性化配置 SmokePing
  SomkePing 所监控的节点全部配置在 /usr/local/smokeping/etc/config 中;监控节点可以分目录层级,+ 为第一级目录,++ 为第二级目录,+++ 为第三级目录,以此类推。增加或修改节点时请保持 slaves =  相同。其他方面的修改显而易见,不赘述。
六、结语
  手动编译 SmokePing 太复杂了,在此推荐我自己写的项目 KukiSa/smokeping-lnmp (https://github.com/KukiSa/smokeping-lnmp),一键脚本直接安装(适用于已经安装了 Nginx 的用户)以及 jiuqi9997/smokeping (https://github.com/jiuqi9997/smokeping) (适用于未安装 Nginx 的用户)。

废话太多了,上docker啊
能同时监控几台小鸡?
有人打包了docker,方便一些,https://github.com/linuxserver/docker-smokeping
看得头晕。
就一些吃灰小鸡有必要弄这么详细的监控数据吗。
手动编译 SmokePing 太复杂了,在此推荐我自己写的项目 KukiSa/smokeping-lnmp (https://github.com/KukiSa/smokeping-lnmp),一键脚本直接安装(适用于已经安装了 Nginx 的用户)以及 jiuqi9997/smokeping (https://github.com/jiuqi9997/smokeping) (适用于未安装 Nginx 的用户)。
技术贴顶一下吧