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/;
                    }

Rails アプリで X-Accel-Redirect が有効になっています。

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を使用しています。たぶん誰かが私の間違いを見ただけかもしれませんが、私は数時間試した後でも見ません。

もう1つ、リクエストはdevelopment.logにも表示されません(はい、開発用にX-Accelも有効にしました)。

よろしく、アレックス

4

1 に答える 1

4

わかった:nginxのロケーションディレクティブでレールルートパーツを使用しないでください。これで、それは動作します:

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 に答える