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

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 같은 곳일 것입니다. 바니시 캐시는 정적 콘텐츠를 저장하려는 마지막 장소입니다.



답변

니스에는 몇 가지 장점이 있습니다. 첫 번째는 백엔드 서버의 부하를 줄이는 것입니다. 일반적으로 동적으로 생성되지만 드물게 변경되는 내용 (액세스 빈도에 비해)을 캐싱합니다. 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에서 제공 할 수 있습니다.)


답변

뭔가 빠진 것 같아요

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

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

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

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

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

말이 되나요?


답변

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

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

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

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


답변

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

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

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


답변