MinIO/S3-basiertes Static-Hosting mit Traefik-Reverse-Proxy + nginx-s3-gateway
Die folgende docker-compose.yml verwendet nginx-s3-gateway, um HTTP-Anfragen an ein konfiguriertes S3-kompatibles Speicher-Backend (in diesem Fall MinIO) weiterzuleiten. Dies bietet produktionsreife Leistung, die von Nginx, Inc. unterstützt wird, plus hohe Konfigurierbarkeit, da intern nginx-s3-gateway nginx verwendet, sodass es flexibel konfiguriert werden kann.
Siehe Einfaches Traefik docker-compose-Setup mit Lets Encrypt Cloudflare DNS-01 & TLS-ALPN-01 & HTTP-01-Challenges für Details dazu, wie wir Traefik für die Arbeit mit diesen Container-Labels einrichten.
services:
s3-gateway:
image: nginxinc/nginx-s3-gateway:latest
environment:
# Required (see repo docs)
S3_BUCKET_NAME: "mydomain-app"
AWS_ACCESS_KEY_ID: "mydomain-app-reader"
AWS_SECRET_ACCESS_KEY: "Ooch7rooD8yo8ooW6ohghahNgaeshu"
S3_SERVER: "minio.mydomain.com"
S3_REGION: "eu-central-1"
S3_STYLE: "path"
S3_SERVER_PORT: "443"
S3_SERVER_PROTO: "https"
AWS_SIGS_VERSION: "4"
PROVIDE_INDEX_PAGE: true
ALLOW_DIRECTORY_LIST: "false"
labels:
- "traefik.enable=true"
- "traefik.http.routers.app-mydomain.rule=Host(`app.mydomain.com`)"
- "traefik.http.routers.app-mydomain.entrypoints=websecure"
- "traefik.http.routers.app-mydomain.tls.certresolver=cloudflare-ec384"
- "traefik.http.routers.app-mydomain.tls.domains[0].main=mydomain.com"
- "traefik.http.routers.app-mydomain.tls.domains[0].sans=*.mydomain.com"Benchmark-Ergebnisse
Verwendung von wrk zum Benchmarken. Der Server läuft auf einem AMD Ryzen 5 3600 6-Core Processor mit ausschließlich HDDs (keine SSDs), wobei MinIO den S3-Bucket über HTTPS bereitstellt. Der Client ist über ein geroutetes Netzwerk mit 0,3ms Ping-Latenz verbunden.
$ wrk -t20 -c1000 -d30s --latency https://my.domain.com
Running 30s test @ https://my.domain.com/
20 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 55.16ms 77.11ms 1.92s 96.45%
Req/Sec 289.80 88.91 630.00 72.58%
Latency Distribution
50% 41.14ms
75% 53.31ms
90% 86.89ms
99% 439.90ms
171457 requests in 30.09s, 1.01GB read
Socket errors: connect 0, read 0, write 0, timeout 850
Non-2xx or 3xx responses: 6Wie aus den Ergebnissen ersichtlich, ist das Setup in der Lage, eine extreme Last mit angemessener Latenz und niedriger Fehlerrate zu bewältigen, selbst bei der suboptimalen HDD-only-Konfiguration plus zusätzlichem TLS-to-MinIO-Overhead, was es für Produktionsanwendungsfälle geeignet macht.