我刚遇到一个问题,即在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标题,但同时,我想我可能会出于好奇而发布这个,看是否有人有任何想法。
答案 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
标头,但是如果没有明确的字符串,则乘客会窒息。