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

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

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

这在开发(使用Unicorn)中工作正常,现在有一个内容长度标题,以前没有一个标题,但是在使用Nginx和Passenger的生产环境中,我得到了上述502 Bad Gateway。 另外,在Nginx错误日志中,我看到:

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

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

我已经注释了我设置Content-Length标题的那一行,问题就消失了。 我仍在testing是否真的需要发送一个Content-Length头,但同时,我想我可能会出于好奇,看看有没有人有任何想法。

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标题是可以的,但如果不是明确的字符串,Passenger chokes。