AWS ElasticBeanstalk NodeJS - 502 错误:从上游读取响应标头时,recv() 失败(104:连接重置)

Mut*_*ani 4 nginx node.js amazon-elastic-beanstalk

我们计划将我们的 NodeJS 平台从普通的 EC2 迁移到 ElasticBeanstalk。在这些过程中,经过一些努力,我们已经部署了我们的应用程序并且能够访问和执行操作。但是,对于某些请求,我们收到了 502 错误

检查日志后,我们发现了以下内容;


/var/log/nginx/error.log

2020/03/16 06:12:09 [error] 3009#0: *119488 recv() failed (104: Connection reset by peer) 从上游读取响应头,客户端:xxx.xx.xx.xxx,服务器: ,请求:“POST /www_auth/register HTTP/1.1”,上游:“ http://127.0.0.1:8081/register ”,主机:“****.us-east-2.elasticbeanstalk.com”

它随机发生,我没有任何线索。我觉得我错过/需要使用 nginx 添加一些配置级别的更改。

如果您有任何解决此问题的步骤/建议,请感谢!

Ela*_*ava 5

AWS Elastic Load Balancer 预连接到后端服务器,它可能导致 ELB 认为连接打开的竞争条件,但 Node.js 后端已经关闭它,因为server.keepAliveTimeout空闲不活动 5 秒, Node.js8.x和更新版本中的默认值。

禁用server.keepAliveTimeoutserver.headersTimeout解决此问题,或将这些超时设置为ms大于 AWS ELB 的空闲超时值的值。

const app = express();

// Set up the app...
const server = app.listen(8080);

// Disable both timeouts
server.keepAliveTimeout = 0;
server.headersTimeout = 0;
Run Code Online (Sandbox Code Playgroud)

此解决方案归功于 Shuhei Kagawa:

https://shuheikagawa.com/blog/2019/04/25/keep-alive-timeout/