11

Rails 2.3.2 アプリケーションが nginx によってフロントされ、mongrel によって提供され、Rails を介して (アクセスを制御するために) 大きな静的ファイルを提供する必要があるとします。雑種インスタンスのブロックを回避するために、Rails アプリでファイルの転送を nginx に委任する必要があります。

入手可能な情報は矛盾していて不完全なようです。この投稿では、Apache で実行する方法を示し、ngninx でも実行できることを示唆していますが、例はありません。この投稿この投稿は、明らかにRails 2.3が不要にするプラグインを使用してそれを行う方法を示しています。この投稿は、結局のところ、nginx で x-sendfile がサポートされていない可能性があることを示唆しています。

Rails だけでできるようになったことにプラグインをいじり回したくはありません。

プラグインと Rails 2.3/nginx/mongrel を使用せずに x-sendfile のような動作をするようになった人はいますか? そうでない場合、プラグイン (および/または monkeypatch) と Rails 2.3/nginx/mongrel で動作させるための最良のドキュメントは何ですか?

4

1 に答える 1

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  

これだけではうまくいきません。また、$RAILS_ROOT/files にあるファイルについて nginx に伝える必要があります。これをサーバー ブロック内の nginx 構成の最後に追加します。

location /files {
  root /path/to/rails_app;  
  internal;  
}

静的ファイルを $RAILS_ROOT/files に配置すると、機能するはずです。プラグインやモンキーパッチは不要 Rails 2.3.2 および 2.3.14 でテスト済み。

于 2009-06-05T15:16:00.133 に答える