Lewati ke isi

Server & Infrastruktur

Cara Pasang Varnish Cache di Depan Nginx

Panduan menyusun Nginx untuk HTTPS, Varnish sebagai cache, dan Nginx lagi sebagai backend di satu VPS Ubuntu, lengkap dengan VCL dasar dan cara mengujinya.

Terbit 5 menit baca

Jawaban singkat

Varnish tidak menangani HTTPS, jadi susunan yang umum adalah Nginx menerima HTTPS di port 443, meneruskan ke Varnish di port 6081, lalu Varnish mengambil halaman dari Nginx backend di port 8080. Halaman yang sudah di-cache dilayani langsung dari memori tanpa menyentuh PHP atau database.

Daftar isi
  1. Gambaran susunannya
  2. Langkah pemasangan
  3. 1. Pasang Varnish
  4. 2. Pindahkan situs Nginx ke port backend
  5. 3. Arahkan Varnish ke Nginx backend
  6. 4. Buat Nginx depan untuk HTTPS
  7. 5. Muat ulang semuanya
  8. 6. Kunci alamat dan atur ukuran memori cache
  9. 7. Uji cache
  10. Kenapa halaman tidak ter-cache walau Varnish sudah jalan?
  11. Pertanyaan yang sering diajukan

Website-mu sudah memakai Nginx, tapi halaman yang sama tetap dirender ulang oleh PHP dan database untuk setiap pengunjung? Varnish Cache bisa memotong pekerjaan itu. Ia menyimpan salinan halaman di memori dan menyajikannya langsung kepada pengunjung berikutnya.

Masalahnya, Varnish versi open source tidak menangani HTTPS. Karena itu susunan yang umum dipakai adalah "sandwich": Nginx di depan untuk HTTPS, Varnish di tengah sebagai cache, dan Nginx di belakang sebagai server web yang sebenarnya. Panduan ini memakai Ubuntu 24.04 dan paket Varnish dari repositori resminya.

Gambaran susunannya

LapisanMendengarkan diTugas
Nginx depanPort 80 dan 443 (publik)HTTPS, redirect, kompresi, meneruskan ke Varnish
Varnish127.0.0.1:6081Menyimpan dan menyajikan cache
Nginx backend127.0.0.1:8080Melayani situs, PHP-FPM, file statis

Hanya Nginx depan yang terbuka ke internet. Varnish dan Nginx backend cukup mendengarkan di 127.0.0.1.

Langkah pemasangan

1. Pasang Varnish

sudo apt update
sudo apt install varnish
systemctl status varnish

Paket Ubuntu menjalankan Varnish sebagai service systemd yang mendengarkan di port 6081 dan membaca konfigurasi dari /etc/varnish/default.vcl.

2. Pindahkan situs Nginx ke port backend

Di server block situsmu, ganti listen 80; menjadi:

listen 127.0.0.1:8080;

Semua pengaturan lain (root, PHP-FPM, location) tetap di blok ini. Jangan reload dulu sampai langkah 4 selesai, supaya situs tidak terputus. Bila kamu mengelola banyak domain, polanya sama untuk setiap server block, seperti di server block Nginx untuk banyak domain.

3. Arahkan Varnish ke Nginx backend

Buka /etc/varnish/default.vcl dan sesuaikan bagian backend:

vcl 4.1;

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

sub vcl_recv {
    if (req.url ~ "^/(wp-admin|wp-login\.php)") {
        return (pass);
    }
    if (req.url ~ "\.(css|js|png|jpg|jpeg|gif|svg|webp|woff2)(\?.*)?$") {
        unset req.http.Cookie;
    }
}

sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
}

Blok vcl_recv melewatkan halaman admin tanpa cache, dan membuang cookie dari permintaan file statis agar bisa di-cache. Blok vcl_deliver menambahkan header X-Cache untuk memudahkan pengujian. Sesuaikan path admin dengan aplikasimu.

4. Buat Nginx depan untuk HTTPS

Buat server block baru yang menerima HTTPS lalu meneruskan ke Varnish:

server {
    listen 443 ssl;
    server_name contoh.com;

    ssl_certificate     /etc/letsencrypt/live/contoh.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/contoh.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:6081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

server {
    listen 80;
    server_name contoh.com;
    return 301 https://$host$request_uri;
}

Header X-Forwarded-Proto penting agar aplikasi seperti WordPress tahu bahwa pengunjung datang lewat HTTPS. Tanpa itu, situs bisa terjebak redirect berulang.

5. Muat ulang semuanya

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl restart varnish

6. Kunci alamat dan atur ukuran memori cache

Alamat dengar Varnish ditentukan opsi -a, dan ukuran cache oleh opsi -s di perintah varnishd. Lihat perintah bawaannya dengan systemctl cat varnish. Bila tertulis -a :6081, artinya Varnish mendengarkan di semua antarmuka dan bisa dijangkau dari luar bila firewall longgar. Buat override:

sudo systemctl edit varnish

Isi dengan [Service], satu baris ExecStart= kosong untuk menghapus nilai lama, lalu salin baris ExecStart bawaan. Ubah -a :6081 menjadi -a 127.0.0.1:6081, dan ubah bagian -s malloc,... sesuai RAM yang mau kamu sisihkan. Jalankan daemon-reload dan restart Varnish. Sisakan cukup RAM untuk PHP-FPM dan database.

7. Uji cache

curl -sI https://contoh.com/ | grep -iE "x-cache|age"
curl -sI https://contoh.com/ | grep -iE "x-cache|age"

Permintaan pertama biasanya MISS, permintaan kedua HIT dengan header Age lebih dari 0. Bila selalu MISS, jalankan varnishlog -g request -q "ReqURL eq '/'" untuk melihat alasannya. Penyebab paling umum adalah cookie.

Kenapa halaman tidak ter-cache walau Varnish sudah jalan?

Perilaku bawaan Varnish cukup hati-hati. Menurut built-in VCL, permintaan yang membawa header Cookie atau Authorization tidak diambil dari cache, hanya metode GET dan HEAD yang di-cache, dan respons yang mengirim Set-Cookie tidak disimpan. Banyak CMS mengirim cookie di setiap halaman, sehingga tanpa penyesuaian VCL hampir tidak ada yang di-cache.

Solusinya bukan membuang semua cookie, karena itu bisa membuat pengguna yang login melihat halaman orang lain. Buang cookie hanya untuk path yang memang publik, dan biarkan halaman keranjang, akun, dan admin selalu pass. Untuk WordPress yang sederhana, alternatif seperti FastCGI cache di Nginx sering lebih mudah dirawat daripada menambah satu lapisan lagi.

Pertanyaan yang sering diajukan

Apakah Varnish bisa langsung melayani HTTPS?

Varnish Cache open source tidak menangani TLS. Karena itu dibutuhkan terminator TLS di depannya, seperti Nginx, HAProxy, atau Hitch.

Bagaimana menghapus cache setelah konten diperbarui?

Cara cepatnya varnishadm "ban req.url ~ ^/" untuk mengosongkan semua, atau batasi ke path tertentu. Untuk otomatis, aplikasi bisa mengirim permintaan PURGE yang diizinkan di VCL dari alamat tertentu saja.

Berapa lama halaman disimpan di cache?

Varnish mengikuti header Cache-Control dan Expires dari backend. Bila tidak ada, Varnish memakai TTL bawaan yang diatur parameter default_ttl. Atur header cache di aplikasi atau Nginx backend agar lamanya sesuai kebutuhan.

Apakah Varnish masih berguna kalau sudah pakai CDN?

Bisa, tapi manfaatnya berkurang bila CDN sudah meng-cache halaman HTML. Varnish lebih terasa untuk situs yang HTML-nya tidak di-cache CDN atau butuh logika cache yang rumit.

Bagaimana memantau kinerja Varnish?

Pakai varnishstat untuk melihat rasio hit dan miss, dan varnishncsa untuk log akses ala web server. Rasio hit yang rendah biasanya tanda VCL perlu disesuaikan.

Checklist akhir:

  • Nginx backend hanya mendengarkan di 127.0.0.1:8080.
  • Varnish backend menunjuk ke port 8080 dan berjalan di 6081.
  • Nginx depan meneruskan Host dan X-Forwarded-Proto.
  • Permintaan kedua menghasilkan X-Cache: HIT.
  • Halaman login, akun, dan keranjang tidak pernah di-cache.

Sumber & referensi

Baca juga