Middleware adalah salah satu fitur Traefik yang dapat digunakan untuk memodifikasi request sebelum dikirimkan ke server aplikasi. Beberapa middleware yang tersedia di Traefik dapat mengubah request dan header, sebagian menangani redirect, dan sebagian lainnya untuk menambahkan autentikasi.
BasicAuth #
BasicAuth digunakan untuk melindungi dashboard Traefik atau aplikasi dengan HTTP Basic Authentication.
Membuat user dan password #
Buat user dan password dengan htpasswd
:
htpasswd -nb admin secure_password | sed -e s/\\$/\\$\\$/g
Konfigurasi di traefik.yaml
#
http:
middlewares:
test-auth:
basicAuth:
users:
- "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"
- "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"
Konfigurasi menggunakan label #
labels:
- "traefik.http.middlewares.test-auth.basicauth.users=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/,test2:$$apr1$$d9hr9HBB$$4HxwgUir3HP4EsggP/QNo0"
Buffering #
Middleware Buffering digunakan untuk mengelola request/response buffering. Contoh kasus: membatasi size upload file ke website maksimal 2MB.
Konfigurasi di traefik.yaml
#
http:
middlewares:
limit:
buffering:
maxRequestBodyBytes: 2000000
Konfigurasi menggunakan label #
labels:
- "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"
Compress #
Middleware Compress digunakan untuk mengompresi response. Traefik mendukung kompresi Gzip, Brotli, dan Zstandard.
Konfigurasi di traefik.yaml
#
http:
middlewares:
compress:
compress:
excludedContentTypes:
- "text/event-stream"
- "application/octet-stream"
- "image/jpeg"
- "image/png"
- "image/gif"
- "application/pdf"
minResponseBodyBytes: 1024
encodings:
- "br"
- "gzip"
Penjelasan:
excludedContentTypes
digunakan untuk mengecualikan tipe konten tertentu agar tidak dikompresi.minResponseBodyBytes
menentukan ukuran minimum body response yang akan dikompresi.
IPAllowList #
Middleware IPAllowList digunakan untuk membatasi akses hanya dari IP tertentu. Request dari IP yang tidak termasuk dalam daftar akan ditolak.
Konfigurasi di traefik.yaml
#
http:
middlewares:
test-ipallowlist:
ipAllowList:
sourceRange:
- "127.0.0.1/32"
- "192.168.1.7"
Konfigurasi menggunakan label #
labels:
- "traefik.http.middlewares.test-ipallowlist.ipallowlist.sourcerange=127.0.0.1/32,192.168.1.7"
InFlightReq #
Middleware InFlightReq digunakan untuk mencegah service mengalami high load akibat trafik tidak wajar (misalnya DDoS) dengan cara membatasi jumlah koneksi simultan.
Konfigurasi di traefik.yaml
#
http:
middlewares:
in-flight-limiter:
inFlightReq:
amount: 10
Konfigurasi menggunakan label #
labels:
- "traefik.http.middlewares.test-inflightreq.inflightreq.amount=10"
Load testing dengan Vegeta #
Untuk melakukan load testing, bisa menggunakan tool Vegeta:
# Install Vegeta
go install github.com/tsenart/vegeta@latest
# Basic test
echo "GET http://localhost/" | vegeta attack -rate=10 -duration=5s | tee results.bin | vegeta report
RateLimit #
Middleware RateLimit digunakan untuk membatasi jumlah request per detik.
Konfigurasi di traefik.yaml
#
http:
middlewares:
test-ratelimit:
rateLimit:
average: 100
burst: 50
Pada contoh di atas:
- Rata-rata 100 request/detik diperbolehkan.
- Ditambah burst sebanyak 50 request secara mendadak masih diterima.
Retry #
Middleware Retry digunakan untuk mengulangi request ke backend jika server tidak merespons, dengan jumlah percobaan dan interval tertentu.
Konfigurasi di traefik.yaml
#
http:
middlewares:
test-retry:
retry:
attempts: 3
initialInterval: 100ms
Pada contoh di atas:
- Request akan diulang 3 kali jika gagal.
- Interval awal antar percobaan adalah 100ms, menggunakan exponential backoff.
Circuit Breaker #
Middleware Circuit Breaker digunakan untuk mencegah penumpukan request ke service yang tidak sehat (unhealthy).
Konfigurasi di traefik.yaml
#
http:
middlewares:
latency-check:
circuitBreaker:
expression: "NetworkErrorRatio() > 0.20 || ResponseCodeRatio(500, 600, 0, 600) > 0.25"
checkPeriod: "10s"
fallbackDuration: "30s"
recoveryDuration: "60s"
responseCode: 503
Penjelasan parameter:
expression
: kondisi pemicu circuit breaker (misalnya error ratio atau response code tertentu).checkPeriod
: interval pengecekan kondisi.fallbackDuration
: durasi circuit breaker tetap open setelah dipicu.recoveryDuration
: waktu yang dibutuhkan sebelum mencoba recovery.responseCode
: kode HTTP yang dikembalikan ke client saat circuit breaker aktif.
⚡ Tips: Middleware ini dapat dikombinasikan dengan Retry untuk meningkatkan resilience sistem.