Apache&Nginx에 Varnish Cache 설치 및 설정

ℹ️이 콘텐츠에는 광고가 포함되어,판매 발생 시 수익이 발생합니다.(네이버 쇼핑 커넥트, 아마존 어필리에이트, 애드센스 등)

기존 Apache와 Nginx 조합의 서버에 Varnish Cache를 추가로 설치하고 적용 해 보도록 하겠습니다. Nginx에 Varnish Cache를 추가로 설정하는 작업이기 때문에 기존의 서버에 적용된 사항을 체크 해 보겠습니다.

AlmaLinux release 9.4 버전에 Apache/2.4.57, nginx/1.28.0 , PHP 8.3.22를 사용하기 때문에, 설치는 varnish, collectd-varnish, varnish-modules 총 3개의 모듈 설치를 진행합니다.

Varnish Cache 로고
환경 및 설치 패키지

OS: AlmaLinux 9.4
웹서버: Apache 2.4.57, Nginx 1.28.0
PHP 버전: 8.3.22
설치 패키지:
varnish (캐시 서버 본체)
collectd-varnish (Varnish 모니터링 플러그인)
varnish-modules (Varnish 기능 확장 모듈)

✅ Varnish Cache 설치

패키지

역할

설치 필요 여부

varnish

Varnish 캐시 서버 본체

필수

collectd-varnish

Varnish 모니터링 플러그인

필요 시 설치

varnish-modules

Varnish 기능 확장 모듈

필요 시 설치

php83-php-pecl-varnish

PHP에서 Varnish 직접 제어용 바인딩

PHP에서 직접 제어할 경우만 필요

php83-php-pecl-varnish의 경우는 Varnish를 HTTP 앞단 캐시 서버로만 사용할 목적이기 때문에 PHP용 Varnish 바인딩이 불필요해서 설치 진행을 하지 않았습니다.

 dnf -y install varnish collectd-varnish varnish-modules
Nginx에 Varnish Cache 설치
마지막 메타자료 만료확인(1:28:53 이전): 2025년 08월 09일 () 오후 09시 55분 14초.
종속성이 해결되었습니다.
==========================================================================================================
 꾸러미                                               구조                                       버전                                                   저장소                                         크기
==========================================================================================================
설치 중:
 collectd-varnish                                     x86_64                                     5.12.0-24.el9                                          epel                                           23 k
 varnish                                              x86_64                                     6.6.2-6.el9_6.1                                        appstream                                     1.0 M
 varnish-modules                                      x86_64                                     0.18.0-1.el9                                           appstream                                      81 k
종속 꾸러미 설치 중:
 collectd                                             x86_64                                     5.12.0-24.el9                                          epel                                          690 k
 yajl                                                 x86_64                                     2.1.0-25.el9                                           appstream                                      37 k

연결 요약
==========================================================================================================
설치  5 꾸러미

전체 내려받기 크기: 1.8 M
설치된 크기 : 5.5 M
꾸러미 내려받기 중:
......(생략)
설치되었습니다:
  collectd-5.12.0-24.el9.x86_64         collectd-varnish-5.12.0-24.el9.x86_64         varnish-6.6.2-6.el9_6.1.x86_64         varnish-modules-0.18.0-1.el9.x86_64         yajl-2.1.0-25.el9.x86_64 

✅ Apache&Nginx에 Varnish Cache 기본 설정

클라이언트 (웹 브라우저)


+------------------+
|      Nginx       |HTTPS 443 포트에서 SSL 사용 + HTTP/3 지원 + 리버스 프록시
| (80포트에서 HTTPS로 리디렉션)
+------------------+
        │ (HTTP 6081 포트로 요청 전달)

+------------------+
|   Varnish Cache  |HTTP 6081 포트에서 캐시
+------------------+
        │ (HTTP 8080 포트로 요청 전달)

+------------------+
|      Apache      |백엔드 웹서버 (포트 8080에서 동작)
+------------------+


+------------------+
|     PHP-FPM      |PHP 처리
+------------------+

🔲 Varnish Cache 설정 파일

1. /etc/varnish/default.vcl : 설정 파일

/etc/varnish/default.vcl 파일 설정 파일을 확인합니다.

vi /etc/varnish/default.vcl
# Default backend definition. Set this to point to your content server.
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}
sub vcl_recv {
    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
}

sub vcl_backend_response {
    # Happens after we have read the response headers from the backend.
    #
    # Here you clean the response headers, removing silly Set-Cookie headers
    # and other mistakes your backend does.
}

sub vcl_deliver {
    # Happens when we have all the pieces we need, and are about to send the
    # response to the client.
    #
    # You can do accounting or modifying the final object here.
}

서브루틴

실행 시점

주요 역할

backend default

설정 파일 로드 시

원본 서버 정의. Varnish가 캐시되지 않은 콘텐츠를 요청할 서버의 주소와 포트(127.0.0.1:8080)를 지정합니다.

sub vcl_recv

클라이언트 요청 수신 시

요청 캐싱 정책 결정. 특정 요청(예: 관리자 페이지)을 캐시하지 않거나, 쿠키를 제거하는 등 캐싱을 위한 사전 처리를 합니다.

sub vcl_backend_response

백엔드 응답 수신 시

응답 캐싱 가능 여부 결정. 백엔드 서버로부터 받은 응답을 캐시할지 말지 결정합니다. 예를 들어, Set-Cookie 헤더를 제거해 캐시를 가능하게 합니다.

sub vcl_deliver

클라이언트에 응답 전송 직전

최종 응답 수정 및 마무리. Varnish 관련 헤더(X-Varnish, Age)를 추가하거나 수정하는 등 응답을 최종적으로 정리합니다.

2. varnish.service

기본 원본 파일은 /usr/lib/systemd/system/varnish.service에 있으며, Varnish의 실행 환경 및 옵션을 정의하는 시스템 설정 파일입니다. 이 파일을 수정하면 Varnish가 어떤 포트에서 리스닝할지, 어떤 VCL 파일을 사용할지, 그리고 메모리 사용량은 어떻게 할지 등을 제어할 수 있습니다.

[Unit]
Description=Varnish Cache, a high-performance HTTP accelerator
After=network-online.target

[Service]
Type=forking
KillMode=process

# Maximum number of open files (for ulimit -n)
LimitNOFILE=131072

# Locked shared memory - should suffice to lock the shared memory log
# (varnishd -l argument)
# Default log size is 80MB vsl + 1M vsm + header -> 82MB
# unit is bytes
LimitMEMLOCK=85983232

# Enable this to avoid "fork failed" on reload.
TasksMax=infinity

# Maximum size of the corefile.
LimitCORE=infinity

ExecStart=/usr/sbin/varnishd -a :6081 -f /etc/varnish/default.vcl -s malloc,256m
ExecReload=/usr/sbin/varnishreload

[Install]
WantedBy=multi-user.target

설정 항목

설명

ExecStart

Varnish 데몬을 실행하는 핵심 명령어입니다.<br>- -a :6081: Varnish가 6081번 포트에서 요청을 받도록 지정합니다.<br>- -f /etc/varnish/default.vcl: default.vcl 파일을 캐싱 규칙으로 사용합니다.<br>- -s malloc,256m: 캐시 저장용으로 256MB의 메모리를 할당합니다.

LimitNOFILE

Varnish 프로세스가 동시에 열 수 있는 파일의 최대 개수를 설정합니다. 대규모 트래픽 환경에서 중요합니다.

LimitMEMLOCK

Varnish가 사용할 수 있는 공유 메모리의 최대 크기를 설정합니다.

ExecReload

systemctl reload varnish 실행 시, Varnish를 재시작하지 않고 설정만 다시 로드하는 명령어입니다.

WantedBy

systemctl enable 명령어를 사용해 시스템 부팅 시 자동으로 서비스가 시작되도록 설정합니다.

3. Nginx 설정

기존 Nginx의 서버 블록 내 로케이션이 :8080이었다면 6081로 변경해 줍니다.

   location / {
        proxy_pass http://127.0.0.1:6081;

Varnish Cache를 활성화 합니다.

systemctl enable varnish
systemctl start varnish
nginx -s reload
apachectl graceful

✅ 추가 설정

varnish-modules는 기본 varnish 기능을 확장해주는 모듈 모음입니다. 설치 후에는 기본적으로 활성화만 하면 되고, 필요에 따라 VCL 파일에서 해당 모듈의 기능을 호출해 사용할 수 있습니다.

🔲 /etc/varnish/default.vcl

vcl 4.1;

# --- 백엔드 서버 정의 ---
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

# 클라이언트 요청이 들어올 때 실행되는 서브루틴
sub vcl_recv {
    # 1. 로그인, 관리자 페이지 관련 요청은 캐시하지 않고 백엔드로 바로 전달
    if (req.url ~ "(?i)/ukc_login" || req.url ~ "(?i)/wp-admin" || req.url ~ "(?i)/wp-login.php" || req.url ~ "(?i)/ghost-admin") {
        return(pass);
    }

    # 2. POST 요청도 캐시하지 않고 백엔드로 바로 전달
    if (req.method == "POST") {
        return(pass);
    }
}

# 백엔드 서버로부터 응답을 받은 후 실행되는 서브루틴
sub vcl_backend_response {
    # Set-Cookie 헤더가 있는 응답은 캐시하지 않고 전달
    if (beresp.http.Set-Cookie) {
        return(deliver);
    }

    # HTML 콘텐츠는 3시간 캐시
    if (beresp.http.Content-Type ~ "text/html") {
        set beresp.ttl = 3h;
        return(deliver);
    }

    # 정적 파일(css, js, 이미지)은 1일 캐시
    if (beresp.http.Content-Type ~ "(text/css|application/javascript|application/x-javascript|image/|font/)") {
        set beresp.ttl = 24h;
        return(deliver);
    }
}

# 클라이언트에게 응답을 전달하기 전에 실행되는 서브루틴
# 정적 콘텐츠 캐싱만 캐싱, 동적 페이지는 로그인 및 로그인 후에도 수정이 안됨
sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
}

🔲 서비스 파일 설정

cp /usr/lib/systemd/system/varnish.service /etc/systemd/system/varnish.service

명령어를 사용하여 설정 파일을 복사하는 것을 권장하는 이유는 시스템 안정성과 유지보수 편의성 때문입니다.

/usr/lib/systemd/system/ 디렉터리는 시스템 패키지 매니저(예: dnf, apt)가 설치하고 관리하는 원본 설정 파일들이 있는 곳입니다. 만약 이 파일을 직접 수정하면, Varnish가 새로운 버전으로 업데이트될 때 변경된 설정이 덮어쓰여질 수 있습니다. 이 경우, 기존에 최적화해둔 설정이 사라지게 됩니다.

반면, /etc/systemd/system/ 디렉터리는 사용자 정의 설정 파일을 두는 곳입니다. 이곳에 파일을 복사해 수정하면, 패키지 업데이트에 영향을 받지 않고 독자적으로 설정이 유지됩니다.

cp /usr/lib/systemd/system/varnish.service /etc/systemd/system/varnish.service
vi /etc/systemd/system/varnish.service
ExecStart=/usr/sbin/varnishd -a :6081 -f /etc/varnish/default.vcl -s malloc,4G
systemctl daemon-reload
systemctl restart varnish

Apache&Nginx에 Varnish Cache 설정이 완료 되었습니다.

✅ varnishstat 명령어

# 캐시의 상태를 보여줌
varnishstat
# 캐시 상태를 1번 출력
varnishstat -1 
varnishstat -1 | grep SMA
varnishstat -1 | grep MAIN.cache
MAIN.cache_hit                       173         0.06 Cache hits
MAIN.cache_hit_grace                   0         0.00 Cache grace hits
MAIN.cache_hitpass                     0         0.00 Cache hits for pass.
MAIN.cache_hitmiss                     0         0.00 Cache hits for miss.
MAIN.cache_miss                      210         0.08 Cache misses

항목

의미

설명

MAIN.cache_hit

⚡ 캐시 히트

요청이 캐시에서 바로 응답 된 횟수

MAIN.cache_hit_grace

⏳ grace 히트

TTL은 지났지만 grace 기간 내 응답된 횟수

MAIN.cache_hitmiss

🤷 hit-for-miss

miss로 처리되었지만 캐시된 횟수 (드물게 사용됨)

MAIN.cache_hitpass

🚫 pass 히트

pass 처리된 요청 중 캐시된 횟수

MAIN.cache_miss

❌ 캐시 미스

캐시에 없어서 백엔드로 간 횟수

varnishstat -1 | grep s0
MEMPOOL.sess0.live                            0          .   In use
MEMPOOL.sess0.pool                           10          .   In Pool
MEMPOOL.sess0.sz_wanted                     768          .   Size requested
MEMPOOL.sess0.sz_actual                     736          .   Size allocated
MEMPOOL.sess0.allocs                        352         0.12 Allocations
MEMPOOL.sess0.frees                         352         0.12 Frees
MEMPOOL.sess0.recycle                       352         0.12 Recycled from pool
MEMPOOL.sess0.timeout                        62         0.02 Timed out from pool
MEMPOOL.sess0.toosmall                        0         0.00 Too small to recycle
MEMPOOL.sess0.surplus                         0         0.00 Too many for pool
MEMPOOL.sess0.randry                          0         0.00 Pool ran dry

SMA.s0.c_req                                870         0.30 Allocator requests
SMA.s0.c_fail                                 0         0.00 Allocator failures
SMA.s0.c_bytes                         10277220      3548.76 Bytes allocated
SMA.s0.c_freed                          1130496       390.36 Bytes freed
SMA.s0.g_alloc                              801          .   Allocations outstanding
SMA.s0.g_bytes                          9146724          .   Bytes outstanding
SMA.s0.g_space                       4285820572          .   Bytes available

항목

설명

live

0

현재 사용 중인 세션 없음 (idle 상태)

pool

10

풀에 대기 중인 세션 객체 수

allocs / frees

352

세션 객체 할당/해제 횟수

recycle

352

재사용된 세션 객체 수 (풀 잘 작동 중) ⚡

timeout

62

풀에서 꺼내려다 시간 초과된 횟수

toosmall / surplus / randry

0

문제 없음 (풀 부족/과잉 없음) ⚡

👉 요약: 세션 풀은 안정적으로 작동 중이며, 재사용률도 높고 문제 없음.

항목

설명

c_req

870

메모리 요청 횟수

c_fail

0

메모리 할당 실패 없음 💾

c_bytes

10.27 MB

총 할당된 메모리

c_freed

1.13 MB

총 해제된 메모리

g_alloc

801

현재 살아있는 할당 수

g_bytes

9.15 MB

현재 사용 중인 메모리

g_space

4.28 GB

남은 공간 (매우 넉넉함) 💾

👉 요약: malloc 스토리지도 안정적이며, 메모리 여유 충분. 할당 실패 없음.

Similar Posts

  • Zend OPcache 개념과 설치 및 설정

    OPcache는 PHP script 를 바이트코드(bytecode)로 컴파일한 후에 공유 메모리에 저장하여 성능을 향상 시키는 모듈입니다. 서버의 성능을 향상시키는 PHP 가속기(PHP accelerators) 중 하나인 Zend Opcache 는 PHP 5.5부터 기본 모듈로 내장되었습니다. 목차✅ Varnish Cache 설치✅ Apache&Nginx에 Varnish Cache 기본 설정🔲 Varnish Cache 설정 파일✅ 추가 설정🔲 /etc/varnish/default.vcl🔲 서비스 파일 설정✅ varnishstat 명령어✅ OPcache의 주요…

  • [Linux] 리눅스 vi 명령어 정리 | Vim 3가지 모드 및 비주얼 모드

    리눅스 터미널에서 ‘.txt’, ‘.conf’ 등의 ASCII 파일을 편집하기 위해 vi 편집기 명령어를 사용합니다. vi 편집기는 명령모드 입력모드와 저장 및 종료 후 치환하는 리눅스 vi 명령어는 익숙해지면 매우 빠른 작업이 가능하기 때문에 효율적인 업무를 진행할 수 있습니다. 목차✅ Varnish Cache 설치✅ Apache&Nginx에 Varnish Cache 기본 설정🔲 Varnish Cache 설정 파일✅ 추가 설정🔲 /etc/varnish/default.vcl🔲 서비스…

  • rm 명령어

    목차✅ Varnish Cache 설치✅ Apache&Nginx에 Varnish Cache 기본 설정🔲 Varnish Cache 설정 파일✅ 추가 설정🔲 /etc/varnish/default.vcl🔲 서비스 파일 설정✅ varnishstat 명령어1. rm 명령어 ‘rm 명령어‘ 는 파일 및 디렉토리를 삭제하는 명령어이다. ‘rm 명령어’ 는 심볼릭 링크는 삭제하지만 링크의 대상 파일은 삭제하지 않는다. ls 명령어와 함께 많이 사용되는 명령어이다. rm(remove) 명령어 rm –remove 파일…

  • Syslog란 무엇인가? | rsyslog.conf 설정

    Syslog는 원래 Sendmail의 일부로 개발되었으며, 이후 로그 관리의 편리함이 인식되면서 독립적인 표준으로 발전하게 되었습니다. System Logging의 약자로, 로그를 기록하고 관리하는 표준 서비스 또는 프로토콜을 의미합니다. 메일 서버, FTP 서버 등 다양한 프로그램이 생성하는 메시지를 중앙에서 수집하여 로그 파일로 저장하고, 이를 분석할 수 있도록 지원합니다. 시스템을 효율적으로 모니터링하고, 잠재적인 문제를 신속하게 식별 및 해결하며,…

  • 리눅스와 유닉스 차이점 9가지

    리눅스를 사용하는 사람이라면 리눅스와 유닉스 차이는 무엇인지 궁금점이 한번 씩 생기게 됩니다. 간단하게 차이점을 요약하자면, 리눅스는 유닉스의 오픈 소스 구현체로, 유닉스와 유사한 운영 체제를 제공하면서도 커뮤니티 기반의 개방적인 환경을 가지고 있습니다. 둘 다 안정적이고 다목적으로 사용되는 운영 체제이지만, 유닉스는 상용 운영 체제의 역사적인 뿌리를 가지고 있고, 리눅스는 개방성과 다양성 측면에서 강점을 가지고 있습니다….

  • 리눅스 명령행 인자(Command-Line Argument)와 명령어 옵션

    ‘리눅스 명령행 인자(Command-Line Argument)‘는 ‘리눅스 명령어 인수‘, ‘명령 인자‘ 등으로도 불리며, 리눅스 커맨드 라인에서 명령어를 실행할 때 프로그램에 전달하는 매개변수를 뜻 합니다. 리눅스에서 “매개변수(Parameters)”는 일반적으로 프로그램이나 함수에 전달되는 값을 가리킵니다. 이 값은 해당 프로그램이나 함수가 실행될 때 필요한 입력 값으로 사용됩니다. 컴퓨터 프로그래밍에서 “매개변수(Parameters)”는 함수에 전달되는 값을 받아들이는 변수를 의미합니다. 이는 함수 정의에…

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Prove your humanity: 0   +   4   =