웹사이트 검색

Ubuntu 14.04에서 SSL 종료로 Varnish Cache 4.0을 구성하는 방법


소개

이 튜토리얼에서는 Varnish Cache 4.0을 사용하여 기존 웹 서버의 성능을 향상시키는 방법을 다룹니다. 또한 SSL 종료를 수행하는 Nginx와 함께 Varnish에 HTTPS 지원을 추가하는 방법도 보여줍니다. 웹 애플리케이션 서버가 이미 설정되어 있다고 가정하고 일반 LAMP(Linux, Apache, MySQL, PHP) 서버를 시작점으로 사용합니다.

Varnish Cache는 캐싱 HTTP 리버스 프록시 또는 HTTP 가속기로, 사용자에게 콘텐츠를 제공하는 데 걸리는 시간을 줄여줍니다. 사용하는 주요 기술은 웹 또는 애플리케이션 서버의 응답을 메모리에 캐싱하는 것이므로 동일한 콘텐츠에 대한 향후 요청이 웹 서버에서 검색하지 않고도 제공될 수 있습니다. 다양한 환경에서 성능을 크게 향상시킬 수 있으며 콘텐츠가 많은 동적 웹 애플리케이션이 있을 때 특히 유용합니다. Varnish는 기본 기능으로 캐싱을 사용하여 구축되었지만 리버스 프록시 로드 밸런싱과 같은 다른 용도도 있습니다.

대부분의 경우 Varnish는 기본값으로 잘 작동하지만 특정 응용 프로그램, 특히 쿠키를 사용하는 응용 프로그램의 성능을 개선하려면 조정해야 합니다. Varnish의 심층 튜닝은 이 튜토리얼의 범위를 벗어납니다.

전제 조건

이 자습서에서는 개인 IP 주소에서 HTTP(포트 80)를 수신하는 웹 응용 프로그램 서버가 이미 있다고 가정합니다. 아직 웹 서버를 설정하지 않은 경우 다음 링크를 사용하여 고유한 LAMP 스택을 설정합니다. Ubuntu 14.04에 Linux, Apache, MySQL, PHP(LAMP) 스택을 설치하는 방법. 이 서버를 LAMP_VPS라고 합니다.

Varnish 설치에 사용할 새 Ubuntu 14.04 VPS를 생성해야 합니다. Ubuntu 14.04 가이드의 초기 서버 설정에서 1-4단계를 완료하여 sudo 권한이 있는 루트가 아닌 사용자를 만듭니다. 이 서버를 Varnish_VPS라고 합니다.

Varnish 서버는 사용자 요청을 수신하며 수신할 것으로 예상되는 트래픽 양에 맞게 크기가 적절해야 합니다.

우리의 목표

우리의 목표는 요청을 빠르고 효율적으로 처리할 수 있도록 웹 애플리케이션 서버 앞에 Varnish Cache를 설정하는 것입니다. 캐싱이 설정되면 Nginx를 활용하여 들어오는 SSL 요청을 처리하여 Varnish에 HTTPS 지원을 추가하는 방법을 보여줍니다. 설정이 완료되면 HTTP 및 HTTPS 트래픽 모두 캐싱의 성능 이점을 보게 됩니다.

이제 전제 조건을 설정했고 무엇을 빌드하려고 하는지 알았으니 시작하겠습니다!

바니시 설치

Varnish 4.0의 최신 릴리스를 얻는 권장 방법은 공식 저장소를 통해 사용 가능한 패키지를 설치하는 것입니다.

Ubuntu 14.04는 apt-transport-https와 함께 제공되지만 Varnish_VPS에서 다음 명령을 실행하면 됩니다.

sudo apt-get install apt-transport-https

이제 apt에 Varnish GPG 키를 추가합니다.

curl https://repo.varnish-cache.org/ubuntu/GPG-key.txt | sudo apt-key add -

그런 다음 적절한 소스 목록에 Varnish 4.0 저장소를 추가합니다.

sudo sh -c 'echo "deb https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.0" >> /etc/apt/sources.list.d/varnish-cache.list'

마지막으로 다음 명령을 사용하여 apt-get을 업데이트하고 Varnish를 설치합니다.

sudo apt-get update
sudo apt-get install varnish

기본적으로 Varnish는 포트 6081에서 수신 대기하도록 구성되며 웹 서버가 동일한 서버에 있고 포트 8080에서 수신 대기할 것으로 예상합니다. 브라우저를 열고 서버의 포트 6081로 이동합니다(강조 표시된 부분을 공용 IP 주소 또는 도메인으로 바꿉니다).

http://varnish_VPS_public_IP:6081

새로운 VPS에 Varnish를 설치했기 때문에 서버의 공용 IP 주소 또는 도메인 이름에서 포트 6081을(를) 방문하면 다음 오류 페이지가 반환됩니다.

이는 Varnish가 설치되어 실행 중이지만 캐싱해야 하는 웹 서버를 찾을 수 없음을 나타냅니다. 이제 웹 서버를 백엔드로 사용하도록 구성하겠습니다.

바니시 구성

먼저 LAMP_VPS를 백엔드로 사용하도록 Varnish를 구성합니다.

Varnish 구성 파일은 /etc/varnish/default.vcl에 있습니다. 지금 수정해 보겠습니다.

sudo vi /etc/varnish/default.vcl

다음 줄을 찾으십시오.

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

그리고 hostport 값을 각각 LAMP 서버 사설 IP 주소 및 수신 포트와 일치하도록 변경합니다. 웹 애플리케이션이 개인 IP 주소와 포트 80에서 수신 대기하고 있다고 가정합니다. 그렇지 않은 경우 필요에 맞게 구성을 수정하십시오.

backend default {
    .host = "LAMP_VPS_private_IP";
    .port = "80";
}

Varnish에는 "유예 모드\라는 기능이 있습니다. 이 기능을 활성화하면 웹 서버 백엔드가 다운되어 사용할 수 없게 되면 Varnish가 요청된 페이지의 캐시된 복사본을 제공하도록 지시합니다. 지금 활성화하겠습니다. 다음 sub vcl_backend_response 를 찾으십시오. 블록에 다음 강조 표시된 줄을 추가합니다.

sub vcl_backend_response {
    set beresp.ttl = 10s;
    set beresp.grace = 1h;
}

이렇게 하면 캐시된 페이지의 유예 기간이 1시간으로 설정됩니다. 즉, Varnish는 새로운 복사본을 찾기 위해 웹 서버에 연결할 수 없는 경우 최대 1시간 동안 캐시된 페이지를 계속 제공합니다. 이는 애플리케이션 서버가 다운되고 웹 서버를 백업하는 동안 오류 페이지(예: 이전에 본 503 오류) 대신 오래된 콘텐츠를 사용자에게 제공하려는 경우 유용할 수 있습니다.

default.vcl 파일을 저장하고 종료합니다.

기본 HTTP 포트(80)에서 수신 대기하도록 Varnish를 설정하여 사용자가 URL에 비정상적인 포트 번호를 추가하지 않고도 사이트에 액세스할 수 있습니다. 이것은 /etc/default/varnish 파일에서 설정할 수 있습니다. 지금 수정해 보겠습니다.

sudo vi /etc/default/varnish

많은 줄을 볼 수 있지만 대부분 주석 처리되어 있습니다. 다음 DAEMON_OPTS 줄을 찾습니다(이미 주석이 제거되어 있어야 함).

DAEMON_OPTS="-a :6081 \

-a 옵션은 Varnish가 요청을 수신할 주소와 포트를 할당하는 데 사용됩니다. 기본 HTTP 포트인 포트 80을 수신하도록 변경해 보겠습니다. 수정 후에는 다음과 같아야 합니다.

DAEMON_OPTS="-a :80 \

저장 및 종료.

이제 Varnish를 다시 시작하여 변경 사항을 적용합니다.

sudo service varnish restart

이제 이번에는 포트 80(HTTP)에서 공용 IP 주소로 Varnish 서버를 방문하여 웹 브라우저로 테스트해 보십시오.

http://varnish_VPS_public_IP

LAMP_VPS에서 제공되는 것과 동일한 것을 볼 수 있습니다. 우리의 경우에는 일반 Apache2 Ubuntu 페이지입니다.

이 시점에서 Varnish는 애플리케이션 서버를 캐싱하고 있습니다. 응답 시간 감소로 성능상의 이점을 볼 수 있기를 바랍니다. 기존 애플리케이션 서버를 가리키는 도메인 이름이 있는 경우 Varnish_VPS_public_IP를 가리키도록 DNS 항목을 변경할 수 있습니다.

기본 캐싱 설정이 완료되었으므로 Nginx로 SSL 지원을 추가해 보겠습니다!

Nginx를 사용한 SSL 지원(선택 사항)

Varnish는 기본적으로 SSL 종료를 지원하지 않으므로 HTTPS 트래픽을 처리할 목적으로만 Nginx를 설치합니다. 자체 서명된 SSL 인증서로 Nginx를 설치 및 구성하는 단계와 HTTPS 연결에서 HTTP를 통해 Varnish로 역방향 프록시 트래픽을 설명합니다.

Nginx로 자체 서명된 SSL 인증서를 설정하는 방법에 대한 자세한 설명을 보려면 다음 링크를 참조하십시오. 여기에는 해당 내용을 다루는 자습서가 있습니다.

Nginx를 설치해봅시다.

Nginx 설치

Varnish_VPS에서 다음 apt 명령으로 Nginx를 설치해 보겠습니다.

sudo apt-get install nginx

설치가 완료되면 Nginx가 실행되고 있지 않음을 알 수 있습니다. 기본적으로 포트 80에서 수신 대기하도록 구성되어 있지만 Varnish가 이미 해당 포트를 사용하고 있기 때문입니다. 기본 HTTPS 포트인 포트 443에서 수신하려고 하므로 괜찮습니다.

사용할 SSL 인증서를 생성해 보겠습니다.

자체 서명된 SSL 인증서 생성

Varnish_VPS에서 SSL 인증서를 배치할 수 있는 디렉토리를 만듭니다.

sudo mkdir /etc/nginx/ssl

자체 서명된 2048비트 SSL 키와 인증서 쌍을 생성합니다.

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

도메인 이름과 일치하도록 일반 이름을 설정했는지 확인하세요. 이 특정 인증서는 1년 후에 만료됩니다.

이제 인증서가 준비되었으므로 이를 사용하도록 Nginx를 구성하겠습니다.

Nginx 구성

편집을 위해 기본 Nginx 서버 블록 구성을 엽니다.

sudo vi /etc/nginx/sites-enabled/default

파일의 모든 항목을 삭제하고 다음으로 바꿉니다(및 도메인 이름과 일치하도록 server_name 변경).

server {
        listen 443 ssl;

        server_name example.com;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        location / {
            proxy_pass http://127.0.0.1:80;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header X-Forwarded-Port 443;
            proxy_set_header Host $host;
        }
}

저장 및 종료. 위의 구성에는 더 자세히 설명할 몇 가지 중요한 라인이 있습니다.

  • ssl_certificate: SSL 인증서 위치 지정
  • ssl_certificate_key: SSL 키 위치 지정
  • listen 443 ssl: Nginx가 포트 443에서 수신 대기하도록 구성
  • server_name: 서버 이름을 지정하고 SSL 인증서의 일반 이름과 일치해야 합니다.
  • proxy_pass http://127.0.0.1:80;: 트래픽을 Varnish로 리디렉션합니다(127.0.0.1의 포트 80에서 실행됨(즉, localhost)

다른 proxy_set_header 줄은 사용자 요청과 함께 원래 사용자의 IP 주소와 같은 정보를 전달하도록 Nginx에 지시합니다.

이제 서버가 HTTPS 요청을 처리할 수 있도록 Nginx를 시작하겠습니다.

sudo service nginx start

이제 이번에는 포트 443(HTTPS)에서 공용 IP 주소로 Varnish 서버를 방문하여 웹 브라우저로 테스트해 보십시오.

https://varnish_VPS_public_IP

참고: 자체 서명된 인증서를 사용한 경우 "사이트의 보안 인증서를 신뢰할 수 없습니다.\와 같은 경고가 표시됩니다. 방금 인증서를 생성했음을 알고 있으므로 계속해도 안전합니다.

다시 말하지만 이전과 동일한 애플리케이션 페이지가 표시되어야 합니다. 차이점은 실제로 SSL 암호화를 처리하고 암호화되지 않은 요청을 Varnish로 전달하는 Nginx 서버를 방문하고 있다는 것입니다. Varnish는 요청을 정상적으로 처리합니다.

백엔드 웹 서버 구성

백엔드 웹 서버가 모든 네트워크 인터페이스(예: 공용 및 사설 네트워크 인터페이스)에 바인딩되어 있는 경우 사설 인터페이스에서만 수신 대기하도록 웹 서버 구성을 수정해야 합니다. 이는 사용자가 공개 IP 주소를 통해 백엔드 웹 서버에 직접 액세스하여 Varnish Cache를 우회하는 것을 방지하기 위한 것입니다.

Apache 또는 Nginx에서 이것은 listen 지시문의 값을 할당하여 백엔드 서버의 개인 IP 주소에 바인딩하는 것을 포함합니다.

바니시 문제 해결

Varnish가 페이지를 제대로 제공하는 데 문제가 있는 경우 다음은 Varnish가 배후에서 수행하는 작업을 확인하는 데 도움이 되는 몇 가지 명령입니다.

통계

캐시가 얼마나 잘 수행되고 있는지 알아보려면 varnishstat 명령을 살펴보고 싶을 것입니다. 다음과 같이 실행하십시오.

varnishstat

다음과 같은 화면이 표시됩니다.

다양한 통계가 표시되며 위/아래 화살표를 사용하여 스크롤하면 각 항목에 대한 간단한 설명이 표시됩니다. cache_hit 통계는 얼마나 많은 요청이 캐시된 결과와 함께 제공되었는지 보여줍니다. 이 숫자는 클라이언트 요청의 총 수(client_req)에 최대한 근접해야 합니다.

종료하려면 q를 누르십시오.

로그

Varnish가 각 개별 요청을 처리하는 방법에 대한 자세한 보기를 스트리밍 로그 형식으로 보려면 varnishlog 명령을 사용하는 것이 좋습니다. 다음과 같이 실행하십시오.

varnishlog

실행되면 웹 브라우저를 통해 Varnish 서버에 액세스해 보십시오. Varnish로 보내는 각 요청에 대해 Varnish 구성 문제를 해결하고 조정하는 데 사용할 수 있는 자세한 출력이 표시됩니다.

종료하려면 CTRL + C를 누르십시오.

결론

이제 웹 서버 앞에 Varnish Cache 서버가 있으므로 대부분의 경우 성능이 향상됩니다. Varnish는 매우 강력하고 조정 가능하며, 이를 최대한 활용하려면 추가 조정이 필요할 수 있습니다.