← Zurück zur Übersicht Nginx als API-Gateway: Traffic-Management für deine Microservices

Nginx als API-Gateway: Traffic-Management für deine Microservices

[WERBUNG: CONTENT OBEN]

Zähme das Microservice-Chaos!

Sobald dein Backend-Team mehr als einen einzigen Service baut (z.B. einen Authentication-Service und einen Product-Service), stößt du bei der lokalen Entwicklung schnell auf Probleme. Beide Services auf separaten Ports wie localhost:3001 und localhost:3002 hochzufahren, ist im Frontend Code ein Albtraum an Konfiguration.

Die Lösung aus der Industrie lautet: Reverse Proxy (API Gateway).

Wir stellen einen einzigen Nginx-Server als Türsteher auf Port 80. Dieser empfängt alle Anfragen und leitet sie (nur anhand der angefragten URL) intern völlig unsichtbar an den richtigen Container weiter. Genau das werden wir jetzt extrem effizient simulieren. Wir bauen eine isolierte Umgebung auf, in der Nginx unseren Traffic clever auf zwei winzige, von uns geschriebene Node.js-APIs verteilt.

Vorbereitung: Psychologische Sicherheit

Wir starten immer sauber. Ein lokales Setup kann schnell das Dateisystem deines PCs blockieren, wenn Konfigurationsdateien unsortiert herumliegen. Daher zwingen wir uns in eine geschützte Sandbox:

Öffne dein Terminal und führe diese Befehle aus:

mkdir local-api-gateway
cd local-api-gateway

Ab jetzt arbeiten wir strikt nur noch in diesem Ordner. Alles bleibt sauber!

Der Code: Zwei APIs und ihr Türsteher

Gemäß den Best-Practices nutzen wir ein docker-compose.yaml. Wir werden zwei separate Node.js-Dienste aufziehen und den Nginx-Dienst davorschalten. Lege exakt diese fünf Dateien in deinem neuen Ordner an:

local-api-gateway/package.json:

{
  "dependencies": {
    "express": "^4.18.2"
  }
}

local-api-gateway/api-auth.js (Unser Dienst Nummer 1):

const express = require('express');
const app = express();

app.get('/auth/status', (req, res) => {
  res.json({ service: 'AUTH_API', valid: true, msg: 'Du hast die Erlaubnis!' });
});

app.listen(3000, () => console.log('Auth API auf Port 3000 aktiv'));

local-api-gateway/api-shop.js (Unser Dienst Nummer 2):

const express = require('express');
const app = express();

app.get('/shop/products', (req, res) => {
  res.json({ service: 'SHOP_API', inventory: ['Apple', 'Banana'], msg: 'Hier sind die Produkte!' });
});

app.listen(3000, () => console.log('Shop API auf Port 3000 aktiv'));

local-api-gateway/nginx.conf (Die geniale Verteiler-Logik):

worker_processes 1;

events { worker_connections 1024; }

http {
    server {
        listen 80;

        # Wenn der Nutzer /auth aufruft, leite die Anfrage an den 'auth_service' Container!
        location /auth/ {
            proxy_pass         http://auth_service:3000;
            proxy_redirect     off;
        }

        # Wenn der Nutzer /shop aufruft, leite die Anfrage an den 'shop_service' Container!
        location /shop/ {
            proxy_pass         http://shop_service:3000;
            proxy_redirect     off;
        }
    }
}

local-api-gateway/docker-compose.yaml:

version: '3.8'

services:
  # Unser Reverse-Proxy (Türsteher)
  gateway:
    image: nginx:alpine
    container_name: local_nginx_gateway
    restart: unless-stopped
    ports:
      # Nur der Gateway ist von außen erreichbar (Port 80)
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - auth_service
      - shop_service

  # API 1
  auth_service:
    image: node:18-alpine
    container_name: local_auth_api
    working_dir: /app
    volumes:
      - ./api-auth.js:/app/api-auth.js
      - ./package.json:/app/package.json
    command: sh -c "npm install && node api-auth.js"
    # Port 3000 wird NICHT nach außen gereicht! Er existiert nur im internen Docker-Netz.

  # API 2
  shop_service:
    image: node:18-alpine
    container_name: local_shop_api
    working_dir: /app
    volumes:
      - ./api-shop.js:/app/api-shop.js
      - ./package.json:/app/package.json
    command: sh -c "npm install && node api-shop.js"

Die ultimative Magie: Umgebung hochfahren

Starte dieses geniale Setup, in dem Docker automatisch alle Netzwerke und Services verschaltet. Führe im Terminal aus:

docker compose up -d

⚠️ 📸 SCREENSHOT ANFRAGE: Hier einen Screenshot vom Terminal einfügen, der den erfolgreichen Start der drei Container (gateway, auth_service, shop_service) zeigt.

Der Test: Routing in Sekunden

Wir testen nun unsere Infrastruktur. Wie du im Compose File siehst, haben wir unsere APIs (auth_service und shop_service) absichtlich NICHT nach außen portiert. Nur Port 80 vom Nginx-Server ist ansprechbar.

Rufst du http://localhost/auth/status in deinem Browser ab, leitet dich Nginx nahtlos an den ersten Container weiter:

{"service":"AUTH_API","valid":true,"msg":"Du hast die Erlaubnis!"}

Besuchst du stattdessen http://localhost/shop/products, erkennt Nginx den Pfad /shop/ und gibt dein Netzwerkpakert zielsicher beim zweiten Container ab:

{"service":"SHOP_API","inventory":["Apple","Banana"],"msg":"Hier sind die Produkte!"}

Fazit

Mit einer Nginx-Konfiguration und etwas Compose-Magie löst du die Port-Höllen deiner lokalen Entwicklung auf immer! Dein Frontend kann entspannt Anfragen an localhost/shop/... und localhost/auth/... schießen – Nginx regelt leise und stabil den Traffic.

[WERBUNG: CONTENT UNTEN]