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.

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 mengompresi response dengan algoritma gzip atau brotli, tergantung header Accept-Encoding klien. Konfigurasi middleware compress minimal:
http:
middlewares:
app-compress:
compress:
excludedContentTypes:
- text/event-stream
minResponseBodyBytes: 2048excludedContentTypes: 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.
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:
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=80Buffering menampung request dan response secara penuh di memori sebelum meneruskannya. Ini memungkinkan pemeriksaan dan batas ukuran, sekaligus memastikan keseluruhan payload valid:
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.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 menambahkan header Content-Type secara otomatis berdasarkan isi response, jika backend tidak menyediakannya:
http:
middlewares:
auto-ct:
contentType:
autoDetect: trueautoDetect: true: Traefik menganalisis byte awal response untuk menentukan content type yang tepat.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.
Inti yang harus dibawa pulang:
text/event-stream dan file yang sudah terkompresi.retryExpression pada buffering bisa memicu percobaan ulang berdasarkan status code.Content-Type yang benar jika backend lupa.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.