2012-01-08 2 views
4

Rails 앱을 사용하여 Heroku의 Cedar 스택 (즉, CDN이 아닌)을 통해 자산을 직접 제공 할 때 gzip으로 자동으로 처리됩니다. (previous question에 대한 이유는 여기에 나와 있습니다.Heroku Cedar에서 Rails 3.0.x의 Cloudfront 서비스 자산에 대한 Accept-Encoding 헤더

이제 이러한 자산을 제공하기 위해 Cloudfront를 설정하려고합니다. 이상적으로는 gzip으로 지정하는 것이 좋습니다. 내가 읽은 것부터 Cloudfront가 내 앱에 Accept 헤더를 전달할 것이라고 생각 했으므로 지원되는 경우 gzip으로 제공되어야합니다 (귀하가 영웅에 대한 자산을 직접 요청할 때와 마찬가지로). 그러나 이것은 사실이 아닙니다. 인코딩에 대한 언급은 여기에 없다

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에서 제공하는 파일은 스택에서 GZIP으로 가져 오지 않으며 Cedar는 응용 프로그램 코드에있는 것만 제공합니다. 참조 documentation :

삼나무 응용 프로그램에 대한 요청이 응용 프로그램 서버에 직접 때문에

- nginx를 같은 HTTP 서버를 통해 프록시되지 - 응답의 압축 응용 프로그램 내에서 수행해야합니다. 랙 응용 프로그램의 경우 랙 : Deflater 미들웨어로 수행 할 수 있습니다. gzip으로 압축 된 정적 자산의 경우, Rack :: Deflater 이 미들웨어 스택에서 ActionDispatch :: Static 앞에로드되었는지 확인하십시오.

따라서 GZipping은 잘못된 헤더이거나 다른 곳에서 오는 것입니다. 따라서 Cloudfront에 파일을 푸시했다면 똑같은 것을 보았을 것입니다.

CDN을 통해 압축 된 에셋을 제공하는 경우 Rails 3.1에 부딪히지 않고 자산 파이프 라인을 사용하는 것이 좋습니다. 뿐만 아니라 이것은 당신에게 당신의 자산에 대한 통제권을 부여 할뿐만 아니라 serving them over a CDN에 대한보다 쉬운 경로를 제공합니다.

+0

문서가 제안한대로 herokuapp.com을 CNAME-ing하는 대신 heroku.com을 가리키는 A 레코드가 있음이 드러났습니다. 이 경우 실제로는 Varnish를 통해 내 요청을 필터링하고있었습니다. 그리고 모든 것을 다 열심히하고있었습니다. 나는 지금 그것을 바 꾸었고 레일스 3.1으로 업그레이드 할 때까지'Rack :: Deflater'를 사용할 것입니다. (분명히 제 첫번째 선택이지만, 아마도 ATM은 아닙니다) – brad

+0

슈퍼, 도움이되기를 기뻐합니다. - 내 대답에 똑같이 대답 해주세요;) –

+0

참고 당신이 언급 한 그 기사에서 아무 것도 정말로 필요하다고 생각하지 않습니다. Cloudfront는 Accept-Encoding 헤더를 통과 한 파일을 가져온 다음 CDN에 캐시합니다. 내 애셋을 수동으로 동기화하는 이유가 표시되지 않습니다. 첫 번째 요청은 예, 느릴 수 있지만 이후 요청은 CDN에서 빠르며 제공됩니다. Thx 다시 팁. – brad