왜 니스로 정적 파일을 캐시해야합니까?


9

nginx / php-fpm / varnish / wordpress 및 amazon s3을 실행하는 시스템이 있습니다.

이제 시스템을 설정하는 동안 많은 구성 파일을 살펴 보았고 모든 구성 파일에서 다음과 같은 것을 발견했습니다.

    /* If the request is for pictures, javascript, css, etc */
    if (req.url ~ "\.(jpg|jpeg|png|gif|css|js)$") {
        /* Remove the cookie and make the request static */
        unset req.http.cookie;
        return (lookup);
    }

왜 이런 일이 일어나는지 이해가되지 않습니다. 대부분의 예제는 NginX를 웹 서버로 실행합니다. 이제 문제는 니스 캐시를 사용하여 이러한 정적 파일을 캐시하는 이유입니다.

php-fpm / mysql이 그다지 치지 않도록 동적 파일 만 캐시하는 것이 훨씬 더 합리적입니다.

여기에 문제가 있습니까?

최신 정보

주어진 답변을 기반으로 질문에 정보를 추가하고 싶습니다.

내용이 실제로 많이 바뀌는 동적 웹 사이트가있는 경우, 차칭이 의미가 없습니다. 그러나 정적 웹 사이트에 WordPress를 사용하면 장기간 캐시 할 수 있습니다.

즉, 나에게 더 중요한 것은 정적 conent 입니다. 다른 캐시 응용 프로그램 및 웹 서버 응용 프로그램에서 일부 테스트 및 벤치 마크와의 링크를 찾았습니다.

http://nbonvin.wordpress.com/2011/03/14/apache-vs-nginx-vs-varnish-vs-gwan/

NginX는 정적 콘텐츠를 얻는 데 실제로 더 빠르므로 그냥 통과시키는 것이 더 합리적입니다. NginX는 정적 파일과 잘 작동합니다.

-

그 외에도 대부분의 정적 콘텐츠는 웹 서버 자체에는 없습니다. 이 콘텐츠는 대부분 CDN에 저장되어있을 수 있습니다. 아마도 AWS S3 같은 곳일 것입니다. 바니시 캐시는 정적 콘텐츠를 저장하려는 마지막 장소입니다.

답변:


10

니스에는 몇 가지 장점이 있습니다. 첫 번째는 백엔드 서버의 부하를 줄이는 것입니다. 일반적으로 동적으로 생성되지만 드물게 변경되는 내용 (액세스 빈도에 비해)을 캐싱합니다. Wordpress 예를 들어 대부분의 페이지는 자주 변경되지 않으며 페이지가 변경 될 때 바니시 캐시를 무효화하는 플러그인이 있습니다 (예 : 새 게시물, 편집, 주석 등). 따라서 무기한 캐싱하고 변경시 무효화되어 백엔드 서버에 대한 최소로드가 발생합니다.

링크 된 기사에도 불구하고 대부분의 사람들은 올바르게 설정하면 니스가 Nginx보다 성능이 뛰어나다는 것을 제안 할 것입니다. 운 좋게도, 나는 그 목적을 위해 광택제를 사용하지 않습니다). 문제는 니스를 사용하면 설정에 추가 레이어를 추가 한 것입니다. 추가 계층을 백엔드 서버로 전달하는 것은 백엔드에서 직접 제공하는 것보다 항상 속도가 느리기 때문에 Varnish가 더 빠르게 캐시하도록 허용하는 것은 단계를 저장하는 것입니다. 다른 장점은 disk-io front에 있습니다. malloc을 사용하도록 니스를 설정하면 디스크에 전혀 영향을 미치지 않으므로 다른 프로세스에서 디스크를 사용할 수 있습니다 (일반적으로 속도가 빨라짐).

실제로 성능을 측정하려면 더 나은 벤치 마크가 필요하다고 생각합니다. 동일한 단일 파일을 반복해서 요청하면 파일 시스템 캐시가 트리거되어 웹 서버 자체에서 포커스를 멀리 이동시킵니다. 더 나은 벤치 마크는 실제 트래픽을 시뮬레이션하기 위해 수천 개의 임의 정적 파일 (서버 로그에서도 가능)과 함께 포위 공격을 사용합니다. 그러나 언급 한 바와 같이 정적 콘텐츠를 CDN으로 오프로드하는 것이 점점 일반화되고 있습니다. 즉, Varnish는 처음부터이를 제공하지 않을 것입니다 (S3 언급).

실제 시나리오에서는 생성하는 것이 가장 비싸기 때문에 메모리 사용량 (동적 컨텐츠를 먼저)을 우선시 할 수 있습니다. 그런 다음 작은 정적 콘텐츠 (예 : js / css)와 마지막 이미지-실제로 다른 이유가 없다면 메모리에 다른 미디어를 캐시하지 않을 것입니다. 이 경우 메모리에서 파일을로드하는 니스와 디스크에서 파일을로드하는 니스와 함께 니스는 성능이 nginx보다 성능이 뛰어납니다 (nginx의 캐시는 프록시 및 fastCGI 용이며 기본적으로 디스크 기반 임). memcached와 함께 nginx를 사용할 수 있음).

(내 빠른-매우 거칠고 신뢰성이 없음-테스트에서 nginx (직접)가 가장 빠르다는 것을 보여주었습니다 .100 %로 부르고, malloc이있는 광택은 조금 느립니다 (약 150 %), 광택이있는 nginx ( 패스와 함께)가 가장 느리게 (약 250 %) 백엔드와 통신하기 위해 여분의 시간 (및 처리)을 추가하여 자체적으로 또는 전혀 말하지 않고, 바니시를 사용하는 경우 RAM을 절약하도록 제안합니다. , nginx로 돌아 가지 않고 가능한 모든 것을 캐시하고 Varnish에서 제공 할 수 있습니다.)


나는 당신이 주장한 점이 마음에 들었습니다. 방금 이것에 파기 시작했고 대부분의 온라인 가이드가 정적 컨텐츠를 바니시로 캐시 할 수 있다는 것이 이상합니다. 일부 사람들은 MB의 정적 컨텐츠를 캐싱하고 있습니다. 당신이 무슨 말을 사실 경우 는 작은 파일이며, 경우에 당신은 메모리가이 괜찮 절약 할 수 있습니다.
Saif Bechan

즉, 나는 여분의 메모리가 없으며 CDN에 넣고 싶지 않은 템플릿 레이아웃 파일이 있는데 템플릿 디렉토리에 넣고 싶습니다. 캐시를 구성하는 니스 구성에서 스 니펫을 제거하여 메모리를 더 잘 사용할 수 있습니다. 3 가지 설정에 대한 팁이 마음에 들었습니다. nginx에 직접 포트를 열고 템플릿 파일을 제공한다고 생각합니다. 광택 처리 HTML, nginx 처리 정적 및 새로운 내용에 대한 php / mysql이 필요한 경우.
Saif Bechan

많은 Varish 설정은 많은 GB의 메모리를 사용합니다. 올바르게 설정하고 실제 시나리오에서는 nginx보다 성능이 뛰어나다는 것을 의심하지 않습니다. 그래도 바니쉬가 제공하는 유연성과 옵션이 인기를 끌 수 있다고 제안 할 수 있습니다. 결국 캐싱을 위해 특별히 설계되었습니다. Wordpress에서 선호하는 설정은 Wordpress + W3TC (+ Cloudfront) + Varnish + Nginx + PHP-FPM + APC입니다. 실제로 다른 설정만큼 빠르지는 않지만 좋은 성능으로 부하를 잘 처리합니다. 회사 방화벽은 종종 비표준 포트를 차단합니다.
cyberx86

궁금한 점이 있다면 CDN에 템플릿 (물론 CSS / JS-PHP를 의미하는 것은 물론 서버에 있어야 함)을 유지하지 않겠습니까? 또한 내 ec2- 인스턴스 중 하나가 동일한 전제를 염두에두고 설정 if (req.url ~ "\.(png|gif|jp(e?)g|avi|flv|mp(e?)g|mp4|mp3)"){return(pass);}되었으며 vcl_recv ()에 다음이 포함됩니다 . 본질적으로 미디어를 캐시하고 싶지는 않지만 html (php) 및 심지어 js / css (이미지가 레이아웃보다 인식 된 페이지로드 시간에 덜 기여한다는 이론)를 캐시하고 싶습니다.
cyberx86

w3tc를 보았지만 실제로 플러그인을 사용하고 싶지 않습니다. 각 사이트마다 특정 옵션을 관리하는 작은 플러그인을 만들므로 모든 것이 무엇인지 알 수 있습니다. 프로그래머 POV에서 일부 플러그인을 보았고 일부는 끔찍한 디자인이었습니다. 나는 내 자신의 축소 플러그인을 만들었고, 미디어 파일을 s3 및 cf, 작은 memcached 플러그인 등으로 직접 스매싱 및 업로드했습니다. CDN에 템플릿을 업로드하는 데 필요한 최종 플러그인을 만들지 못했습니다.
Saif Bechan

2

뭔가 빠진 것 같아요

정의에 따라 동적 파일이 변경됩니다. 일반적으로 사용자에게 제공되는 페이지의 내용에 영향을주는 일종의 데이터베이스 쿼리를 수행하여 변경합니다. 따라서 동적 내용을 캐시하지 않으려 고합니다. 그렇게하면 단순히 정적 컨텐츠가되고 잘못된 컨텐츠가있는 정적 컨텐츠가됩니다.

간단한 예로, 페이지 상단에 로그인 한 사용자 이름이있는 페이지가 있다고 가정 해 봅시다. 해당 페이지가로드 될 때마다 데이터베이스 쿼리가 실행되어 로그인 한 사용자에게 어떤 사용자 이름이 있는지 확인하여 페이지를 요청하여 올바른 이름이 표시되도록합니다. 이 페이지를 캐시하는 경우 데이터베이스 쿼리가 발생하지 않으며 모든 사용자가 페이지 상단에 동일한 사용자 이름을 보게되며 사용자 이름이 아닐 수 있습니다. 각 사용자에게 올바른 사용자 이름이 표시되도록하려면 모든 페이지로드에서 해당 쿼리를 수행해야합니다. 따라서 캐시 할 수 없습니다.

이 논리를 사용자 권한과 같이 조금 더 문제가되는 것으로 확장하면 동적 콘텐츠를 캐시하지 않아야하는 이유를 알 수 있습니다. 데이터베이스가 동적 내용에 적합하지 않은 경우 CMS는 페이지를 요청하는 사용자에게 해당 페이지를 볼 수있는 권한이 있는지 여부를 확인할 방법이 없습니다.

정적 콘텐츠는 정의상 모든 사용자에게 동일합니다. 따라서 각 사용자에 대해 해당 페이지를 사용자 정의하기 위해 데이터베이스 쿼리를 수행 할 필요가 없으므로 불필요한 데이터베이스 쿼리를 제거하기 위해 해당 페이지를 캐시하는 것이 좋습니다. 이미지는 정적 콘텐츠의 훌륭한 예입니다. 모든 사용자가 동일한 헤더 이미지, 동일한 로그인 버튼 등을 보길 원하므로 캐싱에 탁월한 후보입니다.

위의 코드 스 니펫에는 이미지, CSS 및 자바 스크립트가 캐시되도록하는 매우 일반적인 Varnish VCL 스 니펫이 표시됩니다. 기본적으로 Varnish는 쿠키가 포함 된 요청을 캐시하지 않습니다. 논리는 요청에 쿠키가있는 경우 서버가 쿠키를 필요로하는 이유가 있어야 백엔드에 필요하고 캐시를 통해 전달되어야한다는 것입니다. 실제로 많은 CMS (Drupal, Wordpress 등)는 쿠키를 필요한지 여부에 관계없이 거의 모든 것에 쿠키를 첨부하므로 VCL을 작성하여 정적으로 알려진 콘텐츠에서 쿠키를 제거하여 Varnish를 캐시하는 것이 일반적입니다. 그것.

말이 되나요?


답변 주셔서 감사합니다, 그러나 나는 아직도 확실하지 않다. 일부 웹 사이트에서는 동적 콘텐츠가 변경되지만 내 웹 사이트에서는 동적 콘텐츠가 자주 변경되지 않는다는 사실을 알고 있습니다. CMS를 사용하여 삶을 더 단순하게 만듭니다. 따라서 내 동적 페이지를 일주일 동안 캐시 할 수 있습니다. 중요, 동적을 잊어 버리십시오. 백엔드로 nginx가있는 경우 정적 컨텐츠를 캐시하는 이유를 이해하지 못합니다. 내가 올바른 경우 nginx와 니스는 정적 내용만큼 빠르거나 틀립니다. 정적 조회는 니스와 마찬가지로 nginx를 사용하여 빠르게 처리 할 수 ​​있습니다. 질문을 조금 업데이트했습니다.
Saif Bechan

2

들어 동적 내용 , 주식 시세 실제로 자주 변경과 같은 몇 가지 종류 (온 매 초마다 업데이트 SaaS serverA로부터 backend server)하지만 (수만도 더 자주 조회 할 수 있습니다 subscription clients)

[stock calculation / backend server] ----- [SaaS server] ------ [subscription clients]

이 경우, 캐싱SaaS server에서 당 두 번째 업데이트 backend servers차종이 가능한 수만의 쿼리를 만족합니다 subscription users.

SaaS 서버에 캐시가 없으면이 모델은 작동하지 않습니다.


1

니스로 정적 파일을 캐싱하면 Nginx를 오프로드하는 데 도움이됩니다. 물론 캐시 할 정적 파일이 많으면 RAM이 낭비됩니다. 그러나 니스에는 멋진 기능이 있습니다. 캐시에 여러 스토리지 백엔드를 지원합니다.

정적 파일의 경우 : 캐시에서 HDD로 기타 모든 것의 경우 : 캐시에서 RAM으로.

이를 통해이 시나리오를 구현하는 방법에 대한 자세한 정보를 얻을 수 있습니다. http://www.getpagespeed.com/server-setup/varnish-static-files-cache


왜 정적 파일을 HDD 캐시에 넣을 수 있는지 궁금합니다. 캐시없이 디스크에서 파일을 제공하는 것과 본질적으로 같은 것이 아닙니까?
Shane N

본질적으로 그렇습니다 :) 그러나 니스가 있으면 백엔드 (Nginx, Apache 등)에 연락하여 가져옵니다. 파일 시스템에서 직접 수행 할 수 없습니다. 백엔드 통신의 오버 헤드를 제거하려면 디스크에도 캐시되어야합니다.
Danila Vershinin

아, 알겠습니다. 감사합니다 @ danila-v
Shane N
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.