Co to jest Varnish Cache: instalacja i podstawowa konfiguracja Varnish Cache Server

Środowisko testowe Rodzina RHELAlmaLinux 9.8konto rootSprawdzono 2026-10-16

Varnish Cache to pamięć podręczna typu reverse proxy, która przed serwerem WWW przechowuje odpowiedzi HTTP w pamięci i odpowiada na te same żądania bez udziału serwera źródłowego. Gdy umieściliśmy Varnish 6.6.2 przed WordPressem na serwerze AlmaLinux 9.8, strony nie trafiały do pamięci podręcznej z powodu max-age=0; rozwiązaliśmy to, ustawiając czas przechowywania w VCL.

To, które żądania trafiają do pamięci podręcznej i jak długo są przechowywane, zapisujesz w pliku VCL (Varnish Configuration Language).

1️⃣ Koncepcja Varnish Cache: pamięć podręczna reverse proxy

Przy każdym żądaniu Varnish najpierw sprawdza, czy ma zapisaną odpowiedź. Jeśli odpowiada zapisaną odpowiedzią, jest to trafienie w pamięci podręcznej (HIT); jeśli musi pobrać odpowiedź z serwera źródłowego (backendu), jest to chybienie (MISS). Odpowiedź pobrana przy chybieniu jest przechowywana przez czas przechowywania i używana przy kolejnych żądaniach.

Varnish w wersji open source nie obsługuje TLS, więc nie może bezpośrednio przyjmować żądań HTTPS. Na porcie 443 TLS obsługuje Nginx lub HAProxy, a potem przekazuje żądanie do Varnisha.

Projekt open source Varnish Cache od wersji 9.0, wydanej w marcu 2026 roku, zmienił nazwę na Vinyl Cache. Nazwy Varnish Cache nadal używa wersja, którą Varnish Software rozpowszechnia z dodanymi funkcjami TLS.

2️⃣ Instalacja Varnish Cache Server

W AlmaLinux 9 instalujesz go pakietem varnish z domyślnego repozytorium (AppStream), a wersja tego pakietu to Varnish 6.6.2 sprzed zmiany nazwy.

dnf -y install varnish

Po zakończeniu instalacji sprawdź wersję poleceniem [varnishd -V].

varnishd -V
varnishd (varnish-6.6.2 revision 17c51b08e037fc8533fb3687a042a867235fc72f)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2020 Varnish Software

Pakiety z rodziny RHEL zostawiają wersję 6.6.2, której wsparcie w projekcie już się skończyło, i rozpowszechniają ją tylko z dodanymi poprawkami bezpieczeństwa. Pakiet 6.6.2-7 wydany w czerwcu 2025 roku zawiera poprawkę luki typu HTTP request smuggling (CVE-2025-47905).

Instalacja tworzy też [/etc/varnish/default.vcl] i [/usr/lib/systemd/system/varnish.service].

grep ExecStart= /usr/lib/systemd/system/varnish.service
ExecStart=/usr/sbin/varnishd -a :6081 -f /etc/varnish/default.vcl -s malloc,256m

[-a :6081] określa port przyjmujący żądania, a [-s malloc,256m] 256MB pamięci używanej jako miejsce na pamięć podręczną.

3️⃣ Podstawowa konfiguracja: backend i port

W domyślnym pliku VCL [/etc/varnish/default.vcl] od początku jako backend ustawiony jest port 8080 tego samego serwera.

vcl 4.1;

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

W Apache zmień wartość [Listen] w [httpd.conf] na 8080, aby przyjmował żądania przekazywane przez Varnisha.

# /etc/httpd/conf/httpd.conf
Listen 8080

W witrynach korzystających z HTTPS zostaw Varnisha na porcie 6081 i połącz Nginx, który obsługuje TLS, tak aby przekazywał żądania do Varnisha.

Układ, w którym Varnish przyjmuje żądania bezpośrednio na porcie 80, pasuje do witryn korzystających tylko z HTTP. W takim przypadku utwórz kopię pliku usługi zgodnie z dokumentacją instalacji Varnish Software i zmień w wierszu [ExecStart] 6081 na 80.

systemctl edit --full varnish

Kopia zapisana w edytorze powstaje w [/etc/systemd/system/varnish.service], a zmieniony port zostaje nawet po aktualizacji pakietu.

systemctl enable --now varnish

Niezależnie od wybranego układu na koniec poleceniem enable z opcją now zarejestruj automatyczne uruchamianie przy starcie systemu i od razu uruchom Varnisha.

4️⃣ Sprawdzenie działania: nagłówki X-Varnish i Age

Po uruchomieniu Varnisha sprawdź w nagłówkach odpowiedzi, czy strony WordPressa naprawdę pochodzą z pamięci podręcznej. Żądanie trafia bezpośrednio na port 6081 Varnisha, z pominięciem Nginx, dlatego domenę i informację o HTTPS podajesz w nagłówkach [Host] i [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] to numer, który Varnish nadaje żądaniu, a [Via: 1.1 varnish] oznacza, że odpowiedź przeszła przez Varnisha. [Age] to czas (w sekundach), jaki upłynął od zapisania odpowiedzi w pamięci podręcznej.

Nawet po ponownym wysłaniu tego samego żądania 3 sekundy później [X-Varnish] miał jeden numer, a [Age] wynosił 0, więc znowu odpowiedział serwer źródłowy. Reguła, którą wtyczka cache dodała do [.htaccess], dokleja do HTML [max-age=0], przez co domyślna konfiguracja Varnisha wyliczyła czas przechowywania na 0 sekund.

Żądania z ciasteczkami w domyślnej konfiguracji także omijają pamięć podręczną. Dotyczy to również ciasteczek narzędzi analitycznych, więc wszystkie żądania odwiedzających z takimi ciasteczkami trafiają do serwera źródłowego.

Poniższy VCL przekazuje do serwera źródłowego żądania logowania i panelu administracyjnego oraz żądania inne niż GET i HEAD, a pozostałe żądania zapisuje w pamięci podręcznej po usunięciu ciasteczek. Odpowiedzi z czasem przechowywania 0 sekund, które nie tworzą ciasteczek, są przechowywane przez 10 minut, a odpowiedzi z zakazem przechowywania, takie jak [no-cache], nie są zapisywane.

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;
    }
}

Po zmianie pliku VCL wczytaj go ponownie poleceniem [systemctl reload varnish]. Poniżej druga z dwóch odpowiedzi uzyskanych po dwukrotnym wysłaniu tego samego żądania do Varnisha z tym VCL.

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)

Drugie żądanie, wysłane 3 sekundy po zastosowaniu VCL, miało dwa numery w [X-Varnish], a [Age] wynosił 3. Dwa numery oznaczają odpowiedź z pamięci podręcznej, a drugi numer należy do żądania, które pobrało stronę z serwera źródłowego i ją zapisało.

Żądanie z ciasteczkiem logowania dostało jeden numer i odpowiedział na nie serwer źródłowy, a żądanie tylko z ciasteczkiem narzędzia analitycznego otrzymało odpowiedź z pamięci podręcznej.

🔢 FAQ & polecane treści

Jeśli ustawisz w VCL czas przechowywania na 10 minut, przez te 10 minut wyświetlana jest zapisana w pamięci podręcznej strona sprzed edycji. Aby czyścić pamięć podręczną od razu po zapisaniu wpisu, potrzebujesz reguły VCL obsługującej żądania PURGE i wtyczki, takiej jak Proxy Cache Purge. W VCL ogranicz żądania PURGE tak, aby przyjmować tylko te wysłane z tego samego serwera.

Jeśli serwer WWW wysyła pliki HTML utworzone przez wtyczkę cache bezpośrednio, bez PHP, Varnish wykonuje tę samą pracę jeszcze raz. Jeśli strony z pamięci podręcznej też przechodzą przez PHP, Varnish odpowiada przed nim i ogranicza wykonywanie PHP.

Witryna może używać Varnisha, nawet jeśli nagłówka nie widać, bo administratorzy serwerów czasem zmieniają nazwy nagłówków odpowiedzi albo je usuwają. Na serwerze Cloudways z włączonym Varnishem odpowiedzi WordPressa miały zamiast [X-Varnish] nagłówki [x-cache: HIT] i [age].

ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 0   +   3   =