背景
最近经常收到一些类似的咨询:
浏览器请求到了 eggjs 的 controller 的 function,要处理大量的 HTML 文件,需要耗时很长,导致自动返回 500 给浏览器
思路
原因很简单,Egg 并没有做什么特殊处理,Node 默认的超时时间是 2 分钟,参见 Node 文档:server.timeout 。
首先,要分析下代码逻辑,是否有不合理的地方(如 readFileSync
等同步操作),可以通过 Alinode 看看。
其次,如果业务逻辑真的耗时这么久,那就要审视下需求是否合理。
一般来说,不可能让用户等待超过 2 分钟,这类的需求,建议是做成异步任务,然后定时查询或消息通知的方式。
最后,才是考虑调整超时配置:
// {app_root}/app.js
module.exports = app => {
app.messenger.on('egg-ready', () => {
app.server.setTimeout(2 * 60 * 1000);
});
};
另外,还需要注意修改前面的 nginx 的配置。
location / {
proxy_connect_timeout 120s;
proxy_read_timeout 120s;
proxy_send_timeout 120s;
}