2009-06-05 8 views
11

Disons que j'ai une application Rails 2.3.2 dirigée par nginx et servie par mongrel dans laquelle j'ai besoin de servir un gros fichier statique via Rails (pour en contrôler l'accès)). Je veux que l'application Rails délègue le transfert du fichier à nginx, pour éviter de bloquer l'instance de mongrel.Servir des fichiers volumineux via Nginx via Rails 2.3 Utiliser x-sendfile

Les informations disponibles semblent contradictoires et incomplètes. This post montre comment le faire avec Apache, et laisse entendre qu'il peut également être fait avec ngninx - mais pas d'exemples. This post et this post montrent comment le faire en utilisant un plugin qui apparemment Rails 2.3 ne le rend pas nécessaire. This post suggère que peut-être il n'y a pas de support pour x-sendfile avec nginx après tout.

Je préfère ne pas me tromper avec les plugins pour les choses que Rails peut maintenant faire par lui-même.

Quelqu'un a-t-il obtenu un comportement de type x-sendfile pour fonctionner sans plugins ni Rails 2.3/nginx/mongrel? Si non, quelle est la meilleure documentation pour le faire fonctionner avec un plugin (et/ou monkeypatch) et Rails 2.3/nginx/mongrel?

Répondre

24

L'idée principale: tout ce que votre contrôleur fait est de définir l'en-tête nginx x-accel-redirect. Une fois que votre méthode de contrôleur sera de retour (ce qui sera très rapide), nginx regardera l'en-tête de votre application Rails. Si x-accel-redirect est défini, nginx sert le fichier statique.

Votre contrôleur ressemblera à quelque chose comme:

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 

Ce seul ne fera pas l'affaire. Vous devez également indiquer à nginx les fichiers situés dans $ RAILS_ROOT/files. Ajoutez ceci à la fin de votre config nginx dans le bloc serveur:

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

Mettre le fichier statique dans RAILS_ROOT $/fichiers et il devrait fonctionner. Pas besoin de plugins ou monkeypatching Testé avec Rails 2.3.2 et 2.3.14.

+2

Vous êtes un champion parmi les hommes, merci pour cela. – hornairs

+1

Neat! Simple et direct au but! –

+0

Référence Nginx sur X-accel: http://wiki.nginx.org/X-accel –

Questions connexes