网络延迟监控是运维工作中不可忽视的一环,SmokePing 作为一款老牌的延迟探测工具,能够通过多种探测方式持续记录目标主机的响应时间并用图形化界面展示。Nginx 则是高性能的 Web 服务器和反向代理,把 Nginx 放在 SmokePing 前面可以解决权限控制、TLS 终结和统一入口的问题。接下来会从 SmokePing 的基础安装开始,逐步搭建一套可用的延迟监控环境。

SmokePing 的安装与探测机制
SmokePing 的核心由探测调度器、RRDtool 数据存储和 CGI 前端三部分组成。调度器按照配置文件中定义的频率执行探测命令,常用的探测命令包括 fping、echoping、curl 等,每次探测得到多个延迟样本,经过过滤后写入 RRD 数据库。RRDtool 负责将时间序列数据压缩存储,并在需要时生成 PNG 图表。SmokePing 的 Web 界面通过 CGI 脚本读取 RRD 文件并渲染出包含图表和统计信息的页面。理解这三层结构对后续排查问题很有帮助,因为大部分故障都能归结为探测执行失败、数据写入失败或 CGI 读取失败。
在 Debian 或 Ubuntu 系统上可以直接使用包管理器安装 SmokePing,同时会自动安装依赖的 fping 和 rrdtool。安装完成后,主配置文件位于 /etc/smokeping/config,目标定义文件通常位于 /etc/smokeping/config.d/Targets。需要确认 fping 的安装路径,因为部分发行版会将其放在 /usr/sbin/fping,而 SmokePing 默认可能使用 /usr/bin/fping。可以通过 which fping 命令确认路径并调整配置。如果路径不正确,调度器会反复报错并且无法生成任何延迟数据。
一个典型的探测定义示例如下,代码中指定了 fping 二进制文件路径、探测频率和超时时间。
*** General *** owner = admin contact = admin@ipipp.com mailhost = localhost cgiurl = http://localhost/smokeping/smokeping.cgi syslogfacility = local0 *** Alerts *** to = admin@ipipp.com from = smokeping@ipipp.com + LatencyAlert type = loss pattern = >0%,*12*,>0%,*12*,>0% comment = Packet loss detected *** Database *** step = 300 pings = 5 *** Probes *** + FPing binary = /usr/sbin/fping
上面的配置中,step 表示每次探测的间隔秒数,pings 表示每个间隔内发送的探测包数量。告警模式 pattern 使用了转义后的大于号,表示当丢包率连续多次大于 0% 时触发告警。实际使用时还需要根据环境调整这些值,例如对公网目标可以适当放宽超时和丢包阈值,避免误报。
Nginx 反向代理 SmokePing 的配置
SmokePing 的 CGI 程序可以借助 spawn-fcgi 或 fcgiwrap 运行,再由 Nginx 通过 FastCGI 协议转发请求。这种方式可以避免 SmokePing 自带的单线程 Web 服务成为瓶颈,同时方便在 Nginx 层做访问控制。另一种方式是 SmokePing 2.7 之后内置的 HTTP 服务,监听某个端口,Nginx 直接使用 proxy_pass 反代。两种方案中 FastCGI 模式更加成熟稳定,适合长期运行的生产环境。选择哪一种取决于已有的基础设施,如果已经运行了 fcgiwrap,推荐继续沿用 FastCGI 模式。
下面是一份 Nginx 配置示例,将 /smokeping/ 路径的请求转发给本地 9000 端口上的 fcgiwrap 进程。假设 SmokePing 的 CGI 脚本已部署到 /usr/lib/cgi-bin/smokeping.cgi。
server {
listen 80;
server_name monitor.ipipp.com;
location /smokeping/ {
gzip off;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /usr/lib/cgi-bin/smokeping.cgi;
fastcgi_param PATH_INFO $uri;
fastcgi_param QUERY_STRING $query_string;
fastcgi_intercept_errors on;
}
}
这里 fastcgi_param SCRIPT_FILENAME 必须指向真实的 CGI 文件路径,否则 fcgiwrap 会返回 404。参数 PATH_INFO 和 QUERY_STRING 用于把原始 URI 和查询字符串完整传递给 SmokePing,保证图表页面中的链接可以正确拼接。关闭 gzip 是因为 CGI 输出的图片和页面通常不适合二次压缩,保持原样可以避免潜在的缓冲问题。
如果 SmokePing 使用内建 HTTP 服务,Nginx 配置会更简单,只需把请求代理到后端端口即可。以下示例假设 SmokePing 监听在 8080 端口。
server {
listen 80;
server_name monitor.ipipp.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这种模式维护成本较低,但后端 SmokePing 内建服务对并发的支持不如 FastCGI 方案,而且需要额外保证 8080 端口不被外部直接访问。通过 Nginx 配置防火墙规则或监听地址为 127.0.0.1 可以解决这个问题。
延迟目标配置与告警规则
SmokePing 的目标配置采用层级树结构,使用加号和菜单名称定义节点。每个目标可以指定探测类型、主机地址和显示名称。以下配置定义了一个总公司节点和两个分支节点,使用前面定义的 FPing 探测器。
*** Targets *** probe = FPing + Network menu = Network Topology title = Network Latency Overview ++ HeadOffice menu = Head Office title = Head Office Latency host = 192.168.1.1 ++ BranchOffice menu = Branch Office title = Branch Office Latency host = 192.168.2.1
层级中的每一级都会在 Web 界面生成对应的菜单项,menu 是显示名称,title 是页面标题,host 是实际探测的目标地址。目标地址可以是 IP 地址,也可以是可解析的域名。对于需要区分不同线路或地域的多节点监控,可以继续使用 +++ 添加更深层级,让整个监控结构清晰易懂。
告警系统可以在某个目标出现丢包或延迟超过阈值时发送邮件。SmokePing 使用 Alert 配置块定义触发条件,模式由多个字段组成,分别对应连续探测中的丢包率。延迟告警则可以使用 rtt 类型,例如检测平均往返时间超过 100 毫秒时触发。
+ HighLatency type = rtt pattern = >100,>100,>100 comment = RTT above 100ms for 3 consecutive probes
上面的规则表示连续三次探测的往返时间都大于 100 毫秒时才发出告警,这样可以有效避免短暂抖动带来的误报。实际部署时可以把告警邮件发送到运维团队的公共邮箱,并结合邮件过滤规则将不同级别的告警分流到不同目录。如果目标数量很多,建议为重要节点单独设置更严格的阈值,为普通节点设置相对宽松的阈值。
性能优化与常见问题排查
Nginx 作为前端时,可以通过缓存响应来减少 SmokePing CGI 的压力。不过 SmokePing 的图表页面包含动态生成的链接和实时数据,直接缓存整个页面可能导致信息不新鲜。更好的做法是对静态资源如 CSS、JavaScript 和 favicon 设置较长的缓存时间,而只对图表 PNG 和主页面保持短缓存或不缓存。以下配置对 /images/ 和 /css/ 路径设置缓存头。
location ~* \.(css|js|png|jpg|ico)$ {
expires 7d;
add_header Cache-Control "public, max-age=604800, immutable";
}
如果访问 SmokePing 页面出现 502 Bad Gateway,通常说明 Nginx 无法与 fcgiwrap 通信,或者 CGI 脚本执行失败。可以先检查 fcgiwrap 进程是否监听 9000 端口,再查看 Nginx 错误日志中的 FastCGI 相关记录。另一种常见问题是 RRD 文件目录权限不足,SmokePing 调度器以 smokeping 用户运行,而 Web 服务器通过 CGI 读取 RRD 文件时也需要相应权限,建议将 RRD 目录设置为对 smokeping 组可读。
如果图表显示为断线或空白,需要检查探测命令是否能够正常执行。可以手动运行 fping 命令测试目标连通性,确认没有防火墙阻断 ICMP 或 TCP 探测。同时检查 /var/log/smokeping.log 中是否有写入失败或 rrdtool 报错。大多数情况下,只要保证探测命令有执行权限、RRD 目录可写、Nginx 与 fcgiwrap 通信正常,整套监控平台就能稳定运行。