Caching เป็นเทคนิคที่สำคัญในการเพิ่มประสิทธิภาพของเวบแอปพลิเคชันและลดความเครียดของเซิร์ฟเวอร์ Nginx เป็นหนึ่งในเว็บเซิร์ฟเวอร์ที่ทรงพลังและเชื่อถือได้ที่มีความสามารถในการจัดการ caching ได้อย่างมืออาชีพ ด้วยการกำหนด caching strategy ที่เหมาะสม คุณสามารถลดเวลาในการตอบสนองของเซิร์ฟเวอร์ เพิ่มความเร็วในการโหลดเพจ และลดการใช้ Bandwidth ได้อย่างมีนัยสำคัญ
บทความนี้จะแนะนำเทคนิค caching ต่าง ๆ ที่สามารถใช้งานได้บน Nginx รวมถึง proxy cache, browser caching, และ static file caching พร้อมตัวอย่าง configuration ที่ใช้ได้จริง ซึ่งจะช่วยให้คุณเข้าใจและนำไปประยุกต์ใช้กับระบบของตัวเองได้
ทำไมการ Caching บน Nginx จึงสำคัญ
ในปัจจุบัน ผู้ใช้งานส่วนใหญ่คาดหวังว่าเว็บไซต์จะโหลดเร็วมาก ความล่าช้าเพียงไม่กี่วินาทีก็อาจทำให้ผู้ใช้งานออกจากเว็บไซต์ไป Caching ช่วยลดระยะเวลาในการตอบสนองโดยการเก็บข้อมูลที่เรียกใช้บ่อยไว้ในหน่วยความจำ เมื่อ request มาถึง Nginx สามารถส่งข้อมูลจาก cache ได้ทันทีโดยไม่จำเป็นต้องประมวลผลหรือดึงข้อมูลจากบ็อกเอนด์
นอกจากการเพิ่มความเร็ว caching ยังช่วยลดความเครียดของเซิร์ฟเวอร์ Upstream (เช่น Application Server หรือ PHP) ลดการใช้ Bandwidth, ประหยัดค่าใช้สอยในการเชื่อมต่ออินเทอร์เน็ต และเพิ่มประสิทธิภาพโดยรวมของระบบ
ประเภทของ Caching บน Nginx
Nginx รองรับการ caching หลายประเภท ขึ้นอยู่กับความต้องการและกรณีการใช้งาน ต่อไปนี้เป็นประเภท caching หลัก ๆ ที่นิยมใช้:
1. Proxy Cache (Reverse Proxy Caching)
Proxy cache เป็นการจัดเก็บ response จากเซิร์ฟเวอร์ upstream (backend server) ไว้บน Nginx เมื่อ client request มาถึง Nginx จะตรวจสอบว่า response นั้นอยู่ใน cache หรือไม่ ถ้าหากอยู่จะส่ง cached response ให้ client โดยตรงโดยไม่ต้องส่ง request ไปยัง upstream ช่วยลดความเครียดของ backend server และเพิ่มความเร็วในการตอบสนองได้อย่างมากมาย
2. Browser Caching
Browser cache คือการเก็บ static files เช่น CSS, JavaScript, Images บน browser ของผู้ใช้งาน โดยกำหนด cache headers เช่น Expires หรือ Cache-Control ผ่าน HTTP response headers คลั้งต่อมาเมื่อผู้ใช้งานเข้ามาที่เว็บไซต์อีกครั้ง browser จะใช้ไฟล์ที่เคยดาวน์โหลดมาแล้วแทนการดาวน์โหลดใหม่ ช่วยลดการใช้ Bandwidth และเพิ่มความเร็วในการโหลดเพจ
3. Static File Caching
Static file caching คือการ cache ไฟล์ที่ไม่เปลี่ยนแปลงบ่อย เช่น CSS, JS, Image, Font เป็นต้น Nginx สามารถจัดเก็บไฟล์เหล่านี้ไว้ในหน่วยความจำ (memory) เพื่อให้สามารถส่งให้ client ได้อย่างรวดเร็ว
การกำหนด Proxy Cache บน Nginx
Proxy cache คือฟีเจอร์ที่สำคัญที่สุดของ Nginx caching ต่อไปนี้เป็นวิธีการกำหนด proxy cache:
ขั้นตอนที่ 1: กำหนด Cache Path
ขั้นตอนแรกคือการกำหนด cache path ซึ่งคือ directory ที่ Nginx จะเก็บ cached files ไว้ ตั้งค่านี้ใน http block ของ nginx.conf
http {
# กำหนด cache path
proxy_cache_path /var/cache/nginx/my_cache levels=1:2 keys_zone=my_cache:10m max_size=100m inactive=60m use_temp_path=off;
}
อธิบายพารามิเตอร์:
- /var/cache/nginx/my_cache — Path ของ directory ที่เก็บ cache files
- levels=1:2 — โครงสร้าง directory (1 ตัวอักษรแรก, 2 ตัวอักษรถัดไป)
- keys_zone=my_cache:10m — ชื่อ cache zone และขนาดของ shared memory (10MB)
- max_size=100m — ขนาดสูงสุดของ cache (100MB)
- inactive=60m — ลบ cache ที่ไม่ใช้งานเป็นเวลา 60 นาที
- use_temp_path=off — ไม่สร้าง temp files เพื่อเพิ่มประสิทธิภาพ
ขั้นตอนที่ 2: เปิดใช้ Proxy Cache ใน Server Block
หลังจากกำหนด cache path แล้ว ให้เปิดใช้ proxy cache ในแต่ละ server block:
server {
listen 80;
server_name example.com;
# เปิดใช้ proxy cache
proxy_cache my_cache;
# ระยะเวลา cache (default: 10 นาที)
proxy_cache_valid 200 10m;
proxy_cache_valid 404 1m;
# เพิ่ม header เพื่อดูสถานะ cache
add_header X-Cache-Status $upstream_cache_status;
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
proxy_cache_key การกำหนด Cache Key
Cache key คือตัวระบุที่เฉพาะเจาะจงสำหรับแต่ละ cached response โดยค่าเริ่มต้น Nginx ใช้ $scheme$request_method$host$request_uri เป็น cache key ซึ่งหมายความว่า request ที่มี scheme, method, host, หรือ URI ต่างกัน จะถูกเก็บ cache แยกกัน
คุณสามารถปรับแต่ง cache key ตามความต้องการของตัวเอง เช่น:
server {
# cache key ค่าเริ่มต้น
proxy_cache_key "$scheme$request_method$host$request_uri";
# หรือสร้าง custom cache key ที่มี query string
proxy_cache_key "$scheme$host$request_uri$is_args$args";
# cache key ที่ไม่รวม query string
proxy_cache_key "$scheme$host$request_uri";
}
proxy_cache_valid ระยะเวลา Cache Validity
proxy_cache_valid กำหนดระยะเวลาที่ response จะถูกเก็บใน cache ตามสถานะ HTTP code ต่างกัน:
server {
location / {
# Cache response ที่ status 200, 201, 204 เป็นเวลา 30 นาที
proxy_cache_valid 200 201 204 30m;
# Cache response ที่ status 404 เป็นเวลา 1 นาที
proxy_cache_valid 404 1m;
# Cache response ที่ status 500-599 เป็นเวลา 10 วินาที
proxy_cache_valid 500 502 503 504 10s;
# ค่า default สำหรับ status ื่น ๆ
proxy_cache_valid any 5m;
proxy_pass http://backend_server;
}
}
proxy_cache_use_stale การใช้ Stale Cache
Stale cache คือ cache ที่หมดอายุแล้ว แต่ยังสามารถใช้ได้ในบางสถานการณ์ proxy_cache_use_stale อนุญาตให้ Nginx ส่ง stale cache ไปให้ client เมื่อ upstream server ไม่สามารถตอบสนองได้
server {
location / {
# ใช้ stale cache ขณะที่更新 cache
proxy_cache_use_stale updating;
# ใช้ stale cache เมื่อ upstream ตอบสนองด้วย error
proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;
# ใช้ stale cache เมื่อ upstream ไม่ตอบสนอง
proxy_cache_use_stale http_404 http_403;
proxy_pass http://backend_server;
}
}
Cache Purging การลบ Cache
บางครั้งคุณต้องลบ cache เพื่อให้ client ได้รับข้อมูลล่าสุด Nginx มีวิธีหลายวิธีในการลบ cache:
วิธีที่ 1: ใช้ curl เพื่อส่ง DELETE request
# ลบ cache ของ URL เฉพาะเจาะจง
curl -X PURGE http://example.com/api/data
# ลบ cache ทั้งหมด
rm -rf /var/cache/nginx/my_cache/*
วิธีที่ 2: ใช้ Nginx Cache Purge Module
ติดตั้ง ngx_cache_purge module (ต้องรีคอมไพล์ Nginx):
server {
location ~ /purge(/.*) {
proxy_cache_purge my_cache $scheme$host$1$is_args$args;
}
}
# ใช้งาน
curl -X PURGE http://example.com/purge/api/data
proxy_cache_bypass การข้าม Cache
บางครั้งคุณต้องการข้าม cache และดึงข้อมูลจาก upstream server โดยตรง proxy_cache_bypass ช่วยให้คุณสามารถทำได้:
server {
location / {
# ข้าม cache ถ้า query string มี bypass=true
proxy_cache_bypass $arg_bypass;
# ข้าม cache สำหรับ POST request
proxy_cache_bypass $request_method;
# ข้าม cache สำหรับ admin users
proxy_cache_bypass $cookie_admin;
# รวมหลายเงื่อนไข
set $bypass 0;
if ($request_method = POST) {
set $bypass 1;
}
if ($arg_nocache = 1) {
set $bypass 1;
}
proxy_cache_bypass $bypass;
proxy_pass http://backend_server;
}
}
Monitoring Cache Hit/Miss ด้วย $upstream_cache_status
ในการ debug และ monitor cache effectiveness คุณสามารถใช้ตัวแปร $upstream_cache_status ซึ่งจะแสดงสถานะของ cache request:
server {
# เพิ่ม cache status ลงใน HTTP header
add_header X-Cache-Status $upstream_cache_status;
# หรือเพิ่มลงใน log format
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'Cache: $upstream_cache_status';
access_log /var/log/nginx/access.log custom;
location / {
proxy_pass http://backend_server;
}
}
ค่าที่เป็นไปได้ของ $upstream_cache_status:
- HIT — response มาจาก cache และยังไม่หมดอายุ (hit rate ดี)
- MISS — response ไม่มีใน cache ต้องดึงจาก upstream
- EXPIRED — cache หมดอายุแล้ว
- UPDATING — cache กำลังได้รับการอัปเดต
- REVALIDATED — cache ได้รับการยืนยันว่ายังใช้ได้
- BYPASS — ข้าม cache ตามตั้งค่า proxy_cache_bypass
ใช้คำสั่ง tail เพื่อดูสถานะ cache ในเรียลไทม์:
tail -f /var/log/nginx/access.log | grep "Cache:"
Browser Caching ด้วย Cache-Control Headers
การตั้งค่า browser cache headers ช่วยให้ browser สามารถเก็บ static files ไว้ในเครื่องของผู้ใช้ได้:
server {
# Cache static files เป็นเวลา 1 ปี
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 365d;
add_header Cache-Control "public, immutable";
}
# Cache HTML 1 วัน
location ~* \.html$ {
expires 1d;
add_header Cache-Control "public, must-revalidate";
}
# ไม่ cache dynamic content
location / {
expires -1;
add_header Cache-Control "no-cache, no-store, must-revalidate";
proxy_pass http://backend_server;
}
}
Best Practices สำหรับ Nginx Caching
ต่อไปนี้เป็น best practices ที่ควรทำเพื่อให้ได้ประสิทธิภาพ caching ที่ดีที่สุด:
- ตั้งค่า cache duration ให้เหมาะสม — ตั้งเวลาที่มากเกินไปอาจทำให้ผู้ใช้ได้รับข้อมูลเก่า แต่เวลาน้อยเกินไปจะไม่มีประโยชน์
- ใช้ cache key ที่เหมาะสม — หลีกเลี่ยงการทำให้ cache keys มีขนาดใหญ่เกินไปหรือซ้ำซ้อน
- monitor cache hit rate — ติดตามและเพิ่มประสิทธิภาพ cache hit rate ให้สูงที่สุดเท่าที่เป็นไปได้
- ใช้ stale cache อย่างชาญฉลาด — proxy_cache_use_stale ช่วยให้ระบบคงความเสถียรได้เมื่อ upstream หยุดทำงาน
- กำหนด cache size ให้เหมาะสม — ขนาด cache ควรเพียงพอสำหรับเก็บ content ที่ใช้บ่อย
- ใช้ conditional cache — ตั้งค่าให้ cache เฉพาะ response ที่มีเงื่อนไขบางประการ เช่น ไม่ cache response ที่มี Set-Cookie header
- เตรียมวิธีการ purge cache — มีระบบในการลบ cache เมื่อ content เปลี่ยนแปลง
- ทดสอบ cache configuration — ทดสอบเพื่อให้แน่ใจว่า cache ทำงานตามที่คาดหวัง
ตัวอย่าง Configuration ที่สมบูรณ์
นี่คือตัวอย่าง configuration ที่สมบูรณ์สำหรับการตั้งค่า caching บน Nginx:
http {
# กำหนด cache zones
proxy_cache_path /var/cache/nginx/api_cache levels=1:2 keys_zone=api_cache:20m max_size=500m inactive=120m use_temp_path=off;
proxy_cache_path /var/cache/nginx/html_cache levels=1:2 keys_zone=html_cache:10m max_size=100m inactive=60m use_temp_path=off;
server {
listen 80;
server_name api.example.com;
# Cache API responses
location /api/ {
proxy_cache api_cache;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_valid 200 30m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout http_500 http_502 http_503;
proxy_cache_bypass $arg_bypass;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://backend_api;
proxy_set_header Host $host;
}
# Cache HTML และ static files
location ~* \.(html|css|js|png|jpg|gif)$ {
proxy_cache html_cache;
proxy_cache_valid 200 7d;
expires 7d;
add_header Cache-Control "public, immutable";
proxy_pass http://backend_web;
}
# ไม่ cache dynamic content
location / {
proxy_pass http://backend_web;
proxy_set_header Host $host;
}
# Purge cache
location ~ /purge(/.*) {
allow 127.0.0.1;
deny all;
proxy_cache_purge api_cache $scheme$host$1$is_args$args;
}
}
}
สรุป
Caching strategy บน Nginx เป็นเทคนิคสำคัญที่ช่วยเพิ่มประสิทธิภาพและความเร็วของเว็บแอปพลิเคชัน ด้วยการรวมใช้ proxy cache, browser caching, และ static file caching อย่างถูกต้อง คุณสามารถลดความเครียดของเซิร์ฟเวอร์ เพิ่มความเร็วในการตอบสนอง และลดการใช้ Bandwidth ได้อย่างมีนัยสำคัญ การ monitor cache effectiveness ด้วย $upstream_cache_status และการสร้างระบบ purge cache ที่เหมาะสมก็สำคัญไม่น้อยสำหรับการจัดการ cache ระยะยาว
การปฏิบัติตามคำแนะนำและ best practices ในบทความนี้จะช่วยให้คุณสามารถนำ caching strategy ไปใช้ได้อย่างมีประสิทธิภาพ และได้รับผลประโยชน์สูงสุดจากการ caching บน Nginx
แนะนำบริการ DE
หากคุณต้องการเซิร์ฟเวอร์ที่มีความสามารถสูง และสามารถปรับแต่ง Nginx configuration ได้อย่างเต็มที่ Cloud VPS ของ DE เป็นตัวเลือกที่ดีเยี่ยม ด้วย VPS ของ DE คุณจะได้ความเป็นอิสระในการติดตั้งและปรับแต่ง Nginx ตามความต้องการของตัวเอง นอกจากนี้ บริการ Cloud Hosting ของ DE ก็มีการตั้งค่า caching ที่ดีอยู่แล้วเพื่อให้เว็บไซต์ของคุณทำงานได้อย่างมีประสิทธิภาพโดยไม่ต้องกังวลเรื่อง server configuration
ทั้ง Cloud VPS และ Cloud Hosting ของ DE มีการรองรับ Nginx เวอร์ชันล่าสุด ให้ support ที่ดี และมีราคาที่แข่งขันได้ สำหรับข้อมูลเพิ่มเติม โปรดไปที่ เว็บไซต์หลักของ DE

