Varnish Cache คืออะไร: การติดตั้งและตั้งค่าพื้นฐาน Varnish Cache Server

สภาพแวดล้อมทดสอบ ตระกูล RHELAlmaLinux 9.8บัญชี rootตรวจเมื่อ 2026-10-16

Varnish Cache คือแคชแบบ reverse proxy ที่อยู่หน้าเว็บเซิร์ฟเวอร์ เก็บการตอบกลับ HTTP ไว้ในหน่วยความจำ แล้วตอบคำขอเดียวกันโดยไม่ผ่านเซิร์ฟเวอร์ต้นทาง เมื่อเราวาง Varnish 6.6.2 ไว้หน้า WordPress บนเซิร์ฟเวอร์ AlmaLinux 9.8 หน้าเว็บไม่ถูกแคชเพราะ max-age=0 จึงแก้ด้วยการกำหนดเวลาเก็บใน VCL

คำขอใดจะถูกแคชและเก็บไว้นานเท่าใด เขียนไว้ในไฟล์ VCL (Varnish Configuration Language)

1️⃣ แนวคิดของ Varnish Cache: แคชแบบ reverse proxy

Varnish จะตรวจก่อนทุกครั้งว่ามีการตอบกลับที่เก็บไว้หรือไม่ หากตอบด้วยการตอบกลับที่เก็บไว้ได้จะเรียกว่าแคชฮิต (HIT) หากต้องไปรับจากเซิร์ฟเวอร์ต้นทาง (แบ็กเอนด์) จะเรียกว่าแคชมิส (MISS) การตอบกลับที่รับมาตอนมิสจะถูกเก็บไว้ตามเวลาเก็บและใช้กับคำขอครั้งต่อไป

Varnish แบบโอเพนซอร์สไม่รองรับ TLS จึงรับคำขอ HTTPS โดยตรงไม่ได้ ที่พอร์ต 443 จะให้ Nginx หรือ HAProxy จัดการ TLS ก่อนแล้วจึงส่งคำขอต่อให้ Varnish

โปรเจกต์โอเพนซอร์ส Varnish Cache เปลี่ยนชื่อเป็น Vinyl Cache ตั้งแต่เวอร์ชัน 9.0 ที่ออกในเดือนมีนาคม 2026 ส่วนชื่อ Varnish Cache ยังใช้ต่อกับเวอร์ชันที่ Varnish Software เพิ่มฟีเจอร์ TLS แล้วแจกจ่าย

2️⃣ การติดตั้ง Varnish Cache Server

บน AlmaLinux 9 ติดตั้งด้วยแพ็กเกจ varnish จากรีโพสิทอรีเริ่มต้น (AppStream) และแพ็กเกจนี้เป็น Varnish 6.6.2 ซึ่งเป็นเวอร์ชันก่อนเปลี่ยนชื่อ

dnf -y install varnish

เมื่อติดตั้งเสร็จ ให้ตรวจสอบเวอร์ชันด้วย [varnishd -V]

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

แพ็กเกจตระกูล RHEL คงเวอร์ชัน 6.6.2 ที่โปรเจกต์หยุดสนับสนุนแล้วไว้ตามเดิม และแจกจ่ายโดยเพิ่มเฉพาะการแก้ไขด้านความปลอดภัย แพ็กเกจ 6.6.2-7 ที่ออกในเดือนมิถุนายน 2025 มีการแก้ช่องโหว่ HTTP request smuggling (CVE-2025-47905)

เมื่อติดตั้งแล้วจะมีไฟล์ [/etc/varnish/default.vcl] และ [/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] กำหนดพอร์ตที่รับคำขอ ส่วน [-s malloc,256m] กำหนดหน่วยความจำ 256MB ที่ใช้เป็นพื้นที่เก็บแคช

3️⃣ การตั้งค่าพื้นฐาน: แบ็กเอนด์และพอร์ต

ไฟล์ VCL เริ่มต้น [/etc/varnish/default.vcl] ตั้งพอร์ต 8080 ของเซิร์ฟเวอร์เดียวกันเป็นแบ็กเอนด์ไว้ตั้งแต่แรก

vcl 4.1;

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

สำหรับ Apache ให้เปลี่ยนค่า [Listen] ใน [httpd.conf] เป็น 8080 เพื่อรับคำขอที่ Varnish ส่งต่อมา

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

เว็บไซต์ที่ใช้ HTTPS ให้คง Varnish ไว้ที่พอร์ต 6081 แล้วเชื่อม Nginx ที่จัดการ TLS ให้ส่งคำขอต่อให้ Varnish

การให้ Varnish รับคำขอโดยตรงที่พอร์ต 80 เหมาะกับเว็บไซต์ที่ใช้ HTTP อย่างเดียว ในกรณีนี้ให้สร้างสำเนาไฟล์บริการตามเอกสารการติดตั้งของ Varnish Software แล้วเปลี่ยน 6081 เป็น 80 ในบรรทัด [ExecStart]

systemctl edit --full varnish

สำเนาที่บันทึกในตัวแก้ไขจะถูกสร้างที่ [/etc/systemd/system/varnish.service] และพอร์ตที่เปลี่ยนไว้จะคงอยู่แม้อัปเดตแพ็กเกจ

systemctl enable --now varnish

ไม่ว่าจะเลือกแบบใด สุดท้ายให้ใช้คำสั่ง enable กับตัวเลือก now เพื่อลงทะเบียนการเริ่มอัตโนมัติตอนบูตพร้อมกับเปิด Varnish ทันที

4️⃣ ตรวจสอบการทำงาน: เฮดเดอร์ X-Varnish และ Age

หลังเปิด Varnish แล้ว ให้ตรวจเฮดเดอร์การตอบกลับว่าหน้า WordPress มาจากแคชจริงหรือไม่ คำขอจะส่งตรงไปที่พอร์ต 6081 ของ Varnish โดยไม่ผ่าน Nginx จึงระบุโดเมนและการใช้ 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] เติม [max-age=0] ให้ HTML ทำให้การตั้งค่าเริ่มต้นของ 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] ด้านล่างคือการตอบกลับครั้งที่สองจากการส่งคำขอเดิมสองครั้งไปยัง Varnish ที่ใช้ 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)

คำขอครั้งที่สองที่ส่งหลังใช้ VCL ไป 3 วินาทีมีหมายเลข [X-Varnish] สองตัวและ [Age] เป็น 3 หมายเลขสองตัวหมายความว่าแคชเป็นผู้ตอบ และหมายเลขหลังคือหมายเลขของคำขอที่รับหน้านั้นจากเซิร์ฟเวอร์ต้นทางแล้วเก็บไว้

คำขอที่แนบคุกกี้เข้าสู่ระบบได้หมายเลขเดียวและเซิร์ฟเวอร์ต้นทางเป็นผู้ตอบ ส่วนคำขอที่แนบเฉพาะคุกกี้ของเครื่องมือวิเคราะห์ได้คำตอบจากแคช

🔢 FAQ & เนื้อหาแนะนำ

หากกำหนดเวลาเก็บใน VCL เป็น 10 นาที ตลอด 10 นาทีนั้นจะตอบด้วยหน้าก่อนแก้ไขที่เก็บอยู่ในแคช หากต้องการล้างแคชทันทีที่บันทึกโพสต์ ต้องมีกฎ VCL ที่จัดการคำขอ PURGE และปลั๊กอินอย่าง Proxy Cache Purge โดยจำกัดใน VCL ให้รับคำขอ PURGE เฉพาะที่ส่งจากเซิร์ฟเวอร์เดียวกัน

หากเว็บเซิร์ฟเวอร์ส่งไฟล์ HTML ที่ปลั๊กอินแคชสร้างไว้ได้ทันทีโดยไม่ผ่าน PHP Varnish ก็จะทำงานเดียวกันซ้ำอีกรอบ แต่หากหน้าที่แคชไว้ยังต้องผ่าน PHP ก่อนตอบ Varnish จะตอบอยู่ด้านหน้าและช่วยลดการรัน PHP

แม้ไม่เห็นเฮดเดอร์ เว็บไซต์ก็อาจใช้ Varnish อยู่ เพราะผู้ดูแลเซิร์ฟเวอร์บางครั้งเปลี่ยนชื่อหรือลบเฮดเดอร์การตอบกลับ บนเซิร์ฟเวอร์ Cloudways ที่เปิด Varnish ไว้ การตอบกลับของ WordPress มีเฮดเดอร์ [x-cache: HIT] และ [age] แทน [X-Varnish]

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 9   +   5   =