Nginx et gzip pour les assets rails

Bonjour, je suis en train de tester le déploiement d’une application
rails avec nginx et mongrel_cluster.
Tout se passe plutôt bien jusqu’ici mais lorsque je teste mon
application, je vois que mes fichiers recupérés depuis le répertoire
public, soit les css et js, ne sont pas compréssés avec gzip, et n’ont
pas non plus de header Content-type d’après firebug (les deux
problèmes étant liés je pense).

J’imagine que le problème vient des urls vers ces fichiers qui sont de
la forme /stylesheets/public.css?1195206138 ce qui pousserait nginx à
ne pas chercher de mime-type ?

Voila la configuration de mon vhost :
{
listen 80;

server_name www.domaine.com;

client_max_body_size 50M;

if (-f $document_root/maintenance.html)
{
rewrite ^(.*)$ /maintenance.html last;
break;
}

location /
{
root /home/work/domaine/current/public;

proxy_set_header  X-Real-IP  $remote_addr;

proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect false;

if (-f $request_filename/index.html)
{
  rewrite (.*) $1/index.html break;
}

if (-f $request_filename.html)
{
  rewrite (.*) $1.html break;
}

if (!-f $request_filename)
{
  proxy_pass http://upstream;
  break;
}

}
}

(le bloc upstream est bien configuré avec 4 mongrels)

La configuration pour gzip dans le nginx.conf :
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_proxied any;
gzip_types text/plain text/html text/css text/js application/x-
javascript;

Un mime.types est aussi présent, c’est celui par défaut.

J’imagine que je pourrais contourner le problème en ajoutant des blocs
if qui testeraient l’extension du fichier et forcerait le mime-type en
conséquence mais il y a sûrement une solution plus propre ?

Merci d’avance !

Hi,

url like : /stylesheets/public.css?1195206138 are tricked by rails in
development mode only for preventing caching. (style, images, js)

in production mode url are standard. /stylesheets/public.css

If you test the deployment I hope you will try with production mode,
if not NGIX and Mongrell_cluster are not usefull…

Bonjour, (je vais parler en francais :wink: )

Je pense que mes mongrels sont bien lancés en mode production : ma
variable environment de config/mongrel_cluster est définie à
production, et les processus mongrel affichés par un ps aux sont de
cette forme :
work 15361 0.0 6.1 40084 31184 ? S 10:40 0:02 /usr/
local/bin/ruby /usr/local/bin/mongrel_rails start -d -e production -a
127.0.0.1 -c /home/work/domain/current --user work --group work -p
8000 -P log/mongrel.8000.pid -l log/mongrel.8000.log

D’ailleurs rails utilise bien la base de donnée de production.

J’ai peut-être oublié un paramètre quelque part ?

PS: I didn’t understand why you replied in english, so please tell me
if you want to communicate this way :slight_smile:

On 16 nov, 15:24, “Mathieu C.”

On Nov 16, 2007 2:04 PM, [email protected] [email protected]
wrote:

la forme /stylesheets/public.css?1195206138 ce qui pousserait nginx à
ne pas chercher de mime-type ?
{
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite (.*) $1.html break;
}

if (!-f $request_filename)
{
  proxy_pass http://upstream;
  break;
}

}
}

Personnelement j’ai en gros la même configuration que toi à part :

  • gzip_proxies je l’ai laissé par défaut
  • je ne fais de test de request_filename que dans mon location / {}
  • Je fais un test d’existence avant le proxy pass et break si je suis
    rentré dedans.

Et moi tout fonctionne. J’ai bien la compression gzip et le bon
type-mime. Pour exemple mon blog tournant sous Typo derrière un
serveur nginx 0.6.16


Cyril M.

Skateinmars :

Bonjour, (je vais parler en francais :wink: )

[…]

D’ailleurs rails utilise bien la base de donnée de production.

J’ai peut-être oublié un paramètre quelque part ?

Je sais pas, tu peux consulter ce thread de Rails-Deploy :
http://groups.google.com/group/rubyonrails-deployment/browse_thread/thread/8c9728993ab92062

Tu peux essayer de désactiver l’asset timestamping pour voir
ce que ça donne (mettre une chaîne vide à la variable d’environnement
RAILS_ASSET_ID)

Enfin, dernier point, l’asset timestamping est activé en mode
production.

Je prends un site au hasard : http://www.happycodr.com
et regarder le début du source.

PS: I didn’t understand why you replied in english, so please tell me
if you want to communicate this way :slight_smile:

Peut-être que Mathieu faisait référence à ton pseudo anglais.

En même temps, s’il a répondu à ton message, c’est qu’il comprend
le français et à Belfort, on comprend le français :slight_smile:

– Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

Merci de vos réponses.

Mea culpa, en fait les mimes-types et la compression gzip fonctionnait
bien, j’avais simplement un bug de firebug qui ne m’affichait pas les
fichiers récupérés la première fois mais seulement après un refresh,
et forcement lors du refresh il m’affichait les fichiers en cache
local sans headers :-/ J’ai vérifié avec telent et tout fonctionne
bien avec cette conf donc en fait.

Merci toutefois pour l’astuce RAILS_ASSET_ID, j’ai un peu de mal à
voir l’utilité de cette fonction puisque nginx (et tout bon serveur
web) doit renvoyer des headers Last-Modified corrects qui servent à
cela.

@Cyril : merci pour tes détails. Concernant gzip_proxied il semblerait
après test que même avec une valeur par défaut les pages html
renvoyées par rails soient gzippées.
Je viens de voir dans la doc que seules les requêtes qui utilisent un
header Via sont concernées par cette option, assez inutile ici donc.