[eggjs/egg]egg 如此设置 keepAliveTimeout 超时时间不不起作用?

2024-08-05 305 views
7

情况是这样的,我在阿里云函数计算中部署egg的项目; 但是当我访问项目接口的过程中经常会遇到502 bad gateway的错误信息,提交工单提示我: ` 如果是custom runtime 出现这种情况, 最有可能是因为实现的 custom runtime 的 http server 没有文档中的第3个条件: connection 最好设置为 keep alive,请求超时时间至少设置在 15 分钟以上

比如 nodejs express:

var server = app.listen(PORT, HOST); server.timeout = 0; // never timeout server.keepAliveTimeout = 0; // keepalive, never timeout `

我设置的代码 ` config.httpclient = { request: { contentType: 'json', dataType: 'json', timeout: 900000, }, httpAgent: { freeSocketTimeout: 900000, }, httpsAgent: { freeSocketTimeout: 900000, }, }

config.serverTimeout = 900000 ` 结果问题依然存在,没有解决,求问,我设置的有问题吗?

回答

5

同问。我是POST请求后,大概一分钟再请求就报错了。云函数用 egg/midway, 都会出现这个问题。

8

@jishutuan 你也是阿里云的云函数吗?我也是post请求,而且现在只有在其中一个post请求中多次发现了这个情况。

6

@jishutuan 你也是阿里云的云函数吗?我也是post请求,而且现在只有在其中一个post请求中多次发现了这个情况。

嗯,是用的阿里云函数。不只egg, 我也尝试了midway 直接用koa做上层框架。同样时不时502报错。

https://github.com/eggjs/egg/issues/4411 这个issue和我们是一个问题。

我在调试,判断 timeout 和 keepAliveTimeout 设置确实能解决这个问题。

我直接修改了@midwayjs/koa的源码,在服务启动时设置了timeout 和 keepAliveTimeout。上传了近10分钟,没出现错误,还在观察。

image

但我还不知道egg如何设置 timeout 和 keepAliveTimeout。

1

你 config 的 HttpClient 设置肯定是不对的。

HttpClient 是发送HTTP请求的。而 timeout 和 keepAliveTimeout是要设置到egg启动的http server上。

7

没有办法了,采用排除法

4

config.clusterClient = { maxWaitTime: 60000, responseTimeout: 60000, }; @jishutuan 这个你试过了吗

7

我找到一个解决办法,你尝试下。

APP的生命周期函数中提供了serverDidReady方法。此时可以从 app.server 拿到 server 的实例。文档:https://eggjs.org/zh-cn/basics/app-start.html

拿到 server 实例我们就可以设置 timeout 和 keepAliveTimeout。

根目录增加app.js文件,代码:

class AppBootHook {
    constructor(app) {
        this.app = app;
    }
    async serverDidReady() {
        // http / https server 已启动,开始接受外部请求
        // 此时可以从 app.server 拿到 server 的实例
        this.app.server.timeout = 0;
        this.app.server.keepAliveTimeout = 0;
    }
}

module.exports = AppBootHook;
1

怎么样?好用吗?晚上回去我也试试

8

怎么样?好用吗?晚上回去我也试试

我测试没问题。不报错了

3

@aopstudio serverTimeout这个属性我看到啦,只是没找到keepAliveTimeout的属性,问题基本上已经解决了,采用的生命周期中获取server的方式。