เปิด Gzip และ Brotli Compression บน Nginx/Apache

เปิด Gzip และ Brotli Compression บน Nginx/Apache

มิถุนายน 2026 · อ่าน 6 นาที

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
Tip: 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