Varnish Cache란 무엇인가: Varnish Cache Server 설치 및 기본 설정

Varnish Cache는 웹 서버 앞에서 HTTP 응답을 메모리에 저장해 두었다가, 같은 요청에는 원본 서버를 거치지 않고 응답하는 리버스 프록시 캐시입니다. AlmaLinux 9.8 서버의 Varnish 6.6.2를 워드프레스 앞에 두자 max-age=0 때문에 페이지가 캐시되지 않아, VCL에서 보관 시간을 지정해 해결했습니다.
어떤 요청을 캐시하고 얼마 동안 보관할지는 VCL(Varnish Configuration Language) 파일에 작성합니다.
1️⃣ Varnish Cache 개념: 리버스 프록시 캐시
Varnish는 요청마다 저장된 응답이 있는지 먼저 확인합니다. 저장된 응답으로 처리하면 캐시 적중(HIT)이고, 원본 서버(백엔드)에서 받아 와야 하면 캐시 미스(MISS)입니다. 미스로 받아 온 응답은 보관 시간 동안 저장해 두고 다음 요청에 사용합니다.
오픈소스 Varnish는 TLS를 지원하지 않아 HTTPS 요청을 직접 받지 못합니다. 443 포트에서는 Nginx나 HAProxy가 TLS를 처리한 뒤 Varnish로 요청을 넘깁니다.
오픈소스 Varnish Cache 프로젝트는 2026년 3월에 나온 9.0 버전부터 이름을 Vinyl Cache로 바꾸었습니다. Varnish Cache라는 이름은 Varnish Software가 TLS 기능을 더해 배포하는 버전이 이어서 사용합니다.
2️⃣ Varnish Cache Server 설치
AlmaLinux 9에서는 기본 저장소(AppStream)의 varnish 패키지로 설치하며, 이 패키지의 버전은 이름이 바뀌기 전의 Varnish 6.6.2입니다.
dnf -y install varnish설치가 끝나면 [varnishd -V]로 버전을 확인합니다.
varnishd -Vvarnishd (varnish-6.6.2 revision 17c51b08e037fc8533fb3687a042a867235fc72f)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2020 Varnish SoftwareRHEL 계열 패키지는 개발 프로젝트의 지원이 끝난 6.6.2 버전을 그대로 두고, 보안 수정만 더해 배포합니다. 2025년 6월에 나온 6.6.2-7 패키지에는 HTTP 요청 스머글링 취약점(CVE-2025-47905) 수정이 들어 있습니다.
설치하면 [/etc/varnish/default.vcl]과 [/usr/lib/systemd/system/varnish.service]가 함께 생성됩니다.
grep ExecStart= /usr/lib/systemd/system/varnish.serviceExecStart=/usr/sbin/varnishd -a :6081 -f /etc/varnish/default.vcl -s malloc,256m[-a :6081]은 요청을 받을 포트, [-s malloc,256m]은 캐시 저장 공간으로 사용할 메모리 256MB를 지정합니다.
3️⃣ 기본 설정: 백엔드와 포트
기본 VCL 파일인 [/etc/varnish/default.vcl]에는 처음부터 같은 서버의 8080 포트가 백엔드로 설정되어 있습니다.
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "8080";
}Apache는 [httpd.conf]의 [Listen] 값을 8080으로 바꿔 Varnish가 넘긴 요청을 받도록 설정합니다.
# /etc/httpd/conf/httpd.conf
Listen 8080HTTPS를 사용하는 사이트는 Varnish를 6081 포트에 그대로 두고, TLS를 처리하는 Nginx가 Varnish로 요청을 넘기도록 연결합니다.
Varnish가 80 포트에서 직접 요청을 받는 구성은 HTTP만 사용하는 사이트에 맞습니다. 이때는 Varnish Software 설치 문서대로 서비스 파일 사본을 만들어 [ExecStart] 줄의 6081을 80으로 바꿉니다.
systemctl edit --full varnish편집기에서 저장한 사본은 [/etc/systemd/system/varnish.service]에 생성되며, 패키지를 업데이트해도 바꾼 포트가 유지됩니다.
systemctl enable --now varnish어느 쪽으로 구성하든 마지막에 enable 명령과 now 옵션으로 부팅 시 자동 시작을 등록하면서 Varnish를 바로 실행합니다.
4️⃣ 동작 확인: X-Varnish와 Age 헤더
Varnish를 실행한 뒤에는 워드프레스 페이지가 실제로 캐시에서 나오는지 응답 헤더로 확인합니다. 요청은 Nginx를 거치지 않고 Varnish의 6081 포트로 보내므로, 도메인과 HTTPS 여부는 [Host]와 [X-Forwarded-Proto] 헤더로 넣습니다.
curl -sI -H "Host: example.com" -H "X-Forwarded-Proto: https" http://127.0.0.1:6081/ | grep -iE "^(HTTP|cache-control|x-varnish|age|via)"HTTP/1.1 200 OK
Cache-Control: max-age=0
X-Varnish: 1001
Age: 0
Via: 1.1 varnish (Varnish/6.6)[X-Varnish]는 Varnish가 요청에 붙인 번호이고, [Via: 1.1 varnish]는 응답이 Varnish를 거쳤다는 표시입니다. [Age]는 응답이 캐시에 저장된 뒤 지난 시간(초)입니다.
3초 뒤 같은 요청을 다시 보내도 [X-Varnish] 번호는 하나, [Age]는 0으로 이번에도 원본 서버가 응답했습니다. 캐시 플러그인이 [.htaccess]에 넣은 규칙이 HTML에 [max-age=0]을 붙여, Varnish 기본 설정이 보관 시간을 0초로 계산했기 때문입니다.
쿠키가 붙은 요청도 기본 설정에서는 캐시를 거치지 않습니다. 방문 분석 도구의 쿠키도 마찬가지라, 이런 쿠키를 가진 방문자의 요청은 모두 원본 서버로 넘어갑니다.
아래 VCL은 로그인·관리자 요청과 GET이나 HEAD가 아닌 요청을 원본 서버로 넘기고, 나머지 요청은 쿠키를 제거한 뒤 캐시합니다. 보관 시간이 0초이면서 쿠키를 만들지 않는 응답은 10분 동안 저장하며, [no-cache]처럼 저장하지 말라는 응답은 저장하지 않습니다.
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "8080";
}
sub vcl_recv {
if (req.method != "GET" && req.method != "HEAD") {
return (pass);
}
if (req.url ~ "^/(wp-admin|wp-login\.php)" || req.http.Cookie ~ "wordpress_logged_in_|wp-postpass_|comment_author_") {
return (pass);
}
unset req.http.Cookie;
}
sub vcl_backend_response {
if (beresp.ttl <= 0s && !beresp.http.Set-Cookie) {
set beresp.ttl = 10m;
}
}VCL 파일을 바꾸면 [systemctl reload varnish]로 다시 읽어 들입니다. 아래는 이 VCL을 적용한 Varnish에 같은 요청을 두 번 보낸 결과 가운데 두 번째 응답입니다.
curl -sI -H "Host: example.com" -H "X-Forwarded-Proto: https" http://127.0.0.1:6081/ | grep -iE "^(HTTP|cache-control|x-varnish|age|via)"HTTP/1.1 200 OK
Cache-Control: max-age=0
X-Varnish: 1004 1002
Age: 3
Via: 1.1 varnish (Varnish/6.6)VCL을 적용하고 3초 뒤 보낸 두 번째 요청은 [X-Varnish] 번호가 두 개였고 [Age]는 3이었습니다. 번호가 두 개면 캐시에서 응답한 것이며, 뒤 번호는 그 페이지를 원본 서버에서 받아 저장한 요청의 번호입니다.
로그인 쿠키를 붙인 요청은 번호가 하나로 원본 서버에서 응답했고, 분석 도구 쿠키만 붙인 요청은 캐시에서 응답했습니다.
🔢 FAQ & 추천 콘텐츠
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.