我们计划将NodeJS平台从纯EC2迁移到ElasticBeanstalk。在这些过程中,经过一些努力,我们已经部署了应用程序并能够访问和执行操作。但是,对于某些请求,我们接收到502错误。
检查日志后,我们发现以下内容;
2020/03/16 06:12:09 [错误] 3009#0:* 119488 recv()失败(104:对等方重置连接),同时从上游读取响应标头,客户端:xxx.xx.xx.xxx,服务器:,请求:“ POST / www_auth / register HTTP / 1.1”,上游:“ http://127.0.0.1:8081/register”,主机:“ ****。us-east-2.elasticbeanstalk.com”
它是随机发生的,我没有任何线索。我觉得我想/需要使用Nginx添加一些配置级别的更改。
如果您有任何步骤/建议来解决此问题,请感激!
AWS Elastic Load Balancer预先连接到后端服务器,它可能导致竞争状态,ELB认为连接已打开,但是由于闲置5秒的server.keepAliveTimeout,Node.js后端已经关闭了该连接不活动,Node.js 8.x
及更高版本中的默认值。
禁用server.keepAliveTimeout
和server.headersTimeout
来解决此问题,或将这些超时设置为大于AWS ELB的“空闲超时”值的ms
值。
const app = express();
// Set up the app...
const server = app.listen(8080);
// Disable both timeouts
server.keepAliveTimeout = 0;
server.headersTimeout = 0;
此解决方案的信用归香川修平:
https://shuheikagawa.com/blog/2019/04/25/keep-alive-timeout/