2

我对 X-Sendfile、NGinx 和 Rails 的问题感到沮丧。我已经阅读了几个文档和教程,但我只是不明白这一点。

无论我尝试什么,我都会得到 404。这是 NGINX 的 X-Sendfile 部分。

 location / {
                    proxy_set_header X-Sendfile-Type X-Accel-Redirect;
                    proxy_set_header X-Accel-Mapping /var/www/cube_storage/uploads/=/cdn;  #maps a real path to the internal location
                    ...
            } # end of location app

            location /cdn {
                    root /var/www/cube_storage/;
                    internal;
                    proxy_set_header X-Sendfile-Type X-Accel-Redirect;
                    proxy_set_header X-Accel-Mapping /var/www/cube_storage/=/cdn/;
                    }

X-Accel-Redirect 在我的 rails 应用程序中启用:

config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx

这是负责提供文件的控制器的代码:

def image
@activity = AccountActivity.where(:id => params[:id]).first

if !@activity || !@activity.file_attachment_is_image? || @activity.file_attachment_name != requested_file_name()
  l = Logger.new("#{Rails.root}/logs/cdn_activity.log")
  l.info(params.inspect)

  render :file => "#{Rails.root}/public/404.html", :layout => false, :status => :not_found
else
  begin
    if !params[:version] || params[:version] == "original"
      t = @activity.file_attachment # thats the original image!
    else
      t = @activity.file_attachment.send(params[:version])
    end

    send_file t.current_path  ,:disposition => 'inline'
  rescue Exception => ex
    l = Logger.new("#{Rails.root}/logs/cdn_activity.log")
    l.info("--------------------------")
    l.info(Time.now.to_s)
    l.info("exception -> #{ex.message}")
    l.info("params: #{params.inspect}")
    render :file => "#{Rails.root}/public/404", :layout => false, :status => :not_found
  end

end

结尾

我使用carrierwave作为存储引擎。也许有人只是看到我的错误,但即使经过几个小时的尝试,我也没有。

还有一件事,该请求甚至没有出现在 development.log 中(是的,我也为 dev 激活了 X-Accel)。

问候,亚历克斯

4

1 回答 1

4

明白了:永远不要在 nginx 的 location 指令中使用任何 rails route 部分。有了这个,它可以工作:

location / {
  proxy_set_header X-Sendfile-Type X-Accel-Redirect;
  # Maps a real path to the internal location
  proxy_set_header X-Accel-Mapping /var/www/cube_storage/uploads/=/downloads;  

} # end of location app

location /downloads {
  alias /var/www/cube_storage/uploads/;
  internal;
}
于 2013-09-11T20:30:20.357 回答