เปิด Nginx Caching บน Plesk ให้เว็บเร็วขึ้น
โครงสร้างของ Plesk คือ Nginx อยู่หน้า Apache โดยค่าเริ่มต้น Nginx ทำหน้าที่เพียงส่งต่อคำขอทั้งหมดไปให้ Apache ซึ่งหมายความว่าแม้แต่การขอไฟล์รูปก็ต้องผ่านสองชั้น
การตั้งให้ Nginx จัดการไฟล์คงที่เองและแคชหน้าเว็บที่ไม่เปลี่ยนบ่อย ลดภาระได้มากโดยไม่ต้องแก้โค้ดเว็บเลย คู่มือนี้ตั้งค่าทั้งสองอย่างพร้อมกฎยกเว้นที่ห้ามลืม
สิ่งที่ต้องเตรียม
- Plesk Obsidian และสิทธิ์ผู้ดูแลระบบ
- เว็บที่ทำงานอยู่แล้วและวัดความเร็วก่อนหน้าไว้
# วัดก่อน
for i in 1 2 3; do
curl -s -o /dev/null -w 'total=%{time_total}s ttfb=%{time_starttransfer}s\n' https://example.com/
done
ขั้นตอนที่ 1: เปิดให้ Nginx จัดการไฟล์คงที่
ไปที่ Domains แล้วเลือกโดเมน แล้ว Apache & nginx Settings
ติ๊ก Smart static files processing ซึ่งทำให้ Nginx ตอบไฟล์รูป CSS และ JavaScript เองโดยไม่ผ่าน Apache
ตั้งรายการนามสกุลไฟล์ในช่อง Serve static files directly by nginx
jpg jpeg gif png webp avif svg ico css js woff woff2 ttf eot mp4 webm pdf zip
ผลที่ได้ชัดเจนมากสำหรับเว็บที่มีรูปเยอะ เพราะแต่ละหน้าอาจมีคำขอไฟล์คงที่หลายสิบรายการ
ขั้นตอนที่ 2: เพิ่ม header สำหรับแคชฝั่งเบราว์เซอร์
ในช่อง Additional nginx directives ของโดเมนนั้น
location ~* \.(jpg|jpeg|png|gif|webp|avif|svg|ico)$ {
expires 365d;
add_header Cache-Control "public, immutable";
access_log off;
}
location ~* \.(css|js)$ {
expires 30d;
add_header Cache-Control "public";
access_log off;
}
location ~* \.(woff|woff2|ttf|eot)$ {
expires 365d;
add_header Cache-Control "public, immutable";
add_header Access-Control-Allow-Origin "*";
access_log off;
}
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml application/javascript
application/json application/xml image/svg+xml;
กด OK แล้วตรวจว่าคอนฟิกถูกต้อง Plesk จะแจ้งข้อผิดพลาดทันทีหากไวยากรณ์ผิด
sudo nginx -t
curl -sI https://example.com/wp-content/themes/mytheme/style.css | grep -i 'cache-control\|expires'
ขั้นตอนที่ 3: เปิดแคชหน้าเว็บ
ขั้นตอนนี้มีผลมากที่สุดแต่ต้องระวังที่สุด เพิ่มในช่อง Additional nginx directives
# ประกาศพื้นที่แคช ต้องอยู่ที่ระดับ http จึงต้องใส่ในคอนฟิกส่วนกลางแทน
# ดูขั้นตอนที่ 4
set $skip_cache 0;
# ไม่แคชเมื่อไม่ใช่ GET
if ($request_method != GET) { set $skip_cache 1; }
# ไม่แคชหน้าที่ต้องเป็นส่วนตัว
if ($request_uri ~* "/(wp-admin|wp-login\.php|cart|checkout|my-account)") {
set $skip_cache 1;
}
# ไม่แคชผู้ที่ล็อกอินหรือมีของในตะกร้า
if ($http_cookie ~* "wordpress_logged_in|woocommerce_items_in_cart|wp_woocommerce_session_|comment_author") {
set $skip_cache 1;
}
location / {
proxy_cache plesk_cache;
proxy_cache_valid 200 301 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_bypass $skip_cache;
proxy_no_cache $skip_cache;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
add_header X-Cache-Status $upstream_cache_status always;
proxy_pass http://127.0.0.1:7080;
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 $scheme;
}
ขั้นตอนที่ 4: ประกาศพื้นที่แคชที่ระดับเซิร์ฟเวอร์
คำสั่ง proxy_cache_path ต้องอยู่ในบล็อก http ซึ่งใส่ในหน้า Plesk ไม่ได้ ต้องสร้างไฟล์แยก
sudo nano /etc/nginx/conf.d/zz-plesk-cache.conf
proxy_cache_path /var/cache/nginx/plesk
levels=1:2
keys_zone=plesk_cache:20m
max_size=2g
inactive=60m
use_temp_path=off;
sudo mkdir -p /var/cache/nginx/plesk
sudo chown nginx:nginx /var/cache/nginx/plesk
sudo nginx -t && sudo systemctl reload nginx
ระวัง การอัปเดต Plesk อาจเขียนทับไฟล์ในบางโฟลเดอร์ ใช้ชื่อไฟล์ที่ขึ้นต้นด้วย zz เพื่อให้โหลดทีหลังและตรวจหลังอัปเดต Plesk ทุกครั้ง
ขั้นตอนที่ 5: ทดสอบว่าแคชทำงานและปลอดภัย
# ครั้งแรกควรเป็น MISS ครั้งที่สองควรเป็น HIT
curl -sI https://example.com/ | grep -i x-cache-status
curl -sI https://example.com/ | grep -i x-cache-status
# ผู้ที่ล็อกอินต้องได้ BYPASS
curl -sI -H 'Cookie: wordpress_logged_in_abc=1' https://example.com/ | grep -i x-cache-status
# หน้าตะกร้าต้องได้ BYPASS
curl -sI https://example.com/cart/ | grep -i x-cache-status
ทดสอบด้วยสองเบราว์เซอร์เสมอ ใส่สินค้าลงตะกร้าในเบราว์เซอร์แรก แล้วเปิดเว็บในเบราว์เซอร์ที่สองแบบไม่ระบุตัวตน ตะกร้าต้องว่าง หากเห็นสินค้าแปลว่าแคชผิดและต้องปิดทันที
ขั้นตอนที่ 6: ล้างแคช
# ล้างทั้งหมด
sudo rm -rf /var/cache/nginx/plesk/*
sudo systemctl reload nginx
# ดูขนาดแคช
sudo du -sh /var/cache/nginx/plesk
ตั้งให้ล้างอัตโนมัติเมื่อมีการเผยแพร่เนื้อหาใหม่ โดยเพิ่ม hook ใน WordPress
add_action('save_post', function () {
// เรียกสคริปต์ที่ล้างแคช ต้องตั้งสิทธิ์ sudo ให้ผู้ใช้เว็บ
exec('sudo /usr/local/bin/clear-nginx-cache.sh > /dev/null 2>&1 &');
});
ขั้นตอนที่ 7: ตั้งค่าเพิ่มสำหรับ PHP
ที่ Domains แล้วเลือกโดเมน แล้ว PHP Settings ตรวจค่าเหล่านี้
opcache.enable = 1
opcache.memory_consumption = 256
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 60
realpath_cache_size = 4096k
realpath_cache_ttl = 600
OPcache เก็บโค้ด PHP ที่คอมไพล์แล้วไว้ในหน่วยความจำ ให้ผลชัดเจนมากและควรเปิดเสมอ
เลือกตัวจัดการ PHP เป็น FPM application served by nginx เพื่อตัด Apache ออกจากเส้นทางทั้งหมด ซึ่งเร็วกว่าแต่ทำให้ไฟล์ .htaccess ไม่ทำงาน ต้องแปลงกฎเป็นของ Nginx ก่อน
ขั้นตอนที่ 8: วัดผล
for i in 1 2 3 4 5; do
curl -s -o /dev/null -w 'ttfb=%{time_starttransfer}s total=%{time_total}s\n' https://example.com/
done
เปรียบเทียบกับตัวเลขที่วัดไว้ก่อนเริ่ม เว็บที่แคชทำงานดีมักลด TTFB จากหลายร้อยมิลลิวินาทีเหลือไม่ถึงห้าสิบ
# ดูอัตรา HIT จาก Log
sudo grep -o 'X-Cache-Status: [A-Z]*' /var/www/vhosts/example.com/logs/proxy_access_ssl_log \
| sort | uniq -c
ปัญหาที่พบบ่อย
ผู้ใช้เห็นข้อมูลของคนอื่น
ปิดแคชทันทีด้วยการลบบล็อก proxy_cache แล้วรีโหลด Nginx จากนั้นตรวจกฎ $skip_cache ให้ครอบคลุมคุกกี้ทุกตัวของระบบล็อกอินก่อนเปิดใหม่
ได้ MISS ทุกครั้ง
Backend ส่ง Set-Cookie หรือ Cache-Control: no-cache กลับมาทุกคำขอ ตรวจด้วย curl -sI http://127.0.0.1:7080/ -H 'Host: example.com'
คอนฟิกหายหลังอัปเดต Plesk
ตรวจไฟล์ใน /etc/nginx/conf.d/ หลังอัปเดตทุกครั้ง และเก็บสำเนาไฟล์ไว้ในที่ปลอดภัย
เว็บขึ้นข้อผิดพลาดหลังใส่คำสั่งเพิ่ม
Plesk ตรวจไวยากรณ์ตอนกด OK หากผ่านแล้วแต่เว็บพัง ให้ดู Log แล้วลบคำสั่งออกทีละส่วนเพื่อหาต้นเหตุ
sudo tail -50 /var/log/nginx/error.log
ต้องการ Cloud VPS ที่ปรับจูนมาให้แล้วพร้อมทีมดูแล ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/
- Categories:
- Cloud
- Tags:
- Cloud
- Cloud Server
Related Posts
หมวดหมู่ที่น่าสนใจ
- Account Settings
- AD Server
- AI
- Alibaba Cloud
- Anti-Spam Gateway
- AWS Amazon Web Services
- Campaign
- CentOS/AlmaLinux
- Cloud
- Cloud Backup
- Cloud Communication
- Cloud Migration
- Cloud Security
- Cloud Server Management
- Cloud Solution
- Cloud Solution for Government
- Cloud Solutions by Industry
- Cloud Storage
- Cloud VPS App Plus +
- Cloud VPS DirectAdmin
- Cloud VPS Plesk
- CSR
- Cyber Security
- Cybersecurity
- Data Sovereignty
- Database Server
- DDoS
- Digital Tranformation
- Digital Transformation
- Direct Mail
- Directadmin
- Domainname
- Ecommerce
- ERP
- Generative AI
- Getting Started
- Google Cloud
- Google G Suite
- Huawei Cloud
- IT News
- Linux Server
- Managed Cloud Services
- Managed Service Provider
- Manual
- Microsoft
- Microsoft 365
- Microsoft Azure
- News
- On-premise
- Private Mail Server
- Promotion
- Recommend Solution (Enterprise)
- Server
- Sovereign Cloud
- THAI DATA CLOUD Platform
- Ubuntu
- Ubuntu
- Uncategorized
- VMware
- VPS Server
- Web Design
- Web Hosting
- Web Hosting (DirectAdmin)
- Web Hosting (Plesk)
- Web Technologies
- Windows Server
- Wordpress
- Zimbra
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี








