我有一个Rails应用程序,它将数据上传到Node.js端点。端点适用于较小的数据集,但在某个大小开始时会一直超时504错误。出现504错误后,Nodejs日志显示端点被点击,几分钟后我看到从上传数据创建的图像出现在S3中。我知道这听起来像是我应该只是从Rails应用程序上传到S3的数据,但是让我们只考虑一下这是不行的。
查看Node.js应用程序的Nginx访问日志,我看到端点返回了499。
499表示客户端基于此关闭了连接 https://httpstatuses.com/499
此人有类似的问题:NginX issues HTTP 499 error after 60 seconds despite config. (PHP and AWS)
但是,我已经实现了他们的解决方案(增加了AWS上相关ELB的空闲超时)。尽管这里(How to figure out Nginx status code 499)确认ELB可能是“客户端”关闭与Node.js应用程序的连接,但没有骰子。
ELB日志显示504错误,其中包含以下值
request_processing_time = -1
backend_processing_time = -1
response_processing_time = -1
elb_status_code = 504
backend_status_code = 0
received_bytes = 2167746
sent_bytes = 0
我不是100%确定如何解释这一点,因为它收到所有字节并将它们发送到Node.js服务器(否则我的图像永远不会被创建)。我只是假设sent_bytes是指作为对请求的响应而发送的字节。在这种情况下,0超时非常有意义。
这篇文章概述了一些可能的解释https://hardwarehacks.org/blogs/devops/2015/12/29/1451416941200.html
基于这篇文章,我看到的日志行似乎表明,“应用程序根本没有响应ELB,而是在请求数据时关闭它的连接。这是一个快速超时 - 504将通常在几毫秒内返回,远低于ELB的超时设置。“
这听起来不正确,因为超时大约需要2分钟。 由于这是默认的nodejs超时,我想也许我没有有效地延长它,但是为了调试目的(10分钟)我已经确认正确设置为
time telnet localhost 3500
我使用Puma作为我的Rails服务器,Puma不包含请求超时机制;即使这样,也没有记录错误。我想也许是Httparty超时,但是我不会得到504的响应,而是会给我一个Net Timeout错误。
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:3500;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection '';
proxy_set_header Host $host;
client_max_body_size 20m;
client_body_timeout 600s;
keepalive_timeout 600s;
send_timeout 600s;
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
}
}
这不是我的专业领域,我没有想法。我喜欢关于如何使这些大型数据文件成功通过而没有超时的方向,想法,澄清等。希望我忽略了一些非常明显的东西。