想让网站挂了30秒内就知道、SSL证书到期前就收到通知、内容被人改动能马上发现,这三种监控一种都不能少,而最好用的免费工具其实就两三个
先说个真实情况:大部分人发现自己网站挂了,不是监控告诉他的,是客户打电话来骂的。有的甚至客户骂完了自己还不知道,等打开网站一看才发现已经挂了半天了。
还有更亏的——SSL证书过期了浏览器直接显示红色警告页,访客点进去看到"不安全"扭头就走,跳出率飙升到90%。而这种损失用一条免费的监控就能避免。
网站监控不是只有"能不能打开"这一个维度。能打开不代表没问题。页面被挂马了能打开、CDN回源挂了首页还能看到缓存、搜索结果页渲染时间从0.3秒涨到6秒——这些都是"能打开"但出事了的情况。一套够用的监控至少要覆盖三个层面:可用性(能不能访问)、证书和域名(有没有快过期)、内容完整性(页面有没有被篡改)。下面一层层说。
三种监控,缺一个都不行
| 监控类型 | 解决什么问题 | 不做的后果 |
|---|---|---|
| 可用性监控 | 网站挂了、响应超时、CDN回源故障 | 客户流失、广告费白烧、SEO排名跳水 |
| SSL证书+域名监控 | 证书过期、域名忘记续费、证书链错误 | 浏览器红色警告页,所有访客被吓跑 |
| 内容篡改监控 | 页面被挂马、挂暗链、敏感词被替换 | 搜索引擎拉黑、被安全软件拦截、品牌受损 |
一、可用性监控:UptimeRobot免费50个够了,Better Stack免费10个但3分钟一次更快,Uptime Kuma自己搭一台服务器想加多少加多少
这是最基础的监控。原理就是监控工具从全球多个节点定时访问你的网站,检查HTTP状态码是不是200、响应时间有没有超阈值。一旦出问题,通过邮件、微信、钉钉、Slack等渠道推给你。
市面上的工具很多,但免费好用的就集中在三四个。
六个主流可用性监控工具,免费方案怎么选
| 工具 | 免费额度 | 检查间隔 | 告警方式 | 亮点/短板 |
|---|---|---|---|---|
| UptimeRobot | 50个监控 | 5分钟 | 邮件、Slack、Webhook、Telegram等 | 亮点 50个免费量大管饱 短板 5分钟间隔,挂了最快5分钟后才通知 |
| Better Stack | 10个监控 | 3分钟 | 邮件、Slack、Discord、SMS等 | 亮点 3分钟间隔+无限历史数据 短板 免费只10个,站点多了不够 |
| Pingdom | 无免费方案 | - | - | $10/月起,全球100+节点,适合企业 |
| StatusCake | 10个监控 | 5分钟 | 邮件、Slack、Webhook等 | 亮点 附带SSL监控+页面速度测试 短板 免费版功能阉割较多 |
| 咕咕监控 | 5个监控 | 1分钟起 | 微信、钉钉、飞书、邮件 | 亮点 国内微信推送,中文界面友好 短板 免费只5个,节点主要在国内 |
| Uptime Kuma | 无限 | 自定义(秒级) | 70+通知渠道 | 亮点 开源免费、Docker一行部署、监控无上限 短板 需要自己有服务器跑Docker |
如果你只有三五个站点、对响应速度要求不高,UptimeRobot免费50个绝对够用,注册完填URL就能跑。如果站点重要、希望出问题3分钟内就知道,Better Stack的10个免费名额更合适。如果站点超过50个,或者需要1分钟甚至30秒级别的检查频率,Uptime Kuma自己搭一台VPS跑Docker是最划算的。
Uptime Kuma部署就一行命令:

docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1浏览器打开服务器IP:3001就能用了。支持HTTP(s)、TCP端口、Ping、DNS记录、Docker容器状态、Steam游戏服务器等各种协议,通知渠道从企业微信、钉钉、飞书到Telegram、Discord、Slack应有尽有,还有好看的状态页面可以对外展示。
二、SSL证书和域名到期监控:这可能是最容易被忘掉、但后果最严重的一项
SSL证书过期后浏览器直接拦截访问,显示"您的连接不是私密连接"。对电商站、SaaS产品来说,这跟网站直接挂了没有区别——甚至更糟,因为挂了至少访客知道是你的问题,证书过期看起来像"这个网站不安全"。
证书监控要看三个维度:过期时间、证书链完整性、域名匹配(SAN是否正确)。市面上专门做SSL监控的工具不少:
磁钉SSL监控
纯免费,每日自动检测,支持邮件+Webhook通知,可以自定义提前多少天提醒(比如到期前30天、14天、7天分三次提醒),还支持批量导入域名。对个人和小团队完全够用。
StatusCake
SSL监控是免费方案的附带功能,同时监控可用性+证书+页面速度。证书过期前30天开始提醒。缺点是免费版只有10个名额,多域名站群不够。
域名到期监控也是同理。域名忘记续费比SSL证书过期更致命——证书过期换个新的几分钟搞定,域名过期进入赎回期要花几倍甚至几十倍的价钱才能拿回来。UptimeRobot和Better Stack都支持WHOIS域名到期检查,在创建监控时选"Domain expiry"类型就行。
SSL+域名监控一句话总结
| SSL监控 | 用磁钉免费的就够,或者StatusCake顺带做。关键要设三道提醒:到期前30天、14天、7天各一次。 |
| 域名监控 | UptimeRobot或Better Stack加一条Domain expiry监控,到期前60天开始提醒。域名在阿里云/腾讯云买的也别忘了开启平台自带的续费提醒。 |
三、内容篡改监控:最容易被忽略,但对SEO和品牌伤害最大
网站能打开、证书没过期,不代表页面没被动手脚。以下几种情况用可用性监控是查不出来的:

· 页面底部被植入隐藏的菠菜链接(暗链),搜索引擎会惩罚但普通监控看不出来
· 首页标题被替换成违规内容,200状态码正常返回
· WordPress插件漏洞导致页面被注入恶意JS脚本
· 竞争对手删改你的关键页面内容
这种场景需要内容变更监控——工具定期抓取页面内容,对比上次快照,有变化就告警。
changedetection.io
开源免费,Docker一键部署。可以监控网页的文字变化、CSS选择器指定区域的变化、甚至是价格数字的变化。支持邮件、Slack、Webhook告警。电商站用来监控竞品价格变动也很实用。
自己写个Python脚本
逻辑很简单:定时请求页面 → 对正文取哈希 → 和上次哈希比对 → 不一致就告警。加个crontab或Windows计划任务就行,告警用Server酱推到微信或者钉钉Webhook。下面是一段核心逻辑。

import hashlib, requests, time, jsonfrom bs4 import BeautifulSoupURL = "https://你的网站.com"WEBHOOK = "https://qyapi.weixin.qq.com/钉钉或企微webhook地址"def get_hash():soup = BeautifulSoup(requests.get(URL, timeout=10).text, 'html.parser')# 只取正文内容,排除header/footer/script等动态部分body = soup.find('main') or soup.find('article') or soup.bodytext = body.get_text() if body else soup.get_text()return hashlib.md5(text.encode()).hexdigest()last_hash = get_hash()while True:time.sleep(600) # 每10分钟检查一次new_hash = get_hash()if new_hash != last_hash:requests.post(WEBHOOK, json={"msgtype": "text","text": {"content": f"⚠️ {URL} 页面内容已变更,请检查!"}})last_hash = new_hash脚本跑在自己的服务器上就行。注意两点:一是只取正文部分做哈希,不要包含header、footer、侧边栏等会自然变化的内容;二是检查间隔不要太短,10-30分钟比较合理,太频繁会给自己服务器增加不必要的压力。
四、Python自建全套监控脚本:不想装Docker、不想注册第三方,用30行代码也能跑起来
有些人不想用任何第三方服务,也不想装Docker跑Uptime Kuma——比如服务器资源本身就紧张、或者觉得数据交给外部不放心。这种情况用Python写个自监控脚本是最轻量的方案。
一个脚本搞定三件事:可用性 + SSL到期 + 内容变化
import requests, ssl, socket, hashlib, time, jsonfrom datetime import datetimefrom bs4 import BeautifulSoupSITES = ["https://site1.com", "https://site2.com"]WEBHOOK = "你的钉钉/企微/Server酱Webhook地址"CHECK_INTERVAL = 300 # 5分钟def send_alert(msg):requests.post(WEBHOOK, json={"msgtype":"text","text":{"content":msg}})def check_uptime(url):"""可用性检查:状态码+响应时间"""try:start = time.time()r = requests.get(url, timeout=15, headers={"User-Agent":"MonitorBot"})elapsed = round(time.time()-start, 2)if r.status_code != 200:return f"❌ {url} 返回 {r.status_code}"if elapsed > 5:return f"⚠️ {url} 响应慢 {elapsed}s"return None # 正常except Exception as e:return f"💥 {url} 不可达: {str(e)[:100]}"def check_ssl(domain):"""SSL证书到期检查"""try:ctx = ssl.create_default_context()with socket.create_connection((domain, 443), timeout=10) as s:with ctx.wrap_socket(s, server_hostname=domain) as ss:cert = ss.getpeercert()expire = datetime.strptime(cert['notAfter'], "%b %d %H:%M:%S %Y %Z")days_left = (expire - datetime.now()).daysif days_left < 7:return f"🔴 {domain} SSL {days_left}天后过期!"elif days_left < 30:return f"🟡 {domain} SSL {days_left}天后过期"return Noneexcept: return f"⚠️ {domain} SSL检查失败"content_hashes = {}for url in SITES:try:r = requests.get(url, timeout=10, headers={"User-Agent":"MonitorBot"})soup = BeautifulSoup(r.text, 'html.parser')body = soup.find('main') or soup.find('article') or soup.bodytext = body.get_text() if body else soup.get_text()content_hashes[url] = hashlib.md5(text.encode()).hexdigest()except: passwhile True:alerts = []for url in SITES:r1 = check_uptime(url)if r1: alerts.append(r1)r2 = check_ssl(url.split("//")[1].split("/")[0])if r2: alerts.append(r2)try:r = requests.get(url, timeout=10, headers={"User-Agent":"MonitorBot"})soup = BeautifulSoup(r.text, 'html.parser')body = soup.find('main') or soup.find('article') or soup.bodynew_hash = hashlib.md5((body.get_text() if body else soup.get_text()).encode()).hexdigest()if new_hash != content_hashes.get(url):alerts.append(f"🔄 {url} 页面内容变更")content_hashes[url] = new_hashexcept: passif alerts:send_alert("\n".join(alerts))time.sleep(CHECK_INTERVAL)把这个脚本放到服务器上用nohup或者systemd守护进程跑起来,再配个钉钉或企微群机器人Webhook,告警消息直接推到手机上。没有第三方依赖,代码全透明,想加什么功能自己改。
自建脚本几个容易踩的坑
· timeout一定要设。不设的话遇到一个挂掉的服务器,整个监控循环就卡死在那了。
· User-Agent要设。有些服务器会拒绝默认的Python requests UA(直接返回403),设成正常浏览器的UA能避免误报。
· 检查节点单一是个问题。脚本跑在你自己服务器上,如果服务器网络出问题了,所有站点都报不可达——但其实是你的监控节点挂了,不是站点挂了。解决方法是在另一台机器上也跑一份,或者至少保留一个外部监控(比如UptimeRobot免费版)做交叉验证。
· 别用ping检测可用性。ping只验证ICMP协议,服务器能ping通不代表Web服务正常。一定要用HTTP请求+状态码判断。
五、不同规模的网站,监控方案怎么搭
| 站点规模 | 推荐方案 | 月成本 | 说明 |
|---|---|---|---|
| 1-5个站点 个人博客、小企业站 | Better Stack(可用性)+ 磁钉SSL(证书) | 0元 | 全免费,3分钟级响应,够用了 |
| 5-50个站点 站群、多客户 | UptimeRobot免费50个 + 磁钉SSL + Python内容监控脚本 | 0元 | UptimeRobot 5分钟间隔稍慢但够用 |
| 50+个站点 大型站群、代维公司 | Uptime Kuma自建 + 磁钉SSL批量 | VPS约30-50元/月 | Docker部署Kuma,秒级检查,无限监控数 |
| 电商/金融级 SaaS、交易平台 | Pingdom或Better Stack付费版 + 自建备份监控 + changedetection.io内容监控 | $10-30/月 | 全球多节点、30秒级间隔、电话告警 |
六、监控搭好了,还有两个容易漏掉的点
第一,监控系统本身也需要监控。UptimeRobot挂了怎么办?自建脚本的服务器宕机了怎么办?解决方案是至少用两个独立来源:比如UptimeRobot(外部)+ 自建Python脚本(自己的服务器),两者同时挂的概率极低。
第二,告警要有降噪机制。网站偶尔的网络波动(比如请求超时一次)不需要半夜把人叫起来。好一点的工具都支持"连续N次失败再告警"的逻辑,比如Better Stack默认连续两次失败才触发通知,避免了偶发性超时的误报。自建脚本也建议加上这个逻辑:连续3次检查失败再推送告警。
说穿了,网站监控这件事不是什么高深技术,关键是想不想得起来做。大多数个人站长和中小公司,一个UptimeRobot免费版加一个磁钉SSL监控就能覆盖90%的风险场景,注册+配置不超过10分钟。10分钟换一年安心,这笔账怎么算都不亏。真正亏的是客户打电话告诉你网站挂了,你才去修——那时候已经不知道跑了多少单了。
