티스토리 뷰

728x90
반응형

https://varnish-cache.org/

Varnish Cache 는 흔히 웹 어플리케이션 가속기라고 알려진 캐싱 HTTP 리버스 프록시입니다. 주로 HTTP 요청에 빠르게 응답하기 위해 응답 데이터를 캐싱한 뒤에 이후 동일한 요청이 들어왔을 때 저장된 데이터, 즉 캐시된 데이터를 응답해줌으로써 response time을 줄여줄 수 있는 기능을 수행합니다. 캐싱 서버 외에도 웹 방화벽, 로드 밸런서, HTTP 라우터 등으로도 사용될 수 있다고 합니다.

 

그리고 캐싱 서버는 캐시 정책을 작성할 수 있어야 하는데, Varnish Cache 는 VCL(Varnish Configuration Language)라는 별도의 정의 언어를 사용해서 정책을 작성할 수 있습니다. 해당 언어를 사용해서 어떤 컨텐츠를 캐시할 것이고 요청 또는 응답을 어떻게 변경해서 반환할 것인지 등을 정의할 수 있습니다.

 

실습

지금부터는 실제로 Varnish Cache를 설치해보고 캐시 서버를 사용하지 않은 상태의 성능 측정과 캐시 서버를 사용했을 때의 성능을 측정해보고 비교해볼 것입니다.

(성능 측정 도구로는 wrk 라는 HTTP benchmarking 도구를 사용했습니다)

https://github.com/wg/wrk

 

GitHub - wg/wrk: Modern HTTP benchmarking tool

Modern HTTP benchmarking tool. Contribute to wg/wrk development by creating an account on GitHub.

github.com

 

Step 1 - Varnish 와 Apache 설치하기

제 실습 환경은 Kali Linux (Debian 10) 입니다. 우선 시작하기에 앞서 Apache 와 Varnish 를 설치하도록 하겠습니다.

$ sudo apt-get update
$ sudo apt-get install apache2 -y

위 두 줄의 명령어를 입력하시면 쭉 뭔가 출력되면서 설치되는 걸 볼 수 있습니다.

 

Apache 설치가 끝났다면, varnish 를 아래 명령을 통해서 설치해줍니다.

$ sudo apt-get install varnish -y

(만약 varnish 가 패키지 리스트에서 검색되지 않는다면, apt sources list 를 업데이트 해보세요)

 

이제 아래 명령을 이용해서 Apache 서버와 Varnish의 상태를 체크해볼 수 있습니다.

$ sudo systemctl status apache2
$ sudo systemctl status varnish

만약 설치 후에 자동으로 시작되지 않는다면 아래 명령을 통해 수동으로 시작해보세요.

$ sudo systemctl restart apache2
$ sudo systemctl restart varnish

 

Step 2 - Varnish 설정하기

방금 막 설치했으니 이제 설정을 해보도록 하겠습니다. 기본적으로 Varnish는 6081 포트를 리스닝하고 있고 로컬 아파치 웹서버에는 8080포트로 연결합니다. 이제 이 연결 설정을 변경해볼 것입니다.

 

우선 Varnish 리스팅 포트를 8080 포트로 변경하고 Apache 서버 리스닝 포트를 80 포트로 변경해보겠습니다.

 

설정 파일 하나를 만들건데 별도의 경로에 디렉토리를 만들어서 파일을 생성할 것입니다.

$ sudo mkdir /etc/systemd/system/varnish.service.d
$ sudo vi /etc/systemd/system/varnish.service.d/customexec.conf

customexec.conf 파일의 내용으로는 아래 내용을 넣어주고 저장해줍니다.

[Service]
ExecStart=
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :8080 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m

이 파일에서는 Varnish 설정의 Service 섹션을 수정해주고 있는데, 첫 줄에서는 기존의 값을 제거해주고 있고 그런 다음 다시 새로운 값을 지정해주고 있습니다.

위에서 ExecStart에 지정된 명령어는 결국 /usr/sbin/varnishd 라는 binary 파일을 실행한다는 것을 의미하고, 각 옵션의 의미로는 아래와 같습니다.

  • -j : 사용할 jailing 메커니즘을 지정합니다. ubuntu 계열 시스템이면 보통 위의 값을 기본값으로 사용한다고 합니다.
  • -F : 서버가 foreground에서 돌아갈 것인지 지정합니다.
  • -a : 클라이언트의 연결을 허용할 IP주소와 포트를 지정합니다. IP를 생략하면 모든 IP로부터 받겠다는 의미고, 위에서는 8080포트를 설정해주었습니다.
  • -T : 관리 인터페이스의 IP주소와 포트번호를 지정합니다.
  • -f : Varnish 설정 파일인 VCL 파일의 경로를 지정합니다.
  • -S : 관리 인터페이스에 접근할 때 사용되는 shared secret 파일의 경로를 지정합니다. /etc/varnish/secret 경로는 ubuntu 계열 시스템에서는 기본값으로 사용된다고 합니다. 본 포스팅에서는 별도로 다루지 않습니다.
  • -s : 요소들을 어떻게 저장할 것인지 지정합니다. 명령어에 보이는 malloc,256m 은 기본값입니다. Varnish의 요소들을 malloc 시스템콜을 이용해서 메모리에 저장할 것이고 최대 256 메가바이트만큼 사용해서 저장할 것임을 지정한 것입니다. malloc 함수가 사용 불가하다면, 파일 시스템을 사용해서 저장할 수도 있습니다.

위 설정파일을 이제 저장하고 닫아준 다음, systemd 서비스 파일에 정의된 데몬들을 재시작해줍니다. 그리고 이후에 Varnish 도 수정된 사항들을 반영할 수 있도록 재시작해줍니다.

$ sudo systemctl daemon-reload
$ sudo systemctl restart varnish

 

이제 Varnish 가 정확히 8080 포트를 리스닝하고 있는지 netstat 명령을 통해서 확인해봅니다.

$ sudo netstat -ltnp | grep 8080

그럼 아래와 같은 결과를 확인할 수 있습니다.

이제 Varnish가 동작하고 있고 8080포트로 리스닝하고 있다는 것을 확인했으니깐, 이제 /etc/varnish/default.vcl 설정파일을 수정해보겠습니다.

$ sudo vi /etc/varnish/default.vcl

backend default 블록 부분의 port 를 80 으로 변경해줍니다.

이제 정책 설정 파일을 변경해주었으니깐 다시 varnish를 restart해줍니다.

$ sudo systemctl restart varnish

이제 오류 없이 잘 됐다면, http://아이피주소:8080 으로 브라우저로 접속해봅니다. 그리고 Apache static 사이트가 Varnish를 통해서 잘 나오는지 확인해봅시다.

이렇게 되면 이제 Apache 가 80번 포트로 리스닝하고 있고, Varnish 가 8080번 포트로 리스닝하고 있는 환경이 만들어집니다. 이제 아까 위에서 언급했던 wrk 라는 HTTP benchmark 도구로 각각 일반적인 Apache 웹서버와 Varnish를 적용한 웹서버의 성능을 평가해볼 수 있겠습니다.

 

Step 3 - wrk 도구로 Varnish 테스트해보기

wrk 는 HTTP 성능 평가 도구입니다. C언어로 작성된 도구이고, 웹서버를 짧은 시간 내에 수많은 요청을 보내도록 해서 테스트 해봅니다. 이번에는 Varnish 와 Apache 서버를 각각 성능 평가를 진행해보고 결과를 보도록 하겠습니다.

 

우선 wrk 도구를 설치해야합니다. 우선 그러기 위해서 C언어 빌드 도구랑 git 도구를 설치해줍니다.

$ sudo apt-get install build-essential libssl-dev git unzip -y

그러고 나서 이제 git 명령어로 레포지토리를 클로닝 해줍니다.

$ git clone https://github.com/wg/wrk.git wrk

그리고 디렉토리를 변경해줍니다.

$ cd wrk

그리고 wrk 실행 파일을 만들기 위해서 make 명령어로 빌드해줍니다.

$ make

wrk 실행 파일을 /usr/local/bin 디렉토리에 넣어줘서 어떤 디렉토리에서도 실행할 수 있게 해줍니다.

$ sudo cp wrk /usr/local/bin

이제 완전히 wrk 가 설치되었습니다. 이제부터는 Apache 의 성능을 평가 해보기 위해서 아래 명령을 실행해줍니다.

$ wrk -t2 -c1000 -d30s --latency http://아이피주소/

위 명령어는 아래의 인자들을 사용했습니다.

  • -t2 : 2개의 쓰레드로 동작하라는 것입니다.
  • -c1000 : 계속해서 1000 HTTP 연결을 열고 있으라는 것입니다.
  • -d30s : 30초동안 테스트를 실행하라는 것입니다.
  • —latency : latency 통계 결과를 출력하라는 것입니다.

이제 테스트가 끝날 때까지 30초를 기다립니다. 그러면 아래와 같은 결과를 보실 수 있습니다.

이번 테스트에서는 평균 지연 속도(average latency)가 11.54ms 가 걸렸고, 총 535945 개의 요청이 있었고, timeout 오류가 5036 개나 있었다는 것을 알 수 있습니다.

 

이제는 Varnish 서버를 테스트 해보기 위해서 아래 명령어를 실행해줍니다.

$ wrk -t2 -c1000 -d30s --latency http://아이피주소:8080/

똑같이 30초 기다린 뒤에 결과를 보면 아래와 같습니다.

결과를 보면 아까와는 조금 다른 것을 보실 수 있습니다. 지연 속도(latency)가 Apache 서버에 했을 때보다 낮아졌음을 알 수 있습니다. 평균 지연속도(average latency)가 5.39ms고, 총 HTTP 요청 수가 635256 개로 아까보다 동일한 시간동안 더 많은 횟수임을 알 수 있고, timeout 오류도 117개로 대폭 줄어든 것을 볼 수 있습니다.

 

위와 같이 테스트 해봄으로써 알 수 있는 것으로는 Varnish Cache를 적용한 웹 서버의 경우 서비스 측면의 가용성이 대폭 보장된 것을 확인할 수 있었습니다. 또 이번 포스팅에서 테스트한 것은 Apache 웹의 정적 사이트를 대상으로 테스트해본 것이므로 실제 환경에서는 캐시 정책 설정을 어떻게 했는지에 따라 많이 달라질 수 있음에 유의해주세요.

 

Varnish 에 대한 더 자세한 설명이 필요하신 분은 공식문서를 참고해주세요.

https://varnish-cache.org/docs/#

 

Varnish Documentation — Varnish HTTP Cache

 

varnish-cache.org

 

728x90
반응형
댓글