
สารบัญ
- Nginx FastCGI Cache คืออะไร
- ทำไมต้องใช้ FastCGI Cache กับ WordPress
- ความต้องการระบบก่อนเริ่ม
- ตั้งค่า fastcgi_cache_path
- ตั้งค่า Virtual Host สำหรับ WordPress
- ตั้งค่า bypass cache ให้ถูกต้อง
- ทดสอบและตรวจสอบ Cache
- ล้าง Cache อัตโนมัติด้วย Nginx Helper
- เปรียบเทียบ FastCGI Cache vs วิธีอื่น
- แก้ไขปัญหาที่พบบ่อย
- สรุป
- คำถามที่พบบ่อย (FAQ)
Nginx FastCGI Cache คืออะไร
Nginx FastCGI Cache คือระบบ cache ที่ทำงานภายใน Nginx web server โดยเก็บ response จาก PHP-FPM (FastCGI Process Manager) ไว้ในรูปแบบไฟล์บน disk หรือ memory เมื่อมี request ครั้งถัดไปสำหรับ URL เดิม Nginx จะตอบกลับด้วยไฟล์ที่ cache ไว้ทันที โดยไม่ต้องเรียก PHP-FPM หรือ MySQL เลย
FastCGI Cache เป็นฟีเจอร์ที่ฝังอยู่ใน Nginx ตั้งแต่ version 0.7.48 ไม่ต้องติดตั้ง module เพิ่มเติม และรองรับ WordPress ได้อย่างสมบูรณ์เมื่อตั้งค่าอย่างถูกต้อง
ทำไมต้องใช้ FastCGI Cache กับ WordPress
WordPress เป็น CMS ที่ dynamic โดยธรรมชาติ ทุก request ต้องผ่าน PHP และ MySQL ซึ่งใช้ทรัพยากรสูงมาก โดยเฉพาะเว็บที่มี traffic หนาแน่น FastCGI Cache แก้ปัญหานี้ได้อย่างตรงจุด
| ตัวชี้วัด | ก่อนใช้ Cache | หลังใช้ FastCGI Cache |
|---|---|---|
| TTFB (Time to First Byte) | 200–800 ms | 5–30 ms |
| Requests per second | 30–100 | 1,000–5,000+ |
| CPU usage ขณะ traffic peak | 80–100% | 5–20% |
| Memory usage | สูง (PHP workers) | ต่ำมาก |
| Database queries/req | 10–50 queries | 0 queries (cache HIT) |
ความต้องการระบบก่อนเริ่ม
ก่อนเริ่มตั้งค่า FastCGI Cache ควรตรวจสอบว่าระบบพร้อมดังนี้:
- VPS Linux (Ubuntu 20.04/22.04/24.04 หรือ Debian 11/12)
- Nginx 1.18+ (ตรวจสอบด้วย
nginx -v) - PHP-FPM (ไม่ใช่ mod_php)
- WordPress ติดตั้งแล้วทำงานปกติ
- สิทธิ์ root หรือ sudo บน VPS
nginx -v
php-fpm8.1 -v
systemctl status nginx php8.1-fpm
ตั้งค่า fastcgi_cache_path
ขั้นตอนแรกคือกำหนด cache zone ใน Nginx configuration หลัก โดยเพิ่มใน block http {} ของไฟล์ /etc/nginx/nginx.conf
sudo nano /etc/nginx/nginx.conf
เพิ่มบรรทัดนี้ภายใน http { } block:
fastcgi_cache_path /var/cache/nginx
levels=1:2
keys_zone=WORDPRESS:100m
inactive=60m
max_size=1g;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
คำอธิบายตัวเลือกสำคัญ:
| Option | ค่า | ความหมาย |
|---|---|---|
| levels=1:2 | 1:2 | โครงสร้างไดเรกทอรีย่อยเพื่อกระจาย inode |
| keys_zone | WORDPRESS:100m | ชื่อ zone และขนาด memory สำหรับเก็บ keys (100 MB รองรับ ~800,000 keys) |
| inactive | 60m | ลบ cache entry ที่ไม่ถูกเรียกใน 60 นาที |
| max_size | 1g | ขนาดสูงสุดของ cache ทั้งหมดบน disk |
sudo mkdir -p /var/cache/nginx
sudo chown www-data:www-data /var/cache/nginx
ตั้งค่า Virtual Host สำหรับ WordPress
แก้ไขไฟล์ virtual host ของเว็บไซต์ WordPress (ปกติอยู่ที่ /etc/nginx/sites-available/yoursite.com)
server {
listen 80;
listen [::]:80;
server_name yoursite.com www.yoursite.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yoursite.com www.yoursite.com;
root /var/www/yoursite.com/public;
index index.php;
ssl_certificate /etc/letsencrypt/live/yoursite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yoursite.com/privkey.pem;
# FastCGI Cache Settings
set $skip_cache 0;
# Skip cache สำหรับ POST requests
if ($request_method = POST) { set $skip_cache 1; }
# Skip cache สำหรับ URL ที่มี query string
if ($query_string != "") { set $skip_cache 1; }
# Skip cache สำหรับ URL พิเศษของ WordPress
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
# Skip cache สำหรับ logged-in users และ WooCommerce
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|woocommerce_items_in_cart|woocommerce_cart_hash") {
set $skip_cache 1;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# เปิดใช้ FastCGI Cache
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 301 302 60m;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
# Header บอกสถานะ cache
add_header X-Cache $upstream_cache_status;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
}
ตั้งค่า bypass cache ให้ถูกต้อง
การ bypass cache ที่ถูกต้องเป็นกุญแจสำคัญของการตั้งค่า FastCGI Cache ที่ปลอดภัยและถูกต้อง
| เงื่อนไข | skip_cache | เหตุผล |
|---|---|---|
| POST request | 1 (bypass) | ข้อมูลฟอร์ม ต้องประมวลผลจริง |
| มี query string | 1 (bypass) | อาจเป็น pagination, filter |
| wp-admin/ | 1 (bypass) | หน้า admin ต้อง real-time เสมอ |
| Cookie: logged_in | 1 (bypass) | User login ต้องเห็น content จริง |
| Cookie: woo_cart | 1 (bypass) | Cart อาจเปลี่ยนแปลงได้ |
| GET request ปกติ | 0 (cache) | ผู้เยี่ยมชมทั่วไป ใช้ cache ได้ |
ทดสอบและตรวจสอบ Cache
sudo nginx -t
sudo systemctl reload nginx
# Request แรก: ควรได้ MISS (PHP ยังประมวลผลจริง)
curl -I https://yoursite.com/ | grep X-Cache
# Request ที่สอง: ควรได้ HIT (โหลดจาก cache)
curl -I https://yoursite.com/ | grep X-Cache
ผลลัพธ์ที่ถูกต้อง:
X-Cache: MISS ← request แรก
X-Cache: HIT ← request ที่สองเป็นต้นไป
ls -la /var/cache/nginx/
du -sh /var/cache/nginx/
ล้าง Cache อัตโนมัติด้วย Nginx Helper
เพื่อให้เว็บแสดงเนื้อหาล่าสุดหลังอัพเดตโพสต์หรือ comment แนะนำติดตั้ง plugin Nginx Helper บน WordPress
- ติดตั้ง plugin Nginx Helper จาก WordPress Plugin Directory
- ไปที่ Settings → Nginx Helper
- เปิดใช้ Enable Purge
- เลือก Delete local server cache files
- กำหนด Cache Path เป็น
/var/cache/nginx/ - เลือกเหตุการณ์ที่ต้องการล้าง cache เช่น: โพสต์ใหม่, แก้ไขโพสต์, comment ใหม่
sudo find /var/cache/nginx -type f -delete
เปรียบเทียบ FastCGI Cache vs วิธีอื่น
มีหลายวิธีในการทำ cache สำหรับ WordPress แต่ละวิธีมีข้อดีข้อเสียต่างกัน:
| วิธี Cache | ความเร็ว | ความยาก | ต้นทุน | เหมาะกับ |
|---|---|---|---|---|
| FastCGI Cache | ⚡⚡⚡⚡⚡ | ปานกลาง | ฟรี | VPS ทุกขนาด |
| W3 Total Cache | ⚡⚡⚡ | ง่าย | ฟรี/Pro | Shared hosting |
| WP Rocket | ⚡⚡⚡⚡ | ง่ายมาก | $59/ปี | ผู้เริ่มต้น |
| Redis Object Cache | ⚡⚡⚡⚡ | ปานกลาง | ฟรี | เสริม FastCGI |
| Varnish Cache | ⚡⚡⚡⚡⚡ | ยาก | ฟรี | Traffic สูงมาก |
แก้ไขปัญหาที่พบบ่อย
ปัญหา: X-Cache ขึ้น MISS ทุก request
สาเหตุที่พบบ่อย: browser ส่ง cookie ที่ trigger bypass cache อยู่เสมอ ตรวจสอบด้วย:
curl -s -D - https://yoursite.com/ -o /dev/null | grep -E "X-Cache|Set-Cookie"
ถ้าเห็น Set-Cookie จากหน้าปกติ ให้เพิ่ม fastcgi_ignore_headers Set-Cookie; ใน location block
ปัญหา: เว็บแสดงเนื้อหาเก่าหลังอัพเดต
ล้าง cache ด้วย Nginx Helper หรือใช้คำสั่ง:
sudo find /var/cache/nginx -type f -delete
sudo systemctl reload nginx
ปัญหา: WooCommerce cart แสดงสินค้าผิด
ตรวจสอบว่ามี bypass rule สำหรับ WooCommerce cookies ครบแล้ว โดยเฉพาะ woocommerce_items_in_cart และ woocommerce_cart_hash
ปัญหา: หน้า admin โหลดข้อมูลเก่า
ตรวจสอบว่า /wp-admin/ อยู่ใน skip_cache rule แล้ว และรันคำสั่ง:
grep -n "skip_cache" /etc/nginx/sites-available/yoursite.com
สรุป
สิ่งที่ต้องทำเพื่อตั้งค่า Nginx FastCGI Cache
- เพิ่ม
fastcgi_cache_pathในnginx.conf - ตั้งค่า virtual host พร้อม bypass rules ที่ครบถ้วน
- สร้าง cache directory และให้สิทธิ์ที่ถูกต้อง
- ทดสอบด้วย curl ตรวจสอบ X-Cache: HIT
- ติดตั้ง Nginx Helper plugin สำหรับ auto-purge
- monitor ขนาด cache ด้วย
du -sh /var/cache/nginx/
Nginx FastCGI Cache เป็นหนึ่งในวิธีที่คุ้มค่าที่สุดในการเพิ่มความเร็วเว็บ WordPress บน VPS เพราะไม่มีค่าใช้จ่ายเพิ่มเติม ตั้งค่าครั้งเดียวใช้ได้นาน และสามารถลด TTFB จาก 500ms เหลือเพียง 10ms ได้จริงในสภาพแวดล้อมจริง
ต้องการ VPS สำหรับรัน Nginx + WordPress?
AsiaGB VPS ไทย SSD ความเร็วสูง พร้อม Nginx พร้อมใช้งาน Uptime 99% ดูแลระบบตลอด 24 ชั่วโมง
ดู VPS Package →คำถามที่พบบ่อย (FAQ)
Nginx FastCGI Cache ต่างจาก plugin cache ของ WordPress อย่างไร?
FastCGI Cache ทำงานระดับ server ก่อนที่ PHP จะทำงาน ทำให้เร็วกว่า plugin cache มาก เพราะไม่ต้องโหลด WordPress, PHP หรือ query database เลย ส่วน plugin cache เช่น W3 Total Cache ยังต้องโหลด PHP engine ก่อน
FastCGI Cache จะทำให้หน้าเว็บแสดงข้อมูลเก่าหรือเปล่า?
ไม่ถ้าตั้งค่าถูกต้อง cache จะหมดอายุตามเวลาที่กำหนด และสามารถตั้งให้ล้าง cache อัตโนมัติเมื่อมีการอัพเดตโพสต์ผ่าน plugin Nginx Helper
VPS ขนาดไหนถึงเหมาะกับการตั้งค่า FastCGI Cache?
VPS ทุกขนาดใช้ได้ แม้แต่ RAM 1 GB แต่ถ้ามีปริมาณ traffic สูงหรือเว็บ WordPress มีเนื้อหาเยอะ แนะนำ RAM 2 GB ขึ้นไป
ผู้ใช้ที่ login อยู่จะได้รับ cached page หรือเปล่า?
ถ้าตั้งค่าถูกต้อง ผู้ใช้ที่ login จะ bypass cache โดยอัตโนมัติ โดยตรวจจาก cookie เช่น wordpress_logged_in_*
จะรู้ได้อย่างไรว่าหน้าเว็บโหลดมาจาก cache หรือ PHP?
ดูได้จาก HTTP response header ชื่อ X-Cache ถ้าเห็น HIT = มาจาก cache, MISS = PHP ประมวลผลจริง ใช้คำสั่ง curl -I https://yoursite.com
FastCGI Cache ทำงานร่วมกับ WooCommerce ได้ไหม?
ได้ครับ แต่ต้องตั้งค่า bypass cache สำหรับหน้า cart, checkout และผู้ใช้ที่ login เพื่อให้ราคาและสถานะ cart ถูกต้องเสมอ