เปิด Gzip และ Brotli Compression บน Nginx/Apache
Compression เป็นการ optimize ที่ง่ายที่สุดและได้ผลดีที่สุดอย่างหนึ่ง ไฟล์ HTML, CSS, JavaScript ที่ compress ด้วย Gzip ลดขนาดได้ 60-80% ส่วน Brotli (algorithm ของ Google) ให้ compression ratio ดีกว่า Gzip อีก 15-20% เปิดได้ใน Nginx/Apache ใน 5 นาที
เปิด Gzip บน Nginx
sudo nano /etc/nginx/nginx.conf
http {
# Gzip Settings
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
application/rss+xml
font/woff2
image/svg+xml;
}
sudo nginx -t && sudo systemctl reload nginx
เปิด Brotli บน Nginx
Ubuntu 20.04+ ติดตั้ง libnginx-mod-http-brotli ได้จาก repository:
sudo apt install libnginx-mod-http-brotli -y
sudo nano /etc/nginx/nginx.conf
http {
# Brotli (เพิ่มต่อจาก gzip config)
brotli on;
brotli_comp_level 6;
brotli_static on;
brotli_types
text/plain
text/css
application/javascript
application/json
font/woff2
image/svg+xml;
}
เปิด Gzip บน Apache
sudo a2enmod deflate
sudo nano /etc/apache2/mods-enabled/deflate.conf
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css
AddOutputFilterByType DEFLATE text/javascript application/javascript
AddOutputFilterByType DEFLATE application/json application/xml
AddOutputFilterByType DEFLATE image/svg+xml font/woff2
# ไม่ compress รูปภาพและไฟล์ที่ compress แล้ว
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png|webp|gz|zip|bz2)$ no-gzip
DeflateCompressionLevel 6
</IfModule>
sudo systemctl reload apache2
Compression ช่วยเพิ่มความเร็วเว็บได้ไม่แพ้ upgrade hardware สำหรับ VPS ที่ต้องการ performance สูงตั้งแต่แรก บริการ VPS ของ asiagb มีตัวเลือก NVMe SSD ทั้งในไทยและสิงคโปร์ที่เหมาะสำหรับ web server production นอกจากนี้ให้ตรวจ speed score เว็บด้วย dnsxray.com ที่รายงาน HTTP headers รวมถึง Content-Encoding ว่า compression ทำงานหรือไม่
ตรวจสอบว่า Compression ทำงานถูกต้อง
# ตรวจ Gzip response header
curl -sI -H "Accept-Encoding: gzip" https://example.com | grep "Content-Encoding"
# ต้องได้: Content-Encoding: gzip
# ตรวจ Brotli
curl -sI -H "Accept-Encoding: br" https://example.com | grep "Content-Encoding"
# ต้องได้: Content-Encoding: br
# ดูขนาดจริง
curl -s -H "Accept-Encoding: gzip" https://example.com | wc -c # ขนาด compress
curl -s https://example.com | wc -c # ขนาดปกติ
# ทดสอบด้วย GTmetrix หรือ PageSpeed Insights
gzip_vary on ใน Nginx สำคัญมาก — ส่ง Vary: Accept-Encoding header เพื่อบอก CDN/proxy ว่า response นี้ต่างกันตาม Accept-Encoding ป้องกัน CDN ส่ง compressed content ให้ client ที่ไม่รองรับ
แก้ปัญหาที่พบบ่อย
curl ไม่เห็น Content-Encoding: gzip ทั้งที่ตั้งแล้ว
ต้องส่ง Accept-Encoding header ด้วยจึงจะได้รับ compressed response:
# ต้องมี -H "Accept-Encoding: gzip"
curl -sI -H "Accept-Encoding: gzip,deflate,br" https://example.com | grep -i encoding
รูปภาพ (JPG/PNG) ไม่ถูก compress
JPG/PNG เป็น binary format ที่ compress แล้ว การ compress ซ้ำจะได้ขนาดใกล้เดิมหรือใหญ่กว่า ปกติต้องไม่รวม image ใน gzip_types เลย ใช้ WebP แทนถ้าต้องการลดขนาดรูป
Brotli module ไม่ load ได้ใน Ubuntu
ตรวจ version ของ Nginx และ module compatibility:
# ตรวจว่า module มีหรือไม่
ls /etc/nginx/modules-enabled/ | grep brotli
# ถ้าไม่มีให้ติดตั้งใหม่
sudo apt install nginx-extras -y # nginx-extras รวม brotli ไว้แล้ว
# หรือ compile Nginx กับ brotli module เอง
Website เร็วขึ้นเล็กน้อยมาก แม้เปิด compression แล้ว
ตรวจว่าไฟล์ที่ใหญ่สุด (JS/CSS) ถูก compress หรือไม่ ถ้า CDN อยู่หน้า server อาจ serve cached uncompressed version:
# ตรวจ specific file
curl -sI -H "Accept-Encoding: gzip" https://example.com/main.js | grep encoding
# Purge CDN cache แล้วทดสอบใหม่
คำถามที่พบบ่อย
Brotli ดีกว่า Gzip อย่างไร?
Brotli compress ได้ดีกว่า Gzip ประมาณ 15-25% สำหรับ text files แต่ใช้ CPU มากกว่าในการ compress ทั้งคู่ decompress เร็วพอๆ กัน Brotli รองรับแค่ HTTPS (browser บังคับ) ส่วน Gzip ทำงานบน HTTP ได้ด้วย
Compression level 1-9 ต่างกันอย่างไร?
Level 1 = เร็วสุด compress น้อยสุด, Level 9 = ช้าสุด compress มากสุด สำหรับ web server ค่า 6 เป็น sweet spot ที่ได้ ratio 95% ของ level 9 แต่ใช้ CPU น้อยกว่ามาก ไม่แนะนำ level 9 บน production เพราะ CPU overhead สูงเกินคุ้ม
Compression ทำงานกับ WebSocket ได้ไหม?
Gzip/Brotli ทำงานกับ HTTP response headers ปกติ WebSocket protocol ไม่ผ่าน HTTP response เดิม จะต้องใช้ WebSocket per-message compression (permessage-deflate) แทน ซึ่งต้องตั้งค่าที่ application level