Belajar Traefik - Compression & Buffering
Episode 13 of 31

Belajar Traefik - Compression & Buffering

Episode ini membahas middleware yang menyentuh efisiensi wire: Compress untuk kompresi gzip dan brotli, Buffering untuk mengelola ukuran request dan response termasuk memory limits dan retry, serta ContentType untuk auto-deteksi content type yang benar.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

Setelah melindungi backend dari lonjakan, waktunya membuat trafik lebih efisien. Episode 13 membahas tiga middleware yang menghemat bandwidth dan menstabilkan memori: Compress, Buffering, dan ContentType.

Compress memperkecil response sebelum dikirim — berdampak langsung pada kecepatan halaman. Buffering mengontrol berapa banyak request dan response yang boleh "ditampung" Traefik, mencegah abuse dan menjaga kestabilan memori. ContentType memastikan browser menerima content type yang benar. Ketiganya sederhana dipasang tapi berdampak besar di produksi.

Compress Middleware

Gzip dan Brotli

Compress mengompresi response dengan algoritma gzip atau brotli, tergantung header Accept-Encoding klien. Konfigurasi middleware compress minimal:

Middleware Compress
http:
  middlewares:
    app-compress:
      compress:
        excludedContentTypes:
          - text/event-stream
        minResponseBodyBytes: 2048
  • excludedContentTypes: content type yang tidak boleh dikompres — contoh penting: text/event-stream untuk Server-Sent Events yang streaming, karena kompresi akan menunda pengiriman per event.
  • minResponseBodyBytes: ukuran minimum response sebelum dikompres (default 1024 byte). Response kecil tidak sepadan diompresi karena overhead header lebih besar dari penghematannya.

Traefik secara otomatis menentukan content type dan hanya mengompresi jenis yang menguntungkan: teks, JSON, HTML, dan lainnya. Gambar JPEG dan PNG sudah terkompresi, sehingga tidak perlu diompresi ulang.

Praktik Terbaik

Pasang Compress di router utama atau sebagai middleware global untuk layanan web. Pastikan header Vary: Accept-Encoding tetap ada agar cache CDN tidak mencampur versi terkompresi dan tidak terkompresi. Label Docker untuk pemasangan:

Compress via labels
services:
  web:
    image: nginx:alpine
    labels:
      - traefik.enable=true
      - traefik.http.routers.web.rule=Host(`web.localhost`)
      - traefik.http.routers.web.middlewares=app-compress
      - traefik.http.middlewares.app-compress.compress.minresponsebodybytes=2048
      - traefik.http.routers.web.service=web-svc
      - traefik.http.services.web-svc.loadbalancer.server.port=80

Buffering Middleware

Membatasi Ukuran Request dan Response

Buffering menampung request dan response secara penuh di memori sebelum meneruskannya. Ini memungkinkan pemeriksaan dan batas ukuran, sekaligus memastikan keseluruhan payload valid:

Middleware Buffering
http:
  middlewares:
    api-buffer:
      buffering:
        maxRequestBodyBytes: 1048576
        memRequestBodyBytes: 2097152
        maxResponseBodyBytes: 2097152
        memResponseBodyBytes: 2097152
        retryExpression: "StatusCode() == 502"
  • maxRequestBodyBytes: batas ukuran request; request lebih besar ditolak.
  • memRequestBodyBytes: batas yang boleh ditampung memori; sisanya di-stream ke disk.
  • maxResponseBodyBytes: batas ukuran response dari backend.
  • retryExpression: ekspresi yang memicu retry — di atas, retry dijalankan jika backend mengembalikan 502.

Memory vs Overhead

Buffering memberikan kontrol penuh tapi dengan harga: request besar ditampung di memori atau di-stream ke disk, menambah latensi dan penggunaan I/O. Untuk streaming besar seperti upload file, buffering bisa menjadi penghalang. Aturan praktis: aktifkan buffering hanya jika benar-benar butuh pemeriksaan isi atau batas ukuran yang ketat.

ContentType Middleware

Auto-Deteksi Content Type

ContentType menambahkan header Content-Type secara otomatis berdasarkan isi response, jika backend tidak menyediakannya:

Middleware ContentType
http:
  middlewares:
    auto-ct:
      contentType:
        autoDetect: true
  • autoDetect: true: Traefik menganalisis byte awal response untuk menentukan content type yang tepat.
  • Jika autoDetect: false, middleware menghapus Content-Type dari response backend.

Middleware ini berguna ketika backend mengembalikan payload tanpa header Content-Type — browser yang dibiarkan menebak bisa keliru menafsirkan data sebagai HTML dan membuka celah XSS. Pasangkan bersama X-Content-Type-Options: nosniff dari episode 10 untuk pertahanan berlapis.

Tip

Ukuran byte di atas ditulis dalam satuan byte: 1048576 sama dengan 1 megabyte. Kalau kalian terbiasa menulis 1MB, konversikan dulu — Traefik membaca angka mentah, bukan satuan.

Penutup

Inti yang harus dibawa pulang:

  • Compress mengompresi response dengan gzip atau brotli.
  • Jangan kompresi text/event-stream dan file yang sudah terkompresi.
  • Buffering menampung payload di memori dengan batas yang bisa diatur.
  • retryExpression pada buffering bisa memicu percobaan ulang berdasarkan status code.
  • ContentType menambahkan Content-Type yang benar jika backend lupa.
  • Kombinasikan dengan nosniff untuk mencegah MIME sniffing.

Di episode 14 selanjutnya kita memasuki fase TLS: TLS configuration — TLS termination versus passthrough, versi TLS dan cipher suites, TLSOption untuk konfigurasi lanjutan, sumber sertifikat dari file hingga Let's Encrypt, serta default certificate dan SNI. Di sinilah layanan kalian berpindah dari HTTP biasa ke HTTPS.

Belajar Traefik - Compression & Buffering | Belajar Traefik