解决valine-admin云引擎唤醒失败

4月就收到了leancloud要限制白嫖用户定时任务的邮件。一直没有太在意。昨天晚上打开leanclou的日志,云引擎已经休眠好几天了。

因流控原因,通过定时任务唤醒体验版实例失败,建议升级至标准版云引擎实例避免休眠

使用云引擎自带定时任务以前都是大佬使用vps定时访问云引擎避免自动休眠,但是我没有vps,也找不到大佬,只能从js下手了。

能唤醒云引擎的方法除了发请求还有就是有人写评论(这条评论不会收到邮件提醒)。唤醒过一次之后,云引擎的定时任务能正常执行。

除了js发请求唤醒,我还看到有使用github action来唤醒的,这种方法挺好的(我之前没想到)推荐大家使用。

使用github action解决流控问题

ajax请求唤醒

思路就是北京时间8点到晚上23点只要有人访问博客就会触发js发ajax请求唤醒云引擎。由于云引擎睡眠的时候发请求不一定会成功(但是有请求就会醒)所有没有做请求失败处理。请求发送后设置cookie避免20分钟内刷新等操作重复发请求。

虽然博客使用了jQuery,但是我选择fetch,兼容性也凑合(不行就算了)。迟早要把jQuery从博客去掉。

只认北京时间,避免半夜其他时区打开而唤醒云引擎。北京时间的api是苏宁的。

cookie中的engine,默认是’0’ ,’1’代表发送过请求。cookie过期时间20分钟,避免刷新等操作重复发请求。

以下代码没有注释是因为写了注释就导致valine初始化失败。不知道原因QAQ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var engine = document.cookie.replace(/(?:(?:^|.*;\s*)engine\s*\=\s*([^;]*).*$)|^.*$/, "$1") || '0';
if(engine!='1') {
fetch('https://quan.suning.com/getSysTime.do')
.then(function(response) {
return response.json();
})
.then(function(date) {
var hours = new Date(date.sysTime2).getHours();
if(hours>7 && hours<23){
fetch('https://你云引擎的地址');
var exp = new Date(date.sysTime2);
exp.setTime(exp.getTime() + 20*60*1000);
document.cookie = "engine=1;path=/;expires="+ exp.toGMTString();
}
})
}

建议把js代码放在valine的初始化代码后面,没必要放body里,记得把云引擎地址改成自己的。valine-admin配置里的ADMIN_URL就是云引擎地址。

valine-admin没有允许跨域请求(确实没必要),但是使用ajax请求唤醒云引擎会导致浏览器控制台报错(能成功唤醒,我不能忍受错误信息)。

顺便改了下valine-admin,valine-admin 这是我改过的版本,我fork的是DesertsP写的valine-admin。还有一个版本是zhaojun的,2个valine-admin好像云引擎的配置信息不一样,请注意区分。

使用zhaojun版本的valine-admin的可以自行修改。(对着我的提交记录改就可以了,那部分文件内容是一样的)。

各种方法的选择

除了上面提到的使用github action,还有各种监控都能用来唤醒云引擎。

我现在使用的是github action这种。

ajax请求唤醒适合佛系一点的人,访客多就把时间设置在早上8-9点,后面的时间由云引擎的定时任务唤醒。访客少就建议把云引擎的定时任务关了。博客没什么人访问,那么云引擎可能一天都不会醒几次。像我这种贪心的人,即使博客没人访问也想要云引擎醒着。

github action的定时任务每次执行都会提交一次。为了方便查看云引擎状况同时不想看见那么多commit。我把action定时任务的cron表达式改成了50 23 * * *,每天早上7点50执行一次,之后由云引擎自己唤醒。