1

我刚刚遇到一个问题,response.headers['Content-Length']在 Rails 3.2.2 应用程序中设置会导致 Nginx 抛出“502 Bad Gateway”错误。

我在控制器中有一个动作,它使用该send_data方法发送包含在变量中的原始 JPEG 数据。之前,我遇到了一些浏览器没有下载正在发送的整个图像的问题,并且发现没有发送 Content-Length 标头,因此我决定使用.bytesize包含 JPEG 数据的变量的属性作为 Content-Length。

这在开发中运行良好(使用 Unicorn),现在有一个 Content-Length 标头,以前没有,但是在我使用 Nginx 和Passenger 的生产中,我得到了前面提到的 502 Bad Gateway。此外,在 Nginx 错误日志中,我看到:

[error] 30574#0: *1686 upstream prematurely closed connection while reading response header from upstream

Rails 生产日志中没有匹配的条目,这告诉我应用程序很好。

我已经注释掉了我设置 Content-Length 标头的行,问题就消失了。我仍在测试我是否真的需要发送 Content-Length 标头,但与此同时,我想我可能会出于好奇而发布此消息,看看是否有人有任何想法。

4

1 回答 1

1

啊哈!我必须通过添加.to_s方法将大小转换为字符串。所以,我的最终结果是

response.headers['Content-Length'] = photo_data.bytesize.to_s
send_data photo_data, :type => :jpg, :filename => 'file_name.jpg', :disposition => 'attachment'

因此,似乎可以Content-Length在 Nginx/Passenger 上发送标头,但如果不是明确的字符串,Passenger 就会窒息。

于 2013-02-13T17:10:49.153 回答