Nginx反向代理代码499大型发布数据时

时间:2017-02-09 10:26:12

标签: ruby-on-rails node.js nginx timeout amazon-elb

我有一个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错误。

我的nginx配置基于https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu-14-04

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;
    }
}

这不是我的专业领域,我没有想法。我喜欢关于如何使这些大型数据文件成功通过而没有超时的方向,想法,澄清等。希望我忽略了一些非常明显的东西。

0 个答案:

没有答案