Kong API Gateway na VPS — instalacja i konfiguracja
Opublikowano: 10 kwietnia 2026 · Kategoria: VPS
Kiedy masz kilka mikroserwisów lub API i każdy wymaga rate limitingu, uwierzytelniania i logowania, wdrożenie tych funkcji oddzielnie w każdej aplikacji to marnotrawstwo. Kong API Gateway centralizuje te zadania — stoi przed wszystkimi serwisami i stosuje pluginy do każdego ruchu. Oparty na Nginx/OpenResty jest wydajny i może obsłużyć tysiące żądań na sekundę. Artykuł pokazuje instalację przez Docker Compose, konfigurację w trybie DB-less (bez bazy danych) i najważniejsze pluginy.
Architektura Konga
Kong składa się z trzech warstw: serwer proxy (port 8000/8443) przyjmuje ruch od klientów, Admin API (port 8001/8444) służy do konfiguracji, a opcjonalna baza danych (PostgreSQL) persystuje konfigurację między restartami. W trybie DB-less baza nie jest wymagana.
| Port | Protokół | Zastosowanie |
|---|---|---|
| 8000 | HTTP | Proxy — ruch API od klientów (HTTP) |
| 8443 | HTTPS | Proxy — ruch API od klientów (HTTPS) |
| 8001 | HTTP | Admin API — konfiguracja (tylko localhost!) |
| 8444 | HTTPS | Admin API TLS — konfiguracja (tylko localhost!) |
Instalacja — Docker Compose (tryb DB-less)
Tryb DB-less (declarative config) to najprostszy start — Kong wczytuje konfigurację z pliku YAML. Nie potrzeba PostgreSQL. Plik konfiguracyjny możesz trzymać w git i stosować przez CI/CD.
# docker-compose.yml — Kong DB-less # version: "3.8" # services: # kong: # image: kong:3.9 # container_name: kong # environment: # KONG_DATABASE: "off" # KONG_DECLARATIVE_CONFIG: /kong/declarative/kong.yaml # KONG_PROXY_ACCESS_LOG: /dev/stdout # KONG_ADMIN_ACCESS_LOG: /dev/stdout # KONG_PROXY_ERROR_LOG: /dev/stderr # KONG_ADMIN_ERROR_LOG: /dev/stderr # KONG_ADMIN_LISTEN: "127.0.0.1:8001" # KONG_PROXY_LISTEN: "0.0.0.0:8000, 0.0.0.0:8443 ssl" # volumes: # - ./kong.yaml:/kong/declarative/kong.yaml:ro # ports: # - "8000:8000" # - "8443:8443" # healthcheck: # test: ["CMD", "kong", "health"] # interval: 10s # timeout: 10s # retries: 10 # restart: unless-stopped docker-compose up -d docker-compose logs -f kong
Deklaratywna konfiguracja — kong.yaml
Cała konfiguracja Konga w trybie DB-less jest w jednym pliku YAML. Główne obiekty: Service (adres backendu), Route (reguła dopasowania żądania do Service) i Plugin (funkcja stosowana do Service lub Route).
# kong.yaml — pelna konfiguracja DB-less # _format_version: "3.0" # _transform: true # # services: # - name: my-api # url: http://api-backend:3000 # routes: # - name: api-route # paths: # - /api # strip_path: true # usuwa /api z URL do backendu # methods: # - GET # - POST # - PUT # - DELETE # plugins: # - name: rate-limiting # config: # minute: 100 # hour: 1000 # policy: local # # - name: public-api # url: http://public-backend:4000 # routes: # - name: public-route # paths: # - /public # strip_path: false # plugins: # - name: key-auth # config: # key_names: # - apikey # key_in_header: true # key_in_query: false # # consumers: # - username: client-a # keyauth_credentials: # - key: "super-secret-api-key-abc123" # # - username: client-b # keyauth_credentials: # - key: "another-key-xyz789"
Admin API — zarządzanie Kongiem
W trybie z PostgreSQL (nie DB-less) Kong udostępnia REST API do dynamicznej konfiguracji. Admin API słucha wyłącznie na localhost — nigdy nie wystawiaj portu 8001 na publiczne IP!
# Sprawdz status Konga
curl http://localhost:8001/
# Lista serwisów
curl http://localhost:8001/services
# Dodaj Service (tryb DB)
curl -X POST http://localhost:8001/services \
-d name=my-api \
-d url=http://backend:3000
# Dodaj Route do Service
curl -X POST http://localhost:8001/services/my-api/routes \
-d "paths[]=/api" \
-d "methods[]=GET" \
-d "methods[]=POST"
# Dodaj plugin rate-limiting do Service
curl -X POST http://localhost:8001/services/my-api/plugins \
-d name=rate-limiting \
-d config.minute=60 \
-d config.policy=local
# Dodaj plugin key-auth
curl -X POST http://localhost:8001/services/my-api/plugins \
-d name=key-auth \
-d config.key_names=apikey
# Dodaj consumera
curl -X POST http://localhost:8001/consumers \
-d username=my-client
# Nadaj klucz consumerowi
curl -X POST http://localhost:8001/consumers/my-client/key-auth \
-d key=my-secret-key-abc123
# Test — request z kluczem
curl http://localhost:8000/api/endpoint \
-H "apikey: my-secret-key-abc123"
# Test — przekroczony limit (odpowiedz 429)
for i in {1..70}; do
curl -s -o /dev/null -w "%{http_code}\n" \
http://localhost:8000/api/endpoint \
-H "apikey: my-secret-key-abc123"
done Przegląd kluczowych pluginów
| Plugin | Zastosowanie | Kluczowe parametry |
|---|---|---|
rate-limiting | Ograniczenie liczby żądań per consumer/IP | minute, hour, day, policy (local/redis) |
key-auth | Uwierzytelnianie kluczem API | key_names, key_in_header, key_in_query |
jwt | Weryfikacja tokenów JWT | claims_to_verify, secret_is_base64 |
oauth2 | Serwer OAuth2 (authorization_code, client_credentials) | scopes, provision_key |
request-transformer | Modyfikacja nagłówków/body przed przekazaniem do backendu | add.headers, remove.headers, replace |
response-transformer | Modyfikacja odpowiedzi z backendu | add.headers, remove.headers |
http-log | Wysyłanie logów do zewnętrznego serwera HTTP | http_endpoint, method, timeout |
cors | Obsługa CORS dla API | origins, methods, headers |
ip-restriction | Biała/czarna lista IP | allow, deny (CIDR obsługiwane) |
Plugin request-transformer — modyfikacja nagłówków
# Dodaj naglowek X-API-Version do kazdego requestu do backendu curl -X POST http://localhost:8001/services/my-api/plugins \ -d name=request-transformer \ -d "config.add.headers[]=X-API-Version:v2" \ -d "config.remove.headers[]=X-Internal-Token" \ -d "config.add.headers[]=X-Forwarded-By:kong" # Dodaj parametr query curl -X POST http://localhost:8001/routes/api-route/plugins \ -d name=request-transformer \ -d "config.add.querystring[]=format:json"
Monitorowanie i metryki
# Statystyki przez Admin API
curl http://localhost:8001/status
# latencies: {proxy: X, kong: Y, request: Z}
# Plugin Prometheus (dodaj do Konga)
# config: {} — brak wymaganych parametrow
curl -X POST http://localhost:8001/plugins \
-d name=prometheus
# Metryki dostepne na porcie 8001
curl http://localhost:8001/metrics
# kong_http_requests_total
# kong_latency_bucket
# kong_bandwidth_bytes
# Skonfiguruj Prometheus scrape config
# scrape_configs:
# - job_name: kong
# static_configs:
# - targets: ["localhost:8001"]
# metrics_path: /metrics