低成本实现7x24小时网站内容监控
运维工作经常遇到网站打不开,APP的接口超时,SSL证书过期等等问题,我们就需要一个24小时的自动化监控
通过阿里云函数计算可实现分钟级的定时任务运行,支持php/java/go/python/nodejs等代码环境,而且还有免费额度
一、成本预估(按月计算)
资源 | 用量 | 费用 |
---|---|---|
函数调用次数 | 1440次(每分钟1次) | ¥0.00(免费额度内) |
出网流量 | 1MB/次 × 1440 | 约¥0.23 |
日志服务 | 1MB/day | ¥0.00 |
二、典型告警效果
📌 钉钉机器人收到的告警消息:
[监控告警] 内容异常 URL: https://example.com/status 预期内容: running 实际返回: <html>503 Service Unavailable</html> 时间:2023-08-20 14:30:05
通过这个方案,您可以用 低成本 实现7x24小时网站内容监控,异常时10秒内触达钉钉群。
以下是用 阿里云函数计算(PHP) 实现定时检测网址内容并发送钉钉告警的完整解决方案:
三、阿里云函数计算配置步骤
创建PHP函数
运行环境:
PHP 7.2
处理程序类型:
处理 HTTP 请求
代码包:上传包含上述代码的
index.php
登录 阿里云函数计算控制台
创建新函数:
配置环境变量
在函数配置页添加环境变量:
DINGDING_WEBHOOK = https://oapi.dingtalk.com/robot/send?access_token=你的token
设置定时触发器
触发器类型:
定时触发器
Cron表达式:
0 *\/30 * * * *
(每30分钟检测一次)高级选项:勾选「启用」
在函数详情页点击「触发器」→「创建触发器」:
测试函数
使用控制台的「测试函数」功能模拟触发
检查钉钉群机器人是否收到测试告警
四、完整PHP代码(函数计算入口文件 index.php
)
<?php function handler($event, $context) { // 1. 配置要监控的网址和预期内容(格式:URL => 预期包含的字符串) $urls = [ 'https://example.com/status' => 'running', // 示例配置1 'https://api.example.com' => '"status":"OK"' // 示例配置2(检测JSON字段) ]; // 2. 钉钉机器人配置(从环境变量获取Webhook) $dingding_webhook = getenv('DINGDING_WEBHOOK'); // 3. 开始检测每个URL foreach ($urls as $url => $expected) { $content = fetchUrlContent($url); if (strpos($content, $expected) === false) { sendDingAlert($dingding_webhook, "[监控告警] 内容异常", "URL: $url\n预期内容: $expected\n实际返回: " . substr($content, 0, 200)); } } return "监控执行完成"; } // 抓取网页内容(带超时和重试) function fetchUrlContent($url, $retry = 2) { $options = [ 'http' => ['timeout' => 5], // 5秒超时 'ssl' => ['verify_peer' => false] // 简单起见跳过证书验证 ]; while ($retry-- > 0) { try { $content = file_get_contents($url, false, stream_context_create($options)); return $content !== false ? $content : "无法获取内容"; } catch (Exception $e) { // 最后一次重试仍失败则返回错误 if ($retry <= 0) return "请求异常: " . $e->getMessage(); } } } // 发送钉钉机器人警报 function sendDingAlert($webhook, $title, $text) { $data = [ 'msgtype' => 'markdown', 'markdown' => [ 'title' => $title, 'text' => "**{$title}**\n\n{$text}\n\n时间:" . date('Y-m-d H:i:s') ] ]; $options = [ 'http' => [ 'method' => 'POST', 'header' => "Content-Type: application/json", 'content' => json_encode($data) ] ]; file_get_contents($webhook, false, stream_context_create($options)); } ?>
如需帮助可联系QQ/wx:706448591