我刚刚遇到了一个问题,即在Rails 3.2.2应用程序中设置response.headers['Content-Length']
会导致Nginx抛出"502 Bad Gateway"错误。
我在控制器中有一个操作,该操作使用 send_data
方法来发送变量中包含的原始 JPEG 数据。 以前,我遇到了一些浏览器没有下载正在发送的整个图像的问题,并发现没有发送Content-Length标头,因此我决定使用包含JPEG数据的变量的.bytesize
属性作为Content-Length。
这在开发中工作正常(使用独角兽),现在有一个内容长度标头,以前没有,但在我使用 Nginx 和 Passenger 的生产中,我得到了上述 502 Bad Gateway。 另外,在Nginx错误日志中,我看到:
[error] 30574#0: *1686 upstream prematurely closed connection while reading response header from upstream
Rails 生产日志中没有匹配的条目,这告诉我应用程序很好。
我已经注释掉了设置内容长度标题的行,问题消失了。 我仍在测试我是否真的需要发送内容长度标头,但与此同时,我想我可能会出于好奇发布这个,看看是否有人有任何想法。
啊哈! 我必须通过添加 .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
标头,但如果它不是明确的字符串,乘客就会阻塞。