1. 项目概述
在企业IT运维和系统监控领域,端口存活监控是最基础也最重要的监控需求之一。想象一下,当你管理的数十台服务器中,某个关键服务的端口突然停止响应,而你和团队却毫不知情,直到业务部门打电话投诉才发现问题——这种被动响应的情况正是我们需要避免的。
传统的端口监控方案往往存在几个痛点:一是监控粒度粗,只能简单判断端口是否开放;二是缺乏统一视图,不同服务的监控数据分散在各个工具中;三是告警机制不灵活,难以根据业务需求定制。而Prometheus+Blackbox Exporter的组合恰好能解决这些问题。
这套方案的核心优势在于:
- 细粒度的探测:不仅能检测端口是否开放,还能获取连接延迟、DNS解析时间等详细指标
- 统一的数据模型:所有监控数据都存储在Prometheus的时间序列数据库中,便于关联分析
- 灵活的告警规则:可以基于多维度指标设置复杂的告警条件
- 强大的可视化:通过Grafana可以创建直观的监控仪表板
2. 环境准备
2.1 系统要求与依赖安装
在开始部署前,我们需要确保基础环境满足要求。以下是经过生产环境验证的推荐配置:
硬件要求:
- 最低配置:2核CPU,2GB内存,10GB磁盘空间
- 推荐配置:4核CPU,4GB内存,50GB SSD(当监控目标超过100个时)
操作系统兼容性:
- CentOS/RHEL 7+(本文以CentOS 7.9为例)
- Ubuntu 18.04+(LTS版本更佳)
- 其他Linux发行版需自行验证依赖包可用性
基础依赖安装:
bash复制# CentOS/RHEL系统
sudo yum install -y wget curl tar vim net-tools
# Ubuntu/Debian系统
sudo apt-get update
sudo apt-get install -y wget curl tar vim net-tools
注意:生产环境中建议禁用SELinux或配置适当的策略规则,避免因权限问题导致服务异常。可通过
sudo setenforce 0临时关闭,或修改/etc/selinux/config永久禁用。
2.2 网络与防火墙规划
端口监控系统涉及三个关键服务,我们采用连续的端口号便于管理:
- Prometheus:8063(数据采集与存储)
- Blackbox Exporter:8064(端口探测执行)
- Grafana:8065(数据可视化)
防火墙配置建议:
bash复制# 开放必要端口(生产环境应限制访问IP)
sudo firewall-cmd --permanent --add-port=8063-8065/tcp
sudo firewall-cmd --reload
# 验证端口开放状态
sudo firewall-cmd --list-ports
3. Prometheus部署与配置
3.1 安全最佳实践:专用用户与目录
遵循最小权限原则,我们为Prometheus创建专用用户和目录:
bash复制# 创建系统用户和组
sudo groupadd --system prometheus
sudo useradd -s /sbin/nologin --system -g prometheus prometheus
# 创建配置和数据目录
sudo mkdir -p /etc/prometheus/{rules,rules.d,files.d}
sudo mkdir -p /var/lib/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
3.2 二进制安装与验证
推荐使用官方预编译的二进制版本,确保稳定性和兼容性:
bash复制# 下载指定版本(生产环境建议使用稳定版而非最新版)
wget https://github.com/prometheus/prometheus/releases/download/v2.51.0/prometheus-2.51.0.linux-amd64.tar.gz
# 解压并安装
tar xvf prometheus-2.51.0.linux-amd64.tar.gz
cd prometheus-2.51.0.linux-amd64
sudo cp prometheus promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
# 验证安装
prometheus --version
promtool --version
3.3 配置文件深度解析
/etc/prometheus/prometheus.yml是核心配置文件,下面详细解析关键配置项:
yaml复制global:
scrape_interval: 15s # 抓取间隔,生产环境可根据负载调整
evaluation_interval: 15s # 规则评估间隔
scrape_timeout: 10s # 单次抓取超时时间
rule_files:
- 'port_alerts.yml' # 告警规则文件路径
scrape_configs:
- job_name: 'prometheus' # 监控Prometheus自身
static_configs:
- targets: ['localhost:8063']
- job_name: 'blackbox' # Blackbox Exporter自身监控
metrics_path: /metrics
static_configs:
- targets: ['localhost:8064']
- job_name: 'port_monitoring'
metrics_path: /probe
params:
module: [tcp_connect]
file_sd_configs: # 使用文件服务发现
- files:
- '/etc/prometheus/files.d/port_targets.yml'
refresh_interval: 30s
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:8064 # Blackbox Exporter地址
- source_labels: [__meta_filepath]
target_label: __file_path # 保留文件路径标签用于调试
3.4 Systemd服务单元优化
创建优化的systemd服务文件/etc/systemd/system/prometheus.service:
ini复制[Unit]
Description=Prometheus Monitoring System
Documentation=https://prometheus.io/docs/introduction/overview/
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Restart=always
RestartSec=3
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--storage.tsdb.retention.time=30d \
--web.listen-address=0.0.0.0:8063 \
--web.enable-lifecycle \
--web.external-url=http://your-domain.com:8063 \
--log.level=info
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65536
TimeoutStopSec=30s
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
关键参数说明:
--storage.tsdb.retention.time:数据保留时间,生产环境建议7d-30d--web.enable-lifecycle:启用配置热重载APILimitNOFILE:提高文件描述符限制,应对大量监控目标
启动服务并验证:
bash复制sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
sudo systemctl status prometheus
# 验证Web界面
curl -s http://localhost:8063/-/healthy
4. Blackbox Exporter部署与配置
4.1 模块化探测配置
Blackbox Exporter的强大之处在于其模块化设计,以下是生产级配置示例/etc/blackbox_exporter/blackbox.yml:
yaml复制modules:
tcp_connect:
prober: tcp
timeout: 5s
tcp:
preferred_ip_protocol: "ip4"
ip_protocol_fallback: false
tls: false
tls_config:
insecure_skip_verify: false
source_ip_address: ""
query_response:
- expect: "^SSH-2.0-"
send: "SSH-2.0-blackbox-ssh-check"
http_2xx:
prober: http
timeout: 5s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2"]
valid_status_codes: [200, 301, 302]
method: GET
headers:
Host: "example.com"
Accept-Language: "en-US"
no_follow_redirects: false
fail_if_ssl: false
fail_if_not_ssl: false
tls_config:
insecure_skip_verify: false
4.2 高级TCP探测技巧
对于特定协议的端口,我们可以配置更精细的探测:
yaml复制 mysql_probe:
prober: tcp
timeout: 5s
tcp:
tls: false
query_response:
- send: "\x00\x00\x00\x0a\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
expect: ".\x00\x00\x00\x0a"
4.3 资源隔离与性能调优
创建专用的systemd服务单元/etc/systemd/system/blackbox_exporter.service:
ini复制[Unit]
Description=Blackbox Exporter
Documentation=https://github.com/prometheus/blackbox_exporter
After=network-online.target
[Service]
User=blackbox_exporter
Group=blackbox_exporter
Restart=always
RestartSec=3
ExecStart=/usr/local/bin/blackbox_exporter \
--config.file=/etc/blackbox_exporter/blackbox.yml \
--web.listen-address=0.0.0.0:8064 \
--log.level=info \
--web.max-connections=50 \
--timeout-offset=0.5
LimitNOFILE=65536
MemoryLimit=512M
CPUQuota=100%
[Install]
WantedBy=multi-user.target
关键调优参数:
--web.max-connections:限制并发连接数,避免过载--timeout-offset:为探测设置额外超时缓冲MemoryLimit:限制内存使用,防止OOM
5. 监控目标管理
5.1 基于文件的服务发现
推荐使用文件服务发现方式管理监控目标,创建/etc/prometheus/files.d/port_targets.yml:
yaml复制- targets:
- github.com:80
- github.com:443
- 8.8.8.8:53
- internal-server:3306
labels:
env: production
region: us-west
team: infrastructure
5.2 动态目标管理脚本
创建/usr/local/bin/manage_port_targets.sh脚本实现动态管理:
bash复制#!/bin/bash
# 用法: manage_port_targets.sh [add|remove] <host> <port> [labels...]
CONFIG_DIR="/etc/prometheus/files.d"
TARGETS_FILE="$CONFIG_DIR/port_targets.yml"
TEMP_FILE=$(mktemp)
function add_target {
local host=$1 port=$2
local target="$host:$port"
if grep -q "$target" "$TARGETS_FILE"; then
echo "Target $target already exists"
return 1
fi
# 提取标签参数
shift 2
local labels=""
for label in "$@"; do
labels+="\n $label"
done
# 添加到targets列表
sed -i "/targets:/a\ - $target$labels" "$TARGETS_FILE"
# 重载Prometheus配置
curl -X POST http://localhost:8063/-/reload
echo "Added target $target and reloaded config"
}
function remove_target {
local target="$1:$2"
if ! grep -q "$target" "$TARGETS_FILE"; then
echo "Target $target not found"
return 1
fi
# 删除目标行及其后的标签行(以6个空格开头)
sed -i "/$target/,/^ -/d" "$TARGETS_FILE"
# 重载配置
curl -X POST http://localhost:8063/-/reload
echo "Removed target $target and reloaded config"
}
case "$1" in
add)
shift
add_target "$@"
;;
remove)
shift
remove_target "$@"
;;
*)
echo "Usage: $0 [add|remove] <host> <port> [labels...]"
exit 1
;;
esac
6. 告警规则与通知
6.1 生产级告警规则
创建/etc/prometheus/rules.d/port_rules.yml:
yaml复制groups:
- name: port-monitoring
rules:
- alert: CriticalPortDown
expr: probe_success == 0
for: 2m
labels:
severity: critical
service: port-monitoring
annotations:
summary: "Critical port {{ $labels.instance }} is down"
description: |
Port {{ $labels.instance }} has been down for over 2 minutes.
Current probe status: {{ $value }}
Job: {{ $labels.job }}
Environment: {{ $labels.env }}
- alert: HighPortLatency
expr: probe_duration_seconds > 1
for: 5m
labels:
severity: warning
service: port-monitoring
annotations:
summary: "High latency on port {{ $labels.instance }}"
description: |
Port {{ $labels.instance }} has high response latency ({{ $value }}s).
This may indicate network congestion or service degradation.
6.2 Alertmanager集成
配置Alertmanager实现告警通知(需额外部署):
yaml复制route:
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'slack-notifications'
routes:
- match:
severity: 'critical'
receiver: 'pagerduty'
receivers:
- name: 'slack-notifications'
slack_configs:
- api_url: 'https://hooks.slack.com/services/...'
channel: '#alerts'
send_resolved: true
title: '{{ template "slack.title" . }}'
text: '{{ template "slack.text" . }}'
- name: 'pagerduty'
pagerduty_configs:
- service_key: 'your-pagerduty-key'
severity: 'critical'
7. Grafana可视化
7.1 端口监控仪表板
推荐使用ID 13659仪表板,或创建自定义面板包含以下关键图表:
端口状态矩阵:
- 使用Stat面板显示端口up/down状态
- 设置阈值:1(up)和0(down)
- 按env、team等标签分组
延迟热力图:
- 使用Heatmap面板显示probe_duration_seconds
- 设置合理的buckets范围(0-0.1s, 0.1-0.5s, 0.5-1s, 1-2s, 2+)
成功率趋势:
- 使用Graph面板显示avg(probe_success) by (instance)
- 设置7天时间范围,便于观察长期趋势
7.2 告警面板最佳实践
创建专门的告警面板包含:
- 当前触发的告警列表
- 告警历史趋势
- 按严重程度分组的告警统计
- 告警解决时间统计
8. 生产环境运维建议
8.1 性能监控与调优
监控Blackbox Exporter自身指标:
blackbox_exporter_probe_duration_seconds:探测耗时blackbox_exporter_probes_total:总探测次数process_resident_memory_bytes:内存使用量
当监控目标超过500个时,建议:
- 增加Blackbox Exporter实例数量
- 配置Prometheus分片抓取
- 调整
scrape_interval为30s-60s
8.2 安全加固措施
- 使用反向代理添加HTTPS和基础认证:
nginx复制server {
listen 443 ssl;
server_name prometheus.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:8063;
proxy_set_header Host $host;
auth_basic "Prometheus";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
- 配置网络访问控制:
bash复制# 只允许监控服务器访问Blackbox Exporter
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="8064" protocol="tcp" accept'
- 定期备份关键配置:
bash复制# 创建每日备份任务
sudo tar -czf /backups/prometheus-config-$(date +%F).tar.gz /etc/prometheus
9. 高级应用场景
9.1 分布式监控架构
对于跨地域的端口监控需求,可以采用以下架构:
code复制[区域1] Prometheus + Blackbox ──┬─> [中心] Thanos/VM
[区域2] Prometheus + Blackbox ──┘
每个区域部署独立的Prometheus和Blackbox Exporter,通过Thanos或VictoriaMetrics实现全局视图。
9.2 结合服务发现
集成Consul、Kubernetes等服务发现机制:
yaml复制scrape_configs:
- job_name: 'consul-port-checks'
consul_sd_configs:
- server: 'localhost:8500'
services: ['mysql', 'redis', 'nginx']
metrics_path: /probe
params:
module: [tcp_connect]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__meta_consul_service_port]
target_label: __param_target
replacement: '$1:$2'
- target_label: __address__
replacement: blackbox-exporter:8064
10. 故障排查手册
10.1 常见问题诊断
问题1:探测结果不一致
- 检查网络波动:
ping -c 10 target.com - 验证DNS解析:
dig +short target.com - 直接测试端口:
telnet target.com 80或nc -zv target.com 443
问题2:Blackbox Exporter高负载
- 检查并发连接数:
ss -s | grep connections - 调整探测频率:增加
scrape_interval - 分析慢查询:
curl -s localhost:8064/debug/pprof/trace?seconds=5 > trace.out
10.2 日志分析技巧
Prometheus日志关键字段:
caller=scrape.go:抓取相关错误component=discovery:服务发现问题msg="Error on ingesting samples":数据存储问题
Blackbox Exporter调试模式:
bash复制# 启用debug日志级别
sudo systemctl edit blackbox_exporter
# 添加:
[Service]
Environment=GOMAXPROCS=2
ExecStart=
ExecStart=/usr/local/bin/blackbox_exporter --log.level=debug ...
11. 版本升级策略
- 测试环境验证:
bash复制# 下载新版本二进制
wget https://github.com/prometheus/blackbox_exporter/releases/download/vX.Y.Z/blackbox_exporter-X.Y.Z.linux-amd64.tar.gz
# 对比配置兼容性
/usr/local/bin/blackbox_exporter --config.file=blackbox.yml --check-config
- 滚动升级步骤:
bash复制# 1. 停止服务
sudo systemctl stop blackbox_exporter
# 2. 备份二进制和配置
cp /usr/local/bin/blackbox_exporter ~/backups/
# 3. 安装新版本
cp blackbox_exporter-X.Y.Z.linux-amd64/blackbox_exporter /usr/local/bin/
# 4. 启动服务
sudo systemctl start blackbox_exporter
# 5. 验证
curl -s http://localhost:8064/metrics | grep blackbox_exporter_build_info
12. 监控即代码实践
将整个监控系统配置纳入版本控制:
code复制/monitoring-repo
├── ansible/
│ ├── prometheus.yml
│ └── blackbox.yml
├── terraform/
│ └── monitoring.tf
├── configs/
│ ├── prometheus/
│ │ ├── prometheus.yml
│ │ └── rules/
│ └── blackbox/
│ └── blackbox.yml
└── scripts/
└── deploy-monitoring.sh
使用CI/CD管道实现配置自动部署:
yaml复制# GitLab CI示例
deploy_monitoring:
stage: deploy
script:
- ansible-playbook -i production ansible/prometheus.yml
- ansible-playbook -i production ansible/blackbox.yml
- ssh monitor01 "sudo systemctl reload prometheus blackbox_exporter"
only:
- master
13. 扩展监控维度
13.1 证书过期监控
扩展Blackbox配置:
yaml复制modules:
tls_expiry:
prober: tcp
tcp:
tls: true
tls_config:
insecure_skip_verify: false
timeout: 5s
Prometheus告警规则:
yaml复制- alert: SSLCertExpirySoon
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30 # 30天
for: 5m
labels:
severity: warning
13.2 网络质量监控
通过ICMP探测测量网络质量:
yaml复制modules:
icmp_latency:
prober: icmp
timeout: 5s
icmp:
preferred_ip_protocol: "ip4"
14. 资源优化配置
14.1 Prometheus存储优化
调整TSDB配置:
yaml复制# prometheus.yml
storage:
tsdb:
retention: 15d
min_block_duration: 2h
max_block_duration: 24h
out_of_order_time_window: 1h
14.2 Blackbox资源限制
使用cgroups限制资源:
ini复制# /etc/systemd/system/blackbox_exporter.service
[Service]
MemoryLimit=1G
CPUQuota=80%
IOWeight=100
15. 监控数据治理
15.1 指标标签规范
制定标签命名标准:
env: production/staging/developmentregion: us-east/eu-west/ap-southeastteam: infra/app/dbaservice: 业务服务名称
15.2 数据保留策略
分级存储方案:
- 热数据:Prometheus本地存储(15天)
- 温数据:VictoriaMetrics集群(3个月)
- 冷数据:对象存储(1年+)
16. 结束语
在实际生产环境中运行这套端口监控系统已有两年多时间,期间我们不断优化调整,总结出几点关键经验:
-
探测频率要合理:过于频繁的探测会给网络和服务带来压力,建议关键服务30s间隔,非关键服务1-5分钟间隔
-
标签设计要前瞻:初期就要规划好标签体系,避免后期重构带来的数据不一致问题
-
告警要分层分级:区分业务关键告警和技术指标告警,避免告警疲劳
-
容量要提前规划:监控目标增长往往比预期快,要提前规划Prometheus存储和Blackbox Exporter的横向扩展方案
这套系统目前稳定监控着我们全球5个区域的2000+个服务端口,平均每天处理超过500万次探测,已成为基础设施监控不可或缺的一部分。