Ubuntu Varnish Cache 를 구축하여 웹서비스를 가속화시키기 (바니쉬 캐시)

HYEONG HWAN, MUN/ 10월 19, 2015/ 미분류/ 13 comments

https://blog.lael.be/post/2363

웹 사이트를 잘 운영하면 방문자 수가 늘어나고, 어느 순간 사이트가 급격히 느려지게 된다.

어느 순간 답답함이 느껴지고 그 답답함이 점점 커지며, 급기야 방문자의 항의 글을 보게되면 혼란에 빠지게 된다.

 

당신의 웹서비스를 가속화(튜닝) 하는 방법에는 다음의 3가지 단계가 있다.

 

1. 서버 사양 올리기.

1코어 1기가 서버를 4코어 4기가 서버로 올리는 것이다. 매우 간단하고 빠르고 쉽다.

자동차로 비유하자면 엔진을 하나 더 다는 것이다.

그런데 엔진이 무한정 달리는 것도 아니고, 엔진이 2개가 된다고 속도가 2배가 되지도 않는다. 엔진 사는데 돈이 든다.

 

2. 서버 구동 소프트웨어 최적화하기.

서버 구동 소프트웨어 설정 값을 조정하여 더 효율적으로 동작할 수 있게 한다.

자동차로 비유하자면 엔진 연비를 향상시키는 것이다.

급출발, 급정거 하지 않고 브레이크를 적게 밟으며 권장속도로 운전한다. 돈이 들지는 않지만 연비향상 방법을 알고 있어야 한다.

 

3. 웹 소프트웨어 최적화하기.

통계와 서버의 사용률, 방문자 추이를 판단하여 (서버개발자/웹관리자/엔지니어/프로그래머)가 코드레벨로 최적화를 하는 것이다.

자동차로 비유하자면 지름길로 가는 것이다.

요즘은 네비게이션이 알아서 최적의 길을 잘 안내해 준다. 그것을 사람이 한다고 생각하면 된다.

간단해 보이지만 어렵다. 도로를 다 알고 있어야 하고 이것 저것 비교해 본 후에야 “앞의 꽉막힌 도로를 기다렸다가 갈지, 멀지만 여유로운 길로 돌아갈지” 정할 수 있는 것이다.

 

오늘은 이것 중 아마 2번에 해당할 것 같은(?) 웹 캐쉬서버 Varnish의 설치와 적용에 대해서 알아보도록 하겠다.

스크린샷 2015-10-19 오전 12.02.41

<Varnish 로고>

 

Apache 웹서버를 운영 중에 사이트가 느려지면 개선 방법을 인터넷에 검색하게 되고, 거의 Nginx 로 변경을 선택 하게 된다.

 

varnish-apache-gootum

 

이 글을 통해 Apache를 Nginx로 바꾸는 일반적으로 알려진 방법 대신, Apache 앞단에 Varnish 를 두는 것을 제안해 볼까한다.

물론 CloudFlare + Varnish + Nginx 를 사용하면 매우 많은 동접을 처리할 수 있다. (대부분의 트래픽이 실제 서버까지 오지 않고 중간에 처리되어 버리기 때문.) (단점으로는 데이터의 변경이 실제 고객에게 적용되기까지 오래걸린다. 캐쉬때문.)

 

 

공식사이트는 이곳이다. (https://www.varnish-cache.org/).

 


 

설치해 보도록 하자. 설치 방법은 Ubuntu 14.04 기준으로 작성되었다. (Ubuntu 16.04 에서 설정방법이 약간 바뀌었는데 바뀐 부분도 적었다.)

서버 분리를 해도 되는데 되도록이면 Apache 가 설치된 서버에서 진행하도록 하자.

 

1. APT 목록 갱신

#apt-get update

 

2. 설치가능 패키지에 varnish 가 있는지 확인.

#apt-cache search varnish

스크린샷 2015-10-19 오전 12.20.58

varnish - state of the art, high-performance web accelerator

패키지 설명을 읽어보아라. 위엄이 느껴지지 않는가?

 

3. varnish 설치

#apt-get install varnish

설치 후 자동으로 실행된다. 부팅시마다 자동으로 실행된다.

 

4. varnish 설정

먼저 varnish 사용을 검토하도록 하자. 캐쉬서버의 장점은 속도가 매우 매우 빠르다는 것이다.

대표적인 단점은 사이트 변경사항이 즉각 반영 되지 않는다는 것이다. 약간의 딜레이가 생기게 된다.

만약 개발중인 사이트에 많은 캐쉬를 미리 적용한다면 아무리 파일을 변경해도 사이트에 적용되지 않는 놀라움을 보게 될 것이다. 디자이너나 개발자에게 고통을 안겨주고자 한다면(?) 개발사이트에 캐쉬를 왕창 사용해보도록 하자.

 

일반적으로 사용되는 캐쉬 용어 3가지를 알고 가자.

요청하고자 하는 정보가 캐쉬에 있을 경우 HIT 했다고 하고, 캐쉬에 없을 경우 MISS 했다고 말한다.

캐쉬에 있는 정보가 유효하지 않을 경우 INVALID 또는 Dirty 했다고 말한다.

이외에도 MISS PANELTY 나 BURST READ,

https://en.wikipedia.org/wiki/Average_memory_access_time 등 용어가 많은데 컴퓨터 공학도라면 알아두도록 하고, 그렇지 않으면 넘어가도록 하자.

 

varnish 는 기본적으로 6081 번 포트로 실행된다. (TCP)

 

- 백엔드 서버 설정 (연결할 실제 서버 지정)

자신(127.0.0.1)의 80 포트를 백엔드로 설정하자.

자신과 인접한 내부 아이피나, 아예 먼 곳의 외부 아이피를 적어도 된다.

#vi /etc/varnish/default.vcl

스크린샷 2015-10-19 오전 1.01.49

 

기존에 사용하던 웹서버 도메인 + 6081 포트번호로 접속해보자.

http://blog.lael.be 로 사용했었다면, http://blog.lael.be:6081 로 접속해서 동일하게 뜨는지 이용 중 문제사항은 없는지 파악해본다.

 

5. 포트변경

아파치의 포트를 8080 으로 바꾸고

Varnish의 포트를 80 으로 바꾸고

Varnish 가 127.0.0.1:8080 컨텐츠를 Serve 하도록 설정하도록 하자.

 

- 아파치의 포트를 8080 으로 변경.

포트번호는 아무렇게나 바꿔도 된다. 8080은 Apache Tomcat 의 기본포트이니 Tomcat 을 설치한 사람은 다른 포트를 사용하기 바란다. 외부에 알려줄 필요가 없으니 51234 같이 자신만 아는 포트를 사용해도 된다.

# vi /etc/apache2/ports.conf

스크린샷 2015-10-19 오전 1.53.08

 

- 변경사항 적용

# service apache2 restart

 

- varnish 백엔드 설정 및 포트번호 변경

# vi /etc/varnish/default.vcl

스크린샷 2015-10-19 오전 1.56.44

 

# vi /etc/default/varnish

스크린샷 2015-10-19 오전 1.57.48

이 값을 찾아서 6081 을 80 으로 바꾸도록 하자.

스크린샷 2015-10-19 오전 1.58.27

 

==

Ubuntu 16.04 LTS 일 경우 한 곳을 더 바꾸어주어야 한다.

# vi /lib/systemd/system/varnish.service

s05

-a :80 으로 바꾸어주면 된다.

 

Ubuntu 16.04 LTS 일 경우 위의 수정이 끝났으면 아래의 명령어로 적용시켜 주어야 한다. (또는 재부팅하면 됨)

# systemctl daemon-reload

==

 

# service varnish restart

 


설정 값 변경.

예를들어 쇼핑몰에서 캐쉬로 인하여, 장바구니가 쉽게 비워지지 않는 현상이 일어날 수 있다.

# vi /etc/varnish/default.vcl

파일에 보면 이것저것 설정을 할 수 있는데, 원활한 사용을 위해서 반드시 기본 설정 이외에 추가 설정을 해야 할 것이다.

 

- 워드프레스를 위한 권장 vcl 설정 값은 다음과 같다.

https://www.varnish-cache.org/trac/wiki/VCLExampleTemplateWordpressPurge

 

- 드루팔을 위한 권장 vcl 설정 값을 다음과 같다.

https://fourkitchens.atlassian.net/wiki/display/TECH/Configure+Varnish+3+for+Drupal+7

 

13 Comments

  1. 와우…감사합니다.

  2. 몇일간 끙끙대다 결국 이 곳에 질문을 드려 봅니다.

    한 서버에 nginx와 varnish를 설치 후 varnish는 80포트로 nginx는 8080포트로 설정한 뒤

    도메인을 통해 접근을 하면 처음에는 A.com처럼 잘 동작하나

    메뉴나 로고를 누르면 A.com:8080 처럼 나오는 현상이 있는데

    이 부분을 해결할 수 있는 방법이 뭐가 있을지 좀 알려주실 수 있으실까요?

    1. 생각을 한참 해보니 이런경우 처음 접근만 varnish로 하게되고
      이후 8080 포트로 직접 접근하게 되는거 같은데…

      vcl 설정을 해줘야 하는걸까요?

      1. 문제상황을 재현하고, 해결한 후에 답변 드릴 수 있을 것 같습니다.
        제가 업무중이라 저녁쯤에 답변드리겠습니다.

        1. 답변 너무 감사 드립니다 ^^

          1. 재현이 되지 않아 문제에 대한 답변을 할 수 없었습니다.
            혹시 워드프레스 같은 full path 를 직접만드는 소프트웨어를 사용하신다면 그 소프트웨어의 설정페이지에서 값을 바꾸어 주어야 합니다.

  3. vanish 도입을 하려고 하는데, 자체 개발은 어렵고 외부인력을 통해서 도입을 하고 싶은데 관련해서 개발 가능한 업체가 있을가요? 도움 부탁 드립니다.

    1. 가이드나 대행은 해드릴수 있으나 업체는 잘 몰라서 소개할 수는 없습니다.

  4. nginx는 포트번호를 conf 파일에서 변경하면 되는가요?

  5. nginx도 사용법좀 적어주시면 감사하겠습니다..

    1. nginx 는 varnish 를 적용할 필요가 없습니다.
      nginx 내에 varnish 같은 모드가 있습니다. 관련 글은 추후 작성해보겠습니다.

  6. nginx 세팅을 하던도중..varnish 포트를 80으로 하고 /etc/nginx/sites-enabled/default 에서 listen 8080 하면 되나요? 저는 ssl 사용해서 포트가 433인데..어캐 해야할지..ㅠ

    1. 찾아봤는데 varnish 는 http 가속화툴이고 https 를 지원하지 않는다고 하는군요.
      nginx -> varnish -> nginx 로 구성하라는 글이 많네요.
      https://komelin.com/articles/https-varnish/
      https://www.section.io/blog/varnish-cache-https/

HYEONG HWAN, MUN에 답글 남기기 응답 취소

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*