Proyek: Reverse Proxy Multi-Service

Satu pintu nginx di depan dua service Python yang identik — pola dasar microservice: klien hanya mengenal satu alamat, routing path memutuskan service mana yang melayani, dan service backend tidak pernah mempublikasikan portnya ke luar jaringan Compose.

Topologi #

text
klien ──> proxy (nginx, port 8080 host)
            ├── /a/* ──> service-a:8080 (biru)   ┐ hanya di dalam
            └── /b/* ──> service-b:8080 (hijau)   ┘ jaringan Compose

Struktur Berkas #

BerkasPeran
compose.yamlService proxy, service-a, service-b
nginx/nginx.confKonfigurasi utama nginx: upstream + routing path
services/service-a/DockerfileImage service-a (python:3.12-alpine)
services/service-a/server.pyHTTP server backend
services/service-b/DockerfileImage service-b (identik, beda ENV)
services/service-b/server.pyHTTP server backend (byte-identik)
README.mdDokumen ini

Menjalankan #

bash
docker compose up -d --build

Menguji Routing #

bash
curl -s http://localhost:8080/          # indeks routing dari nginx
curl -s http://localhost:8080/a/halo    # dijawab service-a
curl -s http://localhost:8080/b/halo    # dijawab service-b
curl -s -i http://localhost:8080/c/halo # 404: tidak ada lokasi /c/

Perhatikan field path pada respons: /a/halo tiba di backend sebagai /halo — prefix dibuang oleh trailing slash pada proxy_pass.

Menguji Kegagalan Parsial #

Hentikan satu service; proxy dan service lainnya tetap hidup:

bash
docker compose stop service-b
curl -s -i http://localhost:8080/a/halo   # tetap 200 dari service-a
curl -s -i http://localhost:8080/b/halo   # 502 Bad Gateway dari nginx
docker compose start service-b            # pulih otomatis
curl -s http://localhost:8080/b/halo      # kembali 200

Membersihkan #

bash
docker compose down