背景

最近经常收到一些类似的咨询:

浏览器请求到了 eggjs 的 controller 的 function,要处理大量的 HTML 文件,需要耗时很长,导致自动返回 500 给浏览器

思路

原因很简单,Egg 并没有做什么特殊处理,Node 默认的超时时间是 2 分钟,参见 Node 文档:server.timeout

首先,要分析下代码逻辑,是否有不合理的地方(如 readFileSync 等同步操作),可以通过 Alinode 看看。

其次,如果业务逻辑真的耗时这么久,那就要审视下需求是否合理。

一般来说,不可能让用户等待超过 2 分钟,这类的需求,建议是做成异步任务,然后定时查询或消息通知的方式。

最后,才是考虑调整超时配置:

  1. // {app_root}/app.js
  2. module.exports = app => {
  3. app.messenger.on('egg-ready', () => {
  4. app.server.setTimeout(2 * 60 * 1000);
  5. });
  6. };

另外,还需要注意修改前面的 nginx 的配置。

  1. location / {
  2. proxy_connect_timeout 120s;
  3. proxy_read_timeout 120s;
  4. proxy_send_timeout 120s;
  5. }