Rails + Thin:无法下载大文件

比约恩森

我有一个Rails应用程序,用户可以在其中管理大型文件(当前最大为15 GB)。他们还可以下载存储的文件。

一切都非常适合<510 MB的文件。但是对于> 510 MB,下载将在522,256 KB(510 MB)之后停止。

我认为thin会产生此问题。使用Thin启动我的开发服务器时,无法下载完整的文件。当我使用webrick启动开发服务器时,一切正常。

我曾经top比较RAM / CPU的行为,但是瘦服务器和webrick服务器的行为相同。在开发中,两个服务器都将完整的文件读入RAM,然后将其发送给用户/客户端。

我试图更改某些选项,send_file例如streambuffer_size我也length手动设置但是同样,我无法使用Thin来下载完整的文件。

我可以使用Firefox,Chrome和curl重现此行为。

问题是我的生产性Rails应用程序在nginx代理后面使用了4台瘦服务器。目前,我不能使用独角兽或乘客。

在发展中,我使用thin 1.6.3rails 4.1.8ruby 2.1.2

def下载
  file_path ='/tmp/big_file.tar.gz'#5 GB
  send_file(文件路径,缓冲区大小:4096,流:true)
结尾
伊哈兹特编码

如果使用send_file,则理想的情况是使用前端代理来承担提供文件的责任。您说您正在生产中使用nginx,因此:

production.rb文件中,取消注释config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'

您还必须更改nginx配置以适应Rack::Sendfile其文档位于此处更改总计为:

proxy_set_header X-Sendfile-Type X-Accel-Redirect;
proxy_set_header X-Accel-Mapping /=/files/; # or something similar that doesn't interfere with your routes

到现有的位置块,并添加一个额外的location块来处理X-Accel-Mapping您添加的位置块该新位置块可能看起来像:

location ~ /files(.*) {
  internal;             
  alias $1;             
}   

当您通过SSH进入生产服务器和curl -I瘦服务器(不是nginx)并看到X-Accel-Redirect标头时,您将知道它工作正常curl(无-I)直接连接到thin服务器应该发送文件内容。

您可以在此处查看我最近与nginx和send_file进行的斗争

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章