个人网站我一般使用 [Let's Encrypt](https://letsencrypt.org/) 的免费 CA 证书,当网站一多管理这些证书就显得比较麻烦,所以我非常希望有一个工具,能够将这些域名服务状态都列出来,包括证书过期时间、访问延迟、以及请求状态码等。

恰好上周看到 Grafana Labs 的一篇博客 [How we eliminated service outages from ‘certificate expired’ by setting up alerts with Grafana and Prometheus](https://grafana.com/blog/2020/11/25/how-we-eliminated-service-outages-from-certificate-expired-by-setting-up-alerts-with-grafana-and-prometheus/) 中讲到了使用 Grafana 的 表格视图来展示域名证书监控信息,觉得非常受用,惊呼这不就是我长期想要的东西吗?

Grafana 监控面板效果图

迫不及待,我立马在本地搭建了一套测试环境体验了一下,下面是整个测试过程。

本地测试环境搭建

我是在 Mac 上使用 Docker 搭建的测试环境,网络拓扑如下:

因为服务之间要相互访问,为了防止重启 container 导致IP地址变化,故创建了一个叫做 `mynetwork` 网段为 `172.18.0.0/16` 的自定义网络。创建容器的时候可以通过 `--ip` 手动分配静态 IP,各容器分配的 IP 地址如上图。

启动 nginx 容器

启动 nginx 之前我们需要创建测试域名的证书和配置文件,本次测试涉及三个域名(www.test01~3.com)。

创建域名证书

使用 `genrsa.sh` 脚本批量创建自签名证书,脚本内容如下:

#!/bin/bash#1、该脚本支持自动生成私有证书#   ,用$1,$2....表示,第1,2...个参数,分表表示域名和过期时间if [ "$#" -ne 2 ]; then    echo "genrsa.sh www.test01.com 60"    exit 1fireadonly DOMAIN=$1readonly EXPIRATION=$2openssl genrsa -out $DOMAIN.key 2048openssl req \    -subj "/C=CN/ST=Beijing/L=Beijing/O=Tester/OU=Tester Software/CN=$DOMAIN/emailAddress=test@prometheus.show" \    -new \    -key $DOMAIN.key \    -out $DOMAIN.csropenssl x509 \    -req \    -days $EXPIRATION \    -in $DOMAIN.csr \    -signkey $DOMAIN.key \    -out $DOMAIN.crt

运行效果:

创建 nginx 配置文件

# touch nginx/conf.d/www.test01.com.confserver {    listen 443 ssl;    server_name         www.test01.com;    ssl_certificate     ssl/www.test01.com.crt;    ssl_certificate_key ssl/www.test01.com.key;    location / {      return 200;    }}# touch nginx/conf.d/www.test02.com.confserver {    listen 443 ssl;    server_name         www.test02.com;    ssl_certificate     ssl/www.test02.com.crt;    ssl_certificate_key ssl/www.test02.com.key;    location / {      return 403;    }}# touch nginx/conf.d/www.test03.com.confserver {    listen 443 ssl;    server_name         www.test03.com;    ssl_certificate     ssl/www.test03.com.crt;    ssl_certificate_key ssl/www.test03.com.key;    location / {      return 200;    }}
  • 创建了三个域名所需的证书和配置文件。

  • 网站 www.test02.com 返回 403 状态码,其它返回 200。

执行容器启动命令

docker run -d --name nginx \    --net mynetwork --ip 172.18.0.2 \    -v `pwd`/nginx/ssl:/etc/nginx/ssl:ro \    -v `pwd`/nginx/conf.d:/etc/nginx/conf.d \    nginx

到此为止用于测试的 nginx 容器就启动起来了,它包了 www.test01~3.com 三个测试域名,每个域名都有自己的证书,每个证书过期时间不同。

启动 blackbox exporter

用于测试的网站已经部署完成,接下来部署 blackbox exporter。

创建 blackbox.yml

modules:  http_2xx:    prober: http    http:      preferred_ip_protocol: "ip4"      tls_config:        insecure_skip_verify: true
  • 这里使用 blackbox exporter 的 http 探针。

  • 当执行 http 探测的时候,指定使用 ipv4 协议,因为是自签名证书,故配置 `insecure_skip_verify: true`。

执行启动命令

docker run -d -p 9115:9115 \    --name blackbox_exporter \    --net mynetwork --ip 172.18.0.3 \    --add-host www.test01.com:172.18.0.2 \    --add-host www.test02.com:172.18.0.2 \    --add-host www.test03.com:172.18.0.2 \    -v `pwd`:/config \    prom/blackbox-exporter:v0.18.0 --config.file=/config/blackbox.yml

要探测 www.test01~3.com 这三个域名,所以需要通过 `--add-host` 手动指定其解析的 IP 为 nginx 容器地址。

启动 Prometheus

当 blackbox exporter 部署完成后,我们需要部署 Prometheus 来抓取和存储数据。

更新 prometheus.yml 配置文件

scrape_configs:  - job_name: 'blackbox'    metrics_path: /probe    params:      module: [http_2xx]    static_configs:      - targets:        - https://www.test01.com        - https://www.test02.com        - https://www.test03.com    relabel_configs:      - source_labels: [__address__]        target_label: __param_target      - source_labels: [__param_target]        target_label: instance      - target_label: __address__        replacement: blackbox01.com:9115
  • 通过静态 static_configs 指定需要探测地址为 www.test01~03.com。

  • 通过 relabel_configs 将实际的 metrics 获取地址重定向到 blackbox exporter 的地址,即我们配置的 172.18.0.3,这里使用了 `blackbox01.com` 域名来代替。

执行容器启动命令

docker run -d -p 9090:9090 \    --name prometheus \    --net mynetwork --ip 172.18.0.4 \    --add-host blackbox01.com:172.18.0.3 \    -v `pwd`/prometheus.yml:/etc/prometheus/prometheus.yml \    prom/prometheus:v2.23.0

启动并配置 Grafana

经过上面的操作,已经能够在 Prometheus 的 graph 页面查看到 probe_ 开头的相关指标,我们可以更进一步,使用 Grafana 来展示。

启动 Grafana 容器

docker run -d -p 3000:3000 \    --name=grafana \    --net mynetwork --ip 172.18.0.5 \    --add-host prometheus01.com:172.18.0.4 \    grafana/grafana

这里将 promtheus 地址映射为 `prometheus01.com` ,这样在 grafana 可以直接使用该域名来创建数据源。

创建 Grafana 监控面板

使用 admin/admin 初始密码登录 http://localhost:3000 ,并使用 `prometheus01.com:9090` 创建默认 Promethues 数据源。

导入 ID 为 `13230` 的模板:

导入结果:

可以看到我们用于测试的这三个网站的探测信息都展示到 Grafana 图表了,展示内容包括我们想要的证书过期时间、状态码、连接各阶段耗时。

告警配置

除了可以通过 Grafana 面实时查看域名探测结果,我们可以配置 Prometheus rules 并结合 Alertmanager 实现告警监控。

告警配置如:

- name: ssl_expiry  rules:  - alert: Ssl Cert Will Expire in 7 days    expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 7    for: 5m    labels:      severity: warning    annotations:      summary: "域名证书即将过期 (instance {{ $labels.instance }})"      description: "域名证书 7 天后过期 \n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"

可能需要监控的指标:

  • expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 7 实现域名过期检测,比如这里过期时间小于 7 天告警。

  • expr: probe_http_status_code != 200 实现状态码不为 200的告警。

  • expr: sum(probe_http_duration_seconds) by (instance) > 1 实现总耗时大于 1 秒的告警。

总结

今天我们在本地通过 Nginx 容器搭建了三个过期时间为 3d、60d 、365d 的测试域名,然后通过容器启动 Blackbox exporter 和 Prometheus 来探测和收集这三个域名的 metrics,最后通过 Grafana 的 13230 模板统一展示这个三个域名的探测结果。

通过测试可以看到,使用Blackbox Exporter 和 Prometheus 实现域名证书的探测和监控是非常方便的,而且 Grafana 的显示效果非常好,值得大家试试。

localhost使用ipv4_使用 blackbox exporter 实现域名证书过期监控相关推荐

  1. 域名证书到期监控告知

    域名证书到期提前监控告知 通过该网站进行服务证书监控 证书到期监控:https://letsmonitor.org/contacts 通过邮件告警通知 个人用户:baolin2200@gmail.co ...

  2. python 批量域名证书过期查找(二),从阿里云导出后的文件夹中的excel查找

    python 读取文件夹中 从阿里云导出后的域名excel 判断域名 ssl 过期 import os import ssl import socket import requestsfrom ope ...

  3. shell脚本检查域名证书是否过期

    最近公司的域名准备过期了,防止用户访问的时候出现异常,所以最近我们准备替换相关网站证书为最新的. (一般HTTPS证书有效期为1年,证书过期后或者该证书不是该域名的有效证书时,在浏览器中访问会出现如下 ...

  4. 如何使用 Blackbox Exporter 监控 URL?

    前言 监控域名和 URL 是可观察性的一个重要方面,主要用于诊断可用性问题.接下来会详细介绍如何使用 Blackbox Exporter 和 Prometheus 在 Kubernetes 中实现 U ...

  5. Prometheus - Blackbox Exporter

    简介: BlackBox Exporter 顾名思义就是在应用程序的外部对其进行探测, 支持 HTTP.HTTPS.DNS.TCP.ICMP等方式对目标进行检测. BlackBox Exporter ...

  6. 微信小程序报错 http://localhost:8084 不在以下 request 合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/a

    http://localhost:8084 不在以下 request 合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/netwo ...

  7. prometheus监控域名证书到期时间

    参考:https://mp.weixin.qq.com/s/gXffcNzixAiTKSBZcf2sBA 最终效果图: 下面全部使用docker部署: 一.部署prometheus 这是一个默认的pr ...

  8. 利用openssl签署多域名证书

    openssl自建CA默认签署的是单域名证书,因为单台服务器上有多个https域名,签署多域名证书能方便很多,今天找了很久,除了一些卖证书的网站上有scr工具能加"使用者备用名称" ...

  9. let's encrypt部署免费泛域名证书

    环境说明 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@localhos ...

最新文章

  1. KafkaOffsetMonitor 安装
  2. unicode表_Python数据库操作 Mysql数据库表引擎与字符集#学习猿地
  3. XML Parsing in a Producer-Consumer Model
  4. Linux 本地密码正确无法登录,记一次无法正常本地登陆Linux服务器(确定密码正确)...
  5. linux命令apprw,linux命令学习1(示例代码)
  6. springmvc是什么_当一个http请求来临时,SpringMVC究竟偷偷帮你做了什么?
  7. Pytorch 实现 MLP
  8. window.onload和$(document).ready()比较
  9. 商城购物车php代码,php实现商城购物车的思路和源码分析
  10. 计算机绘图cad期末考试试题,工程制图考试
  11. 黑马程序员_银行调度系统
  12. Linux系统无法在spyder5中输入中文的解决办法
  13. 数据分析实战项目练习——物流行业数据分析
  14. 手机微信发语音没有声音
  15. 金山系不惧微软,前有WPS力扛Office,后有eversheet接力再战
  16. CG cosh, exp, sinh, smoothstep, tanh, perlin_easeCurve1/2 曲线
  17. python基础——matplotlib——scatter和plot方法中的maker参数(点的样式)
  18. 连接MySql报错【ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)】
  19. 基于Android studio个人财务记账管理系统
  20. c语言求比平均值大的元素,c语言 10个元素的数组求平均值并输出比平均值大的数...

热门文章

  1. 2020-9-16晚上导师问我Spartacus的学习进度,我的回答
  2. simulation pipeline after change not refresh issue
  3. SAP Fiori My task里complete checkbox的处理
  4. SAP Leonardo机器学习Restful API如何获得Access Token
  5. SAP CRM One Order框架搜索条件里,posting date下拉菜单的渲染逻辑
  6. Necessary configuration to get Smart business tile work in UXT/928
  7. SAP ABAP实用技巧介绍系列之ABAP取中文字符串的字节长度
  8. why my filter by titleID does not work
  9. 如何添加任意一个UI component到SAP CRM的overview页面上
  10. 使用cgroup对指定用户使用的memory进行限制的一个具体例子