Getting Started with Varnish Cache

서버가 많은 트래픽을 처리해야합니까? 캐싱은 Linode의 출력을 최대화하는 가장 좋은 방법 중 하나입니다. 하지만 캐싱은 정확히 무엇입니까?

캐싱의 배경은 액세스 할 때마다 서버가 동일한 동적 컨텐트를 처음부터 다시 생성하지 않아도된다는 것입니다. HTTP 요청에 대한 응답을 가속화하고 서버 워크로드를 줄이기 위해 웹 서비스 앞에 Varnish와 같은 캐싱 프록시를 배치하여 Linode의 리소스를 절약하십시오.

 

Varnish는 요청을 백엔드로 보내기 전에 요청을 처리하여 작동합니다. 백엔드가 Apache, nginx 또는 다른 웹 서버이든 상관 없습니다. 캐시 된 요청이없는 경우 요청을 백엔드로 전달한 다음 출력을 캐시합니다. 그런 다음 이러한 캐시 된 요청을 메모리에 저장할 수 있으므로 디스크에서 가져온 요청보다 훨씬 빠르게 클라이언트에서 검색하여 클라이언트에 전달할 수 있습니다.

또한 Varnish 캐시는 가용성이 높은 환경의 일부로 사용할 수 있으므로 트래픽이 많은로드 또는 서버 장애시 가동 시간을 보장합니다.

웹 서버가 nginx이고 Varnish 캐시를 사용하여 WordPress를 제공하려면 Linode의 데비안 8에서 SSL 및 HTTP를 통한 WordPress 서비스를위한 바니시 및 nginx 사용 안내서를 방문하십시오.

Before You Begin

  1. 시작하기 가이드를 숙지하고 Linode의 호스트 이름 및 시간대 설정 단계를 완료하십시오.
  2. 표준 사용자 계정을 만들고 SSH 액세스를 강화하며 불필요한 네트워크 서비스를 제거하려면 Securing your Server 안내서의 섹션을 완료하십시오.
  3. Apache 또는 nginx와 같은 웹 서버를 설치하고 구성하십시오.
  4. 시스템 업데이트 :
sudo apt update && sudo apt upgrade

Note: 이 안내서는 비 루트 사용자를 대상으로 작성되었습니다. 상승 된 권한이 필요한 명령의 접두사는 sudo입니다. sudo 명령에 익숙하지 않은 경우 사용자 및 그룹 설명서를 참조하십시오.

Install and Configure Varnish Cache

1. 패키지 관리자에 Varnish을 설치하십시오.

sudo apt install varnish

2. 향후 업데이트로 구성을 덮어 쓰지 않으려면 기본값의 복사본을 만드십시오.

cd /etc/varnish
sudo cp default.vcl user.vcl

3. 구성을 변경하는 동안 바니시 (Varnish) 서비스를 중단하십시오.

sudo systemctl stop varnish

Configure Varnish Backend with Systemd

Varnish는 Varnish Configuration Language (VCL)를 통해 구성됩니다. Varnish는 시스템에서 구성 파일을로드 한 후 Varnish 프로세스와 함께 실행되는 C 프로그램으로 VCL 코드를 변환하고 컴파일합니다.

최근 데비안 버전 (8 이상)과 우분투 (15.04 이상)에서는 systemd를 통한 Varnish 설정이 필요합니다.

 

1. varnish.service 파일을 열고 ExecStart 줄에 포트, 구성 파일 및 메모리 할당을 설정합니다. 다음 예제에서이 값은 -a : 80, /etc/varnish/user.vcl 및 malloc, 1G입니다.


파일 발췌t: /lib/systemd/system/varnish.service

ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/user.vcl -S /etc/varnish/secret -s malloc,1G

2. 위의 구성은 캐시 항목을 저장하기 위해 최대 1GB의 메모리를 할당합니다. 이 할당을 조정해야하는 경우 -smalloc, 1G의 수를 편집하십시오. 예를 들어, 2GB의 메모리를 할당하려면 :

-s malloc,2G

3. systemd 다시로드 :

sudo systemctl daemon-reload

Modify Custom Varnish Configuration VCL

이제 Varnish 시작 스크립트가 user.vcl로 지정되었으므로 Varnish가 웹 서버에서 가져 오는 내용을 제공하도록 파일을 구성해야합니다. /etc/varnish/user.vcl의 백엔드 기본값을 편집하여 Varnish에게 서버 (백엔드) 컨텐츠를 가져올 위치를 알려줍니다. 아래 예제는 나중에 구성 할 웹 서버 설정 인 8080 포트를 사용합니다.


파일 발췌: /etc/varnish/user.vcl

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

Configure Cache Time-to-Live (TTL)

기본적으로 Varnish는 요청을 2 분 동안 캐시합니다. 이 시간을 조정하려면 VCL 파일을 열고 백엔드 선언을 업데이트하여 vcl_backend_response 서브 루틴을 재정의하십시오.

 

파일 발췌: /etc/varnish/user.vcl

sub vcl_backend_response {
  set beresp.ttl = 5m;
}

이 서브 루틴은 백엔드에서 요청을 가져온 후에 호출됩니다. 이 예제에서는 객체의 TTL 변수를 5 분 (5m)으로 설정합니다. 값은 초 (120 초), 분 (2m) 또는 시간 (2h) 단위 일 수 있습니다. 이상적인 TTL은 사이트의 콘텐츠 업데이트 빈도 및 처리해야하는 트래픽 양에 따라 달라질 수 있습니다.

Take Varnish Live: Configure Web Traffic to Serve Cached Content

이제 Varnish를 구성 했으므로이 섹션을 사용하여 웹 서버와 Varnish가 수신하는 포트를 서로 바꿔서 웹 서버로 만듭니다. 아래 그래픽에서 설명한 것처럼 모든 웹 트래픽은 광택 캐시에서 제공되며 2 분마다 또는 위에서 구성된 간격으로 새로 고쳐집니다.

 

528a04ba09c688e9df0bd25dde497d7c_1488429266_5261.png 

 

Varnish가 웹 서버와 통신 할 수있게하려면 사이트의 가상 호스트 파일에서 몇 가지 설정을 수정해야합니다.

 

1. nginx를 사용한다면이 단계를 건너 뜁니다. 아파치를 사용하고 있다면, 아파치가 듣는 포트를 바꾼다. /etc/apache2/ports.conf와 모든 가상 호스트를 편집하십시오. ports.conf를 열고 Listen 80의 80을 다른 포트로 변경하십시오. 이 예제에서는 포트 8080이 사용됩니다.

Listen 8080

2. 가상 호스트 파일 또는 서버 블록을 수정하여 포트 8080에서 수신 대기하십시오.

Apache:

파일 발췌: /etc/apache2/sites-available/example.com.conf

<VirtualHost *:8080>

nginx:

파일 발췌: /etc/nginx/sites-available/example.com

listen 8080;
listen [::]:8080;

3. /etc/varnish/user.vcl 파일을 확인하고 백엔드 기본값이 포트 8080을 사용하도록 설정되었는지 확인하십시오.

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

4. 웹 서버의 구성을 다시로드하십시오.

sudo systemctl reload apache2
sudo systemctl restart nginx

5. Varnish 시작

sudo systemctl start varnish

일단 시작되면 Varnish는 사이트 방문자에게 실시간으로 제공되며 구성에 따라 가능할 때마다 캐시에서 콘텐츠가 제공됩니다.

Advanced Varnish Configuration

VCL을 사용하면 요청이 캐시되는 방식을 확장 제어 할 수 있으므로 약간의 수정이 필요할 수 있습니다. 이 섹션에서는 몇 가지 일반적인 VCL 구성에 대해 설명합니다.

이러한 수정은 user.vcl 파일에서 이루어져야합니다.

Exclude Content from Varnish Cache

특히 비공개 또는 관리 부분이있는 경우 와니스 캐시에서 웹 사이트의 특정 부분을 제외 할 수 있습니다. 이렇게하려면 요청에 대한 정보를 얻기 위해 Varnish의 요청 개체에 액세스하고 조건에 따라 캐시하지 않고 요청을 백엔드로 전달하도록 Varnish에 지시합니다.

Varnish가 요청을받을 때마다 실행되는 VCL 파일의 vcl_recv 서브 루틴을 무시하고 조건부를 추가해야합니다.

 

파일 발췌: /etc/varnish/user.vcl

sub vcl_recv
{
    if (req.http.host == "example.com" &&
        req.url ~ "^/admin")
    {
        return (pass);
    }
}

이 예제는 캐시하고 싶지 않은 두 가지 조건을 확인합니다. 첫 번째는 example.com에 대한 요청이고 두 번째는 / admin으로 시작하는 모든 URI 요청입니다. 이 두 가지가 모두 해당되면 Varnish는 요청을 캐시하지 않습니다.

Unset Cookies

앞에서 언급했듯이, Varnish가 귀하의 웹 사이트가 쿠키를 설정하고 있음을 감지하면 귀하의 사이트가 쿠키와 상호 작용할 필요가 있다고 가정하고 이에 따라 동적 컨텐츠를 보여줍니다. 따라서 바니시는 해당 페이지를 캐시하지 않습니다. Varnish의 req.http 객체에서 Cookie 변수를 설정 해제하여이 동작을 무시할 수 있습니다.

이 줄을 vcl_recv 섹션의 맨 아래에 추가하십시오.

 

파일 발췌: /etc/varnish/user.vcl

unset req.http.Cookie;

특정 쿠키는 콘텐츠 표시에 중요하거나 사용자가 로그인했는지 여부를 결정할 수 있습니다. 이 경우 캐시 된 콘텐츠를 표시하지 않고 대신 사용자를 백엔드로 바로 보내려는 경우입니다.

이 경우 req.http.Cookie에 "logged_in"이라는 쿠키가 있는지 확인하고, 쿠키가 발견되면 요청은 캐싱없이 백엔드로 전달됩니다. 여기까지 우리의 전체 vcl_recv 서브 루틴이 있습니다 :

 

파일 발췌: /etc/varnish/user.vcl

sub vcl_recv
{
    if ((req.http.host ~ "example.com" &&
        req.url ~ "^/admin") ||
        req.http.Cookie == "logged_in")
     {
        return (pass);
     }

     unset req.http.Cookie;
}

To Cache POST, or Not to Cache POST?

POST 요청을 캐싱하지 않으려는 것은 아마도 동적 데이터를 수집하거나 사용자의 세션을 설정하기 위해 백엔드와 상호 작용해야하기 때문입니다. 위의 예에서 사용자가 로그인하면 요청을 캐시하지 않기로 선택했습니다.이 섹션에서는 사용자가 로그인 할 수 있도록합니다. 쉬운 접근 방법은 모두 POST 요청을 건너 뜁니다.

이를 수행하려면 vcl_recv 내부의 기존 리턴 (통과) 블록에 다음 조건을 추가하십시오.

 

파일 발췌: /etc/varnish/user.vcl

if ((req.http.host == "example.com" &&
    req.url ~ "^/admin") ||
    req.http.Cookie == "logged_in" ||
    req.method == "POST")
{
    return (pass);
}

Use Varnish Cache for High Availability with Backend Polling

Varnish는 백엔드 서버를 확인하고 백엔드에 도달 할 수없는 경우 캐시 된 컨텐츠를 계속 제공하기 위해 백엔드 폴링이라는 내장 도구를 사용할 수 있습니다. Varnish가 가동 중지 시간을 감지하는 경우 user.vcl에서 구성한 유예 기간 동안 캐시 된 컨텐츠를 계속 제공합니다.

폴링을 설정하려면 프로브 섹션을 /etc/varnish/user.vcl에있는 백엔드 선언에 추가하십시오.

 

파일 발췌: /etc/varnish/user.vcl

backend default {
    .host = '127.0.0.1';
    .port = '8080';
    .probe = {
        .url = "/";
        .timeout = 40ms;
        .interval = 1s;
        .window = 10;
        .threshold = 8;
     }
}

이러한 설정은 출발점 일 뿐이므로 웹 사이트에 맞게 조정할 수 있습니다. 이 예는 Varnish가 http://127.0.0.1:8080/ 초마다 폴링하거나 테스트 연결을 수행하도록 지시하고 최근 10 회 투표 중 8 회 이상 응답하는 데 40ms 미만이 소요되는 경우 백엔드를 고려합니다 건강한.

백엔드가 테스트에 실패하면 유해한 것으로 간주되고 객체는 유예 시간 설정에 따라 캐시에서 제공됩니다. 유예 시간을 설정하려면 vcl_backend_response에 다음 줄을 포함시킵니다.

 

파일 발췌: /etc/varnish/user.vcl

set beresp.grace = 1h;

"1 시간"은 웹 사이트 사용자에게 영향을 미치지 않고 백엔드가 1 시간 동안 작동 중지되도록합니다. 정적 컨텐츠를 제공하는 경우 가동 시간을 보장하기 위해 유예 시간이 더 길어질 수 있습니다.

Serve Varnish Cache from Another Linode (Optional)

가용성을 추가로 얻으려면 별도의 Linode에서 Varnish 캐시를 제공하는 것이 좋습니다. 이 경우, Varnish 설치 단계는 웹 서버와 동일한 데이터 센터에있는 별도의 Linode에서 수행되어야합니다. 설치가 끝나면 Varnish 백엔드 .host 값을 웹 서버 Linode의 개인 IP 주소를 가리 키도록 구성하십시오. 사이트의 DNS 레코드는 Varnish Linode를 가리켜 야합니다. 클라이언트가 연결되는 곳이기 때문입니다.

그게 다야! 모든 것이 잘되면 방문자가 사이트의 방문자에게 메모리에서 캐시 된 콘텐츠를 제공하여 사이트의 속도를 크게 향상시킵니다.

Test Varnish with varnishlog

이제는 모든 트래픽이 Varnish 캐시에 도달하도록 구성되었으므로 Varnish 활동을보기 위해 varnishlog를 시작하십시오. 이것은 활동이 발생하지 않는 한 어떠한 정보도 표시하지 않는 진행중인 실시간 로그입니다. Varnishlog를 시작했으면 브라우저를 사용하여 캐싱해야 할 페이지를보고 작업 로그를 봅니다.

sudo varnishlog

완료되면 CTRL + C로 varnishlog를 중지하십시오.

Firewall Rules

방화벽을 사용할 때 Varnish는 웹 서버를 설정할 때 사용한 규칙을 약간 수정해야합니다.

Varnish가 웹 서버와 동일한 Linode에서 실행중인 경우에는 포트 80에서 들어오는 연결을 허용해야합니다. 그러나 Larnish가 웹 서버와 통신하는 방법이므로 포트 8080에서 localhost와의 연결도 허용해야합니다.

Varnish와 웹 서버가 별도의 Linode에서 실행중인 경우에는 Varnish Linode의 80 번 포트와 웹 서버의 8080 번 포트에서 들어오는 트래픽을 받아 들여야합니다.

이 두 가지는 단순히 최소 규칙 수정 사항입니다. 실행중인 다른 서비스를 기반으로 각각에 대해 추가 방화벽 규칙을 사용하는 것이 좋습니다. 방화벽을 설정하는 방법을 모르는 경우 iptables 및 UFW에 대한 가이드를 확인하십시오.

More Information

이 주제에 대한 추가 정보는 다음 자료를 참조하십시오. 이러한 정보가 유용하게 쓰일 수 있도록 제공되지만, 외부에서 호스팅 한 자료의 정확성이나 적시성을 보장 할 수는 없습니다.

 

 

 

 

 

 


Comments

Category
글이 없습니다.
글이 없습니다.
반응형 구글광고 등
State
  • 현재 접속자 7 명
  • 오늘 방문자 16 명
  • 어제 방문자 189 명
  • 최대 방문자 420 명
  • 전체 방문자 105,027 명
  • 전체 게시물 333 개
  • 전체 댓글수 2 개
  • 전체 회원수 31 명
Facebook Twitter GooglePlus KakaoStory NaverBand