Smokeping是一款非常强大的网络监控工具,可以监控服务器到指定目标的延迟、丢包率等。Smokeping的配置坑极多,网上很多资料也有错误,以至于走了非常多的弯路,这里记录一下,给有需要的人参考。
不同系统和版本配置可能有所不同,仅在以下环境测试通过且可重复:
系统:Ubuntu 22.04
Smokeping版本:2.7.3-3
Web服务器:Caddy 2.6.2
Smokeping有standalone(单机)模式和Master/Slave(主从)模式,如果你只需要监控单个服务器,可以使用LinuxServer.io提供的Docker镜像,配置很简单,而且他们更新很勤奋,我只说主从模式的配置。
以下方法参考了极多的资料,可能有重复的操作,水平太菜见谅。
Master
安装Caddy
Smokeping默认会带Apache,但是Apache配置简直是天书,所以我一般都用更简单和轻量级的Caddy。
使用官方文档的方法。
$ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
$ sudo apt update
$ sudo apt install caddy
安装fcgiwrap
sudo apt install fcgiwrap
fcgiwrap默认是www-data身份运行,我们使用Caddy而非Apache,所以最好改一下,免得遇到权限问题,编辑/lib/systemd/system/fcgiwrap.service
,user改成caddy:
$ sudo sed -i 's/www-data/caddy/g' /lib/systemd/system/fcgiwrap.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable fcgiwrap.socket
$ sudo systemctl start fcgiwrap.socket
安装Smokeping
确实有一些可以使用主从模式的Docker镜像,但是我没找到好用的,而且这些镜像大多带Apache,比较占资源,所以我选择直接安装。Smokeping在Ubuntu的官方源中,所以不需要编译(很多过时教程中还需要编译和新建启动项)。官方源默认会安装Apache,但是用不到,我们使用--no-install-recommends选项,这样就可以只安装Smokeping。
$ sudo apt install --no-install-recommends smokeping
建立数据和缓存目录,配置各种目录的权限:
$ sudo mv /usr/share/smokeping/www/smokeping.fcgi.dist /usr/share/smokeping/www/smokeping.fcgi # 不同发行版的目录可能不同,另外有些没有dist后缀,就无需这一步
$ sudo mkdir -p /usr/share/smokeping/www/data
$ sudo mkdir -p /usr/share/smokeping/www/imgcache # 建立数据和缓存目录
$ sudo chown -R smokeping:smokeping /usr/share/smokeping
$ sudo chown -R caddy:caddy /usr/share/smokeping/www/imgcache # 修改权限
$ sudo chmod a+rx /etc/smokeping
$ sudo chmod a+r /etc/smokeping/config # 好像是为了让Caddy读到配置文件
配置Smokeping
编辑/etc/smokeping/config.d/General
,修改cgiurl为你的域名/smokeping.cgi,注意前面改成https,因为我们后面要上ssl,<DOMAIN>代表你的域名,下同。
cgiurl = https://<DOMAIN>/smokeping.cgi
编辑/etc/smokeping/config.d/pathnames
,修改以下条目:
imgcache = /usr/share/smokeping/www/imgcache
imgurl = imgcache
datadir = /usr/share/smokeping/www/data
#dyndir = /usr/share/smokeping/www/data/__cgi
最后一项是注释掉的,这样smokeping会使用datadir作为dyndir,否则可能有权限问题。
编辑/etc/smokeping/smokeping_secrets
,添加密码,格式为hostname:secret,hostname必须和/etc/smokeping/config.d/Slaves
中一致,一行一个,这个文件的owner默认是smokeping:www-data而非caddy,不过不影响运行。
根据需要编辑Smokeping的配置文件,包括Slaves、Targets、Probes等,具体看文档,这里不赘述了,需要注意的是这些文件(也包括smokeping_secrets)中Slave端的hostname必须一致,而且必须和Slave服务器实际的hostname一致,Probes中的探针名和Targets中也必须一致(如果对应探针没有安装,需要安装一下)。
然后修改/etc/smokeping/basepage.html
,Ubuntu 22.04库中的这个文件是错误的,会导致网页排版混乱,Ubuntu 20.04的反而正常,我不知道是不是因为对应的Apache配置改了,但是使用Caddy的话这里是需要修改的。修改文件的第7、8行,把href="/smokeping/css/smokeping-print.css"
改成href="/css/smokeping-print.css"
。
之后重启smokeping,让它生成rrd文件。
配置权限
我想说Smokeping一大半的坑都在主从的权限上¯\_(ツ)_/¯。前面的一堆chown和chmod都是为了解决权限问题,至此运行不报错了,但是如果停在这步,之后看图表你会发现只有本机数据可以显示,这是因为Slave端的请求是由Caddy接收的,而caddy进程的用户是caddy,它无权修改rrd文件,官方FAQ给出了更优雅的解决办法,但是我还是遇到了权限问题(当时是Ubuntu 20.04),所以用了更加简单粗暴的方法调整权限:
$ sudo usermod -aG caddy smokeping
$ sudo usermod -aG smokeping caddy
$ cd /usr/share/smokeping
$ find . -type d | xargs sudo chmod 775
$ find . -type f -name '*.rrd' | xargs sudo chown smokeping:caddy
之后重启Smokeping
$ sudo systemctl restart smokeping
配置Caddy
编辑/etc/caddy/Caddyfile
,配置如下:
<DOMAIN> {
handle /js/* {
root * /usr/share/smokeping/www/
file_server
}
handle /css/* {
root * /usr/share/smokeping/www/
file_server
}
handle /imgcache/* {
root * /usr/share/smokeping/www/
file_server
}
handle /images/* {
root * /usr/share/smokeping/www/
file_server
}
handle {
root * /usr/share/smokeping/www
reverse_proxy unix//var/run/fcgiwrap.socket {
transport fastcgi {
env SCRIPT_FILENAME /usr/share/smokeping/smokeping.cgi
split ""
}
}
}
}
ssl之类的Caddy会自动处理。这里因为需要用多个file_server,所以必须使用handle语句。
之后重启Caddy:
$ sudo systemctl restart caddy
此时访问域名,应该就能够正常看到图表了。
之后建议重启一下全部Slave端的smokeping进程,好像理论上不需要,但是之前遇到过问题,重启之后解决了。
Slave
[可选]先改一下hostname,上面说了这个hostname必须和Master端的Slaves文件一致,并且不同Slave不能重复。
$ sudo hostnamectl set-hostname <HOSTNAME>
之后重新登录ssh就可以看到了。
Slave端配置就比较简单了,还是使用官方源安装。
$ sudo apt install --no-install-recommends smokeping
编辑/etc/smokeping/smokeping_secrets
,把密码写进去,需要和Master端的smokeping_secrets一致。
然后需要修改服务项为Slave模式:
$ sudo mkdir /etc/systemd/system/smokeping.service.d
$ sudo cp /usr/share/doc/smokeping/examples/systemd/slave_mode.conf /etc/systemd/system/smokeping.service.d
然后添加Master的域名,修改上面的slave_mode.conf,可以用sed(如果你看不懂这个命令就用vi改):
$ sudo sed -i 's/http:\/\/127.0.0.1\/smokeping.fcgi/https:\/\/<DOMAIN>\/smokeping.cgi/' /etc/systemd/system/smokeping.service.d/slave_mode.conf
重载:
$ sudo systemctl daemon-reload
$ sudo systemctl start smokeping
$ sudo systemctl enable smokeping
然后等待15分钟左右,Master端的网页就会显示图表了。
如果不显示且日志查不出问题,则查看Master服务器的各个rrd文件,如果修改时间一直不变,那么还是权限问题。
添加Slave
如果smokeping已经运行起来了,需要添加新的Slave,可以如下操作。
首先要编辑Master端的配置文件,因为Slave要收到Master的回复后才会运行,否则会报ERROR: we did not get config from the master
。需要编辑的文件包括/etc/smokeping/smokeping_secrets
(加入hostname和secret)、/etc/smokeping/config.d/Slaves
(加入hostname和显示颜色)和/etc/smokeping/config.d/Targets
(加入hostname),注意三者的hostname和Slave端的实际hostname要一致。
之后重启Master端的smokeping,生成rrd文件
$ sudo systemctl start smokeping
然后修改rrd文件权限,再次重启生效
$ cd /usr/share/smokeping/www/data
$ find . -type f -name '*.rrd' | xargs sudo chown smokeping:caddy
$ sudo systemctl start smokeping
然后按照上面说明安装配置Slave端,就可以正常运作了,同样需要等15分钟左右才可以看到曲线。
文章评论
配置caddy后smokeping主页能显示,但是点击“Local”后提示“ERROR: creating /usr/share/smokeping/www/imgcache/Local: No such file or directory”
@devin 检查一下/usr/share/smokeping/www/imgcache/Local的owner,我这里正常运行的目录owner是caddy:caddy