2012-01-08 25 views
4

當我使用Rails應用程序通過Heroku的Cedar堆棧直接服務我的資產時(即不通過CDN),他們會自動獲取gzip。 (關於爲什麼我對此感到困惑,請參閱我的previous question在Heroku上使用Rails 3.0.x上的Cloudfront服務資產接受編碼標題Cedar

現在,我試圖設置Cloudfront來代替服務這些資產,並且理想情況下,我希望他們也可以使用gzip。從我讀過的內容中,我認爲Cloudfront會將Accept標題傳遞給我的應用程序,因此如果支持它們,應該將它們提供gzip'd(就像您在heroku上直接請求資產時一樣)。但事實並非如此。資產端頭這樣看:

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 

這裏有沒有編碼的提到,當我查看純文本文件,它不是gzip壓縮。所以我想知道我需要在這裏做些什麼來讓Cloudfront從我的應用程序請求一個gzip版本的資產,以便它可以將此服務提供給客戶端。

This post說你需要手動gzip和上傳文件,但我不明白爲什麼應該是必要的。首先,它很煩人,還有兩個,它不會直接請求文件與我的瀏覽器相同嗎?那麼爲什麼它不會像我的應用程序默認那樣提供gzip文件呢?

讓gzip'ng正常工作的任何提示都會很棒。我想不必手動gzip我的文件並在可能的情況下上傳它們。

回答

3

Cedar提供的文件不會被堆棧壓縮,Cedar只能提供應用程序代碼中的任何內容。見documentation

由於雪松的應用程序請求直接嚮應用服務器 - 通過HTTP服務器像nginx的不代理 - 任何 壓縮的反應,必須在應用程序中進行。對於 Rack應用程序,可以使用Rack :: Deflater 中間件完成。對於gzipped靜態資產,請確保Rack :: Deflater 在中間件堆棧中的ActionDispatch :: Static之前加載。

因此,GZip你看到的是一個虛假的標題,或從其他地方來。因此,如果您剛剛將文件推送到Cloudfront,那麼您只會看到相同的內容。

如果你正在尋找通過CDN服務壓縮資產,我真的會建議看看碰撞Rails 3.1和使用資產管道。這不僅可以讓您更好地控制資產,還可以讓您更輕鬆地前往serving them over a CDN

+0

因此事實證明,我有A記錄指向heroku.com,而不是CNAME-ing herokuapp.com的文檔建議。在這種情況下,它實際上是通過Varnish過濾我的請求。它正在克服一切。我已經改變了它,現在我要使用'Rack :: Deflater'直到我實際升級到Rails 3.1(這顯然是我的第一選擇,但不可能是我的ATM) – brad 2012-01-09 15:46:54

+0

超級,很高興能夠幫助 - 隨時打勾我的答案;) – 2012-01-09 16:14:01

+0

僅供參考我不認爲你引用的那篇文章中的任何內容都是非常必要的。 Cloudfront抓取通過Accept-Encoding標頭的文件,然後將它們緩存在CDN中。我看不出有什麼理由要手動同步我的資產。第一個請求會很慢,但隨後的請求將會很快並由CDN提供。 Thx再次提示。 – brad 2012-01-09 17:40:22

相關問題