Ric*_*aca 11 mongrel ruby-on-rails x-sendfile nginx
假设我有一个由nginx提供的Rails 2.3.2应用程序,并由mongrel提供服务,其中我需要通过Rails提供大型静态文件(以控制对它的访问).我希望Rails应用程序将文件传输委托给nginx,以避免阻止mongrel实例.
可用的信息似乎是矛盾和不完整的.这篇文章展示了如何用Apache做到这一点,并暗示它也可以用ngninx完成 - 但没有例子.这篇文章和这篇文章展示了如何使用一个显然Rails 2.3使得不必要的插件来实现它.这篇文章表明可能毕竟不支持带有nginx的x-sendfile.
对于Rails现在可以自行完成的事情,我宁愿不要使用插件.
有没有人使用没有插件和Rails 2.3/nginx/mongrel的x-sendfile式行为?如果没有,那么使用插件(和/或monkeypatch)和Rails 2.3/nginx/mongrel的最佳文档是什么?
Ric*_*aca 24
主要思想:你所有的控制器都是设置nginx x-accel-redirect头.一旦你的控制器方法返回(这将非常快),nginx将查看你的Rails应用程序设置的标头.如果设置了x-accel-redirect,则nginx将提供静态文件.
你的控制器看起来像:
def show
@attachment = Attachment.find(params[:id])
# Do anything else you need for authentication, etc.
head(:x_accel_redirect => '/files/' + @attachment.filename,
:content_type => @attachment.content_type,
:content_disposition => "attachment; filename=\"#{@attachment.filename}\"")
end
Run Code Online (Sandbox Code Playgroud)
仅凭这一点就不行了.您还需要告诉nginx有关位于$ RAILS_ROOT/files的文件.将其添加到服务器块内nginx配置的末尾:
location /files {
root /path/to/rails_app;
internal;
}
Run Code Online (Sandbox Code Playgroud)
将静态文件放入$ RAILS_ROOT/files中它应该可以工作.不需要插件或monkeypatching使用Rails 2.3.2和2.3.14测试.