我有一个Rails应用程序,用户可以在其中管理大型文件(当前最大为15 GB)。他们还可以下载存储的文件。
一切都非常适合<510 MB的文件。但是对于> 510 MB,下载将在522,256 KB(510 MB)之后停止。
我认为thin
会产生此问题。使用Thin启动我的开发服务器时,无法下载完整的文件。当我使用webrick启动开发服务器时,一切正常。
我曾经top
比较RAM / CPU的行为,但是瘦服务器和webrick服务器的行为相同。在开发中,两个服务器都将完整的文件读入RAM,然后将其发送给用户/客户端。
我试图更改某些选项,send_file
例如stream
或buffer_size
。我也length
手动设置。但是同样,我无法使用Thin来下载完整的文件。
我可以使用Firefox,Chrome和curl重现此行为。
问题是我的生产性Rails应用程序在nginx代理后面使用了4台瘦服务器。目前,我不能使用独角兽或乘客。
在发展中,我使用thin 1.6.3
,rails 4.1.8
,ruby 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] 删除。
我来说两句