2012-01-08 2 views
4

Lorsque j'utilise mon application Rails pour servir directement mes ressources via la pile Cedar de Heroku (c'est-à-dire PAS via un CDN), elles sont gzipées automatiquement. (Voir mon previous question sur pourquoi je suis confus à ce sujet)Accepter les en-têtes sur les actifs de Cloudfront à partir de Rails 3.0.x sur Heroku Cedar

Maintenant, j'essaie de configurer Cloudfront pour servir ces actifs à la place, et idéalement, je voudrais qu'ils soient aussi gzip'd. D'après ce que j'ai lu, je pensais que Cloudfront transmettrait les en-têtes Accept à mon application, donc ils devraient être servis gzip s'ils sont supportés (comme ils le sont lorsque vous faites une demande directe à l'actif sur heroku). Mais ce n'est pas le cas. Les en-têtes d'actifs finissent par ressembler à ceci:

Age:510 
Connection:keep-alive 
Content-Length:178045 
Content-Type:text/css 
Date:Sun, 08 Jan 2012 18:55:13 GMT 
Last-Modified:Sun, 08 Jan 2012 18:42:34 GMT 
Server:nginx/0.7.67 
Via:1.1 varnish, 1.0 7a0b4b3db0cc0d369fe1d6981bfb646a.cloudfront.net:11180 (CloudFront), 1.0 6af08f4042ec142b4b760ca4cd62041d.cloudfront.net:11180 (CloudFront) 
X-Amz-Cf-Id:2b205edf4e9ef000a31a0208ca68f4e15b746eb430cde2ba5cc4b7dff4ba41a76c24f43cf498be02,8d5863a42eea452f86831a02f3eb648b26fe07013b08b95950f15ef8ba275822e1eb3b7ed2550d01 
X-Cache:Hit from cloudfront 
X-Varnish:2130919357 

Il n'y a aucune mention de l'encodage ici, et quand je vois le fichier normal, il ne gzip. Je me demande donc ce que je dois faire ici pour demander à Cloudfront de demander une version gzip de l'application à partir de mon application afin qu'elle puisse être utilisée par le client.

This post indique que vous devez manuellement gzip et télécharger le fichier, mais je ne vois pas pourquoi cela devrait être nécessaire. Pour un, c'est embêtant, et deux, ne serait-il pas demander le même fichier que mon navigateur directement? Alors pourquoi ne pas simplement servir le fichier gzip'd comme il le fait par défaut dans mon application?

Tous les conseils pour faire fonctionner gzip'ng correctement seraient super. Je ne voudrais pas devoir gzip manuellement mes dossiers et les télécharger si possible.

Répondre

3

Les fichiers Cedar desservis ne sont PAS compressés par la pile, Cedar ne sert que ce que vous avez dans le code de l'application. Voir la documentation:

Depuis des demandes à des applications Cedar sont directement à l'application serveur - et non via un serveur par proxy HTTP comme nginx - toute compression des réponses doit être fait dans votre application. Pour applications Rack, cela peut être accompli avec le Rack :: Deflater middleware. Pour les ressources statiques gzippées, assurez-vous que Rack :: Deflater est chargé avant ActionDispatch :: Static dans votre pile de middleware.

Par conséquent, le GZipping votre voir est un faux en-tête, ou vient d'ailleurs qui. Par conséquent, si vous avez simplement envoyé des fichiers à Cloudfront, vous voyez juste la même chose. Si vous envisagez de fournir des ressources zippées via CDN, je vous recommande vraiment d'envisager de faire appel à Rails 3.1 et d'utiliser le pipeline Asset. Non seulement cela vous donnera plus de contrôle sur vos actifs, mais aussi vous donner un chemin beaucoup plus facile à serving them over a CDN.

+0

Il s'avère donc que j'avais des enregistrements A pointant vers heroku.com plutôt que CNAME-ing herokuapp.com comme le suggèrent les documents. Dans ce cas, il était en train de filtrer mes demandes à travers Varnish. Et c'était tout gzipping. Je l'ai changé maintenant et je vais utiliser 'Rack :: Deflater' jusqu'à ce que je puisse réellement mettre à niveau vers Rails 3.1 (qui est évidemment mon premier choix, mais pas probablement pour moi ATM) – brad

+0

Super, heureux d'être utile - n'hésitez pas à cocher ma réponse;) –

+0

FYI Je ne pense pas que quelque chose dans cet article que vous avez référé est vraiment nécessaire. Cloudfront saisit mes fichiers en passant l'en-tête Accept-Encoding, puis les met en cache dans son CDN. Je ne vois aucune raison pour laquelle je synchroniserais manuellement mes ressources. La première demande sera lente, mais les demandes subséquentes seront rapides et traitées à partir du CDN. Merci encore pour les conseils. – brad

Questions connexes