Miscellaneous

Varnish Cache 설치

1103동103호·2018년 2월 10일·조회 3,259

1. 개요

Varnish Cache를 설치하고 기본 백엔드 및 데몬 실행 옵션을 설정한다. Varnish는 웹 서버 앞단에서 동작하는 HTTP 캐시 서버이므로, 설치 후에는 Varnish가 받을 포트와 실제 요청을 전달할 Back-end 서버 정보를 맞춰 주어야 한다.


2. 환경

우분투 리눅스 환경이다. 아래 설치 로그는 apt 저장소에서 제공되는 Varnish 패키지를 설치했을 때의 예시이며, 우분투 버전과 저장소 상태에 따라 패키지 버전이나 의존성 목록은 달라질 수 있다.


3. 설치

3-1. apt-get update

$ sudo apt-get update

3-2. apt-get install

$ sudo apt-get install varnish
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  binutils cpp cpp-5 gcc gcc-5 gcc-5-base libasan2 libatomic1 libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libgcc-5-dev libgomp1 libisl15 libitm1 libjemalloc1 liblsan0 libmpc3 libmpx0 libquadmath0
  libstdc++6 libtsan0 libubsan0 libvarnishapi1 linux-libc-dev manpages-dev
Suggested packages:
  binutils-doc cpp-doc gcc-5-locales gcc-multilib make autoconf automake libtool flex bison gdb gcc-doc gcc-5-multilib gcc-5-doc libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg libasan2-dbg
  liblsan0-dbg libtsan0-dbg libubsan0-dbg libcilkrts5-dbg libmpx0-dbg libquadmath0-dbg glibc-doc varnish-doc
The following NEW packages will be installed:
  binutils cpp cpp-5 gcc gcc-5 libasan2 libatomic1 libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libgcc-5-dev libgomp1 libisl15 libitm1 libjemalloc1 liblsan0 libmpc3 libmpx0 libquadmath0 libtsan0 libubsan0
  libvarnishapi1 linux-libc-dev manpages-dev varnish
The following packages will be upgraded:
  gcc-5-base libstdc++6
2 upgraded, 26 newly installed, 0 to remove and 22 not upgraded.
Need to get 28.6 MB of archives.
After this operation, 102 MB of additional disk space will be used.
Do you want to continue? [Y/n]

진행하면 설치가 수행된다.

Setting up libvarnishapi1 (4.1.1-1ubuntu0.2) ...
Setting up manpages-dev (4.04-2) ...
Setting up libjemalloc1 (3.6.0-9ubuntu1) ...
Setting up varnish (4.1.1-1ubuntu0.2) ...
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Processing triggers for systemd (229-4ubuntu21) ...
Processing triggers for ureadahead (0.100.0-19) ...

설치 후에는 서비스가 정상적으로 올라왔는지 먼저 확인하는 것이 좋다.

$ sudo service varnish status

4. Back-end 설정

4-1. 파일

/etc/varnish/default.vcl

4-2. 설정

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

위 부분을 실제 Back-end 서버 정보로 변경한다. 예를 들어 웹 서버가 같은 서버의 8080 포트에서 동작한다면 위 설정을 그대로 사용할 수 있고, 다른 서버나 다른 포트에서 동작한다면 .host.port 값을 해당 환경에 맞게 바꾼다.

설정한 Back-end 서버는 Varnish가 요청을 전달할 대상이므로, Varnish를 재시작하기 전에 해당 서버가 실행 중인지와 포트를 정상적으로 바인딩하고 있는지 확인한다.


5. Daemon 설정

5-1. 파일

  • /etc/default/varnish
  • /lib/systemd/system/varnish.service

systemd 환경에서는 실제 실행 옵션이 varnish.serviceExecStart에 의해 결정될 수 있다. 따라서 포트를 변경할 때는 아래 두 파일의 설정이 서로 다르게 남아 있지 않은지 함께 확인한다.

5-2. /etc/default/varnish 파일 설정

DAEMON_OPTS="-a :6081 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

-a 부분의 포트를 변경한다. 이 포트가 클라이언트가 접속할 Varnish의 HTTP 포트이다.

5-3. /lib/systemd/system/varnish.service 파일 설정

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

-a 부분의 포트를 변경한다. 예를 들어 Varnish를 80 포트에서 받게 하려면 이 값을 환경에 맞게 수정한다. 단, 80 포트를 사용하려면 기존 웹 서버가 같은 포트를 사용하고 있지 않아야 한다.

5-4. 반영

$ sudo systemctl daemon-reload
$ sudo service varnish restart

재시작 후에는 포트가 의도한 값으로 열렸는지, 그리고 Varnish를 통해 Back-end 응답을 받을 수 있는지 확인한다.

$ curl -I http://127.0.0.1:6081/

6. 오류

6-1. 503

Error 503 Backend fetch failed
Backend fetch failed

Guru Meditation:
XID: 32773
  • Back-end 서버가 기동되어 있는지, 정상적으로 포트를 바인딩하고 있는지 확인한다.
  • /etc/varnish/default.vcl.host, .port 값이 실제 Back-end 주소와 일치하는지 확인한다.
  • Back-end가 로컬 서버가 아니라면 방화벽, 보안 그룹, 접근 제어 설정으로 인해 Varnish 서버에서 접속이 차단되지 않는지도 확인한다.

6-2. ERR_CONNECTION_CLOSED

사이트에 연결할 수 없음
*** 와(과)의 연결이 예기치 않게 종료되었습니다.
  • Back-end(Apache HTTP Server)의 Access log에도 Varnish가 접속한 로그가 존재한다.
  • 확인 결과 302로 처리되고 있었고, 추가 확인 결과 http -> https로 리다이렉트 처리되고 있었다. http -> https 리다이렉트를 제거하여 정상 처리되었다.

이처럼 Varnish 자체의 연결 문제처럼 보이더라도 실제 원인은 Back-end의 리다이렉트, 포트 충돌, SSL 처리 방식일 수 있다. Varnish 로그와 Back-end Access log를 함께 보면 요청이 어느 지점까지 도달했는지 확인하기 쉽다.

댓글 0

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.