Passenger 3.0.17 + Nginx 1.2.4 +“Content-Length”Header = 502 Bad Gateway

时间:2013-01-21 14:48:59

标签: nginx http-headers ruby-on-rails-3.2 passenger

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

我在控制器中有一个动作,它使用send_data方法发送变量中包含的原始JPEG数据。之前,我遇到一些问题,有些浏览器没有下载正在发送的整个图像,发现没有发送Content-Length标头,所以我决定使用包含JPEG数据的变量的.bytesize属性作为内容-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标题,但同时,我想我可能会出于好奇而发布这个,看是否有人有任何想法。

1 个答案:

答案 0 :(得分:1)

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

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

所以,似乎可以在Nginx / Passenger上发送Content-Length标头,但是如果没有明确的字符串,则乘客会窒息。