Varnish Cache คืออะไร: การติดตั้งและตั้งค่าพื้นฐาน Varnish Cache Server
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 -Vvarnishd (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.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 ให้เปลี่ยนค่า [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 & เนื้อหาแนะนำ
ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน