ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

เปิด Nginx Caching บน Plesk ให้เว็บเร็วขึ้น
Home เปิด Nginx Caching บน Plesk ให้เว็บเร็วขึ้น

เปิด 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/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security