找回密码
 立即注册
搜索
人人必备的 Wise 💳英、德、香港转运 📦,送 $25数字货币银行卡,注册送 7 美元💲
最便宜的 eSIM 流量手机号 📱帕劳身份证 🆔免绑卡永久免费服务器 🌐
查看: 124|回复: 0

[Azure] 用免费的 Azure Function App 给免费的 Azure Web App 保活的方式

[复制链接]
HelloWorld 发表于 2025-9-5 14:08:46 | 显示全部楼层 |阅读模式

注册免广告

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 HelloWorld 于 2025-9-7 18:01 编辑

Azure 提供免费的 Web App 可以运行各种后端:https://shuzijumin.com/thread-7735-1-1.html

但是这个免费版,20 分钟没访问会休眠,下次唤醒要等很久,导致网页打开以为网站挂了

因此想到用免费的 Azure Function App,定时 19 分钟访问一下 Web App 的网址,这样就可以保活了

1. 进 Azure 门户 → “Create a resource” → Function App,套餐方选 Consumption 而不是 Flex Consumption
2. Runtime stack 选 Node.js,Operating System 选 Windows,然后创建
3. 进入你刚建好的 Function App → Create → 模板选 Timer trigger,Schedule 填: 0 */19 * * * * (表示每小时的 0、19、38 分触发)
4. 接下去放入如下代码:
  1. // index.js  (Node.js on Azure Functions - Timer trigger)
  2. const https = require('https');
  3. const http = require('http');

  4. module.exports = async function (context, myTimer) {
  5.   context.log('TimerTrigger1 function started');

  6.   // 添加计时器信息日志
  7.   if (myTimer.IsPastDue) {
  8.     context.log('Timer function is running late!');
  9.   }

  10.   const url = "https://xxxxxx.azurewebsites.net";
  11.   if (!url) {
  12.     context.log('PING_URL env not set. Skipping.');
  13.     return;
  14.   }
  15.   context.log(`Pinging: ${url}`);

  16.   try {
  17.     await new Promise((resolve, reject) => {
  18.       const client = url.startsWith('https') ? https : http;
  19.       const req = client.get(url, (res) => {
  20.         context.log(`Ping successful - Status: ${res.statusCode}`);
  21.         res.resume(); // 丢弃响应体,尽快释放连接
  22.         resolve();
  23.       });

  24.       // 设置请求超时(30秒)
  25.       req.setTimeout(30000, () => {
  26.         req.destroy();
  27.         context.log.error('Ping failed: Request timeout');
  28.         resolve(); // 不抛错,避免重试风暴
  29.       });

  30.       req.on('error', (err) => {
  31.         context.log.error('Ping failed:', err.message);
  32.         resolve(); // 不抛错,避免重试风暴
  33.       });

  34.       // 确保请求被发送
  35.       req.end();
  36.     });

  37.     context.log('Ping operation completed successfully');
  38.   } catch (error) {
  39.     context.log.error('Unexpected error during ping operation:', error.message);
  40.   }

  41.   context.log('TimerTrigger1 function completed');
  42. };
复制代码


备注:
Consumption 计划就是最经典的“无服务器”模式,按调用和执行时间计费。每个订阅有 免费额度(100 万次调用 / 月 + 40 万 GB-s / 月),这种“每 19 分钟 ping 一次”的场景,一个月大概 2,160 次,完全在免费额度里。
Flex Consumption 虽然也按使用计费,但定位是高并发、虚拟网络需求的企业场景,没有单独的“免费额度”优惠,适合更复杂的环境
如果帖子/回帖帮助到你,请给作者评分/点赞
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|排行榜|意见建议|黑名单|数字居民论坛

GMT+8, 2025-9-13 19:44

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表