Hébergement statique soutenu par MinIO/S3 utilisant le reverse proxy Traefik + nginx-s3-gateway
Le fichier docker-compose.yml suivant utilise nginx-s3-gateway pour proxifier les requêtes HTTP vers un backend de stockage compatible S3 configuré (en l’occurrence, MinIO). Cela offre des performances prêtes pour la production soutenues par Nginx, Inc., plus une grande configurabilité puisque, en interne, nginx-s3-gateway utilise nginx, il peut donc être configuré de manière flexible.
Voir Configuration simple Traefik docker-compose avec Lets Encrypt Cloudflare DNS-01 & TLS-ALPN-01 & HTTP-01 challenges pour plus de détails sur la façon dont nous configurons Traefik pour fonctionner avec ces labels de conteneurs.
services:
s3-gateway:
image: nginxinc/nginx-s3-gateway:latest
environment:
# Requis (voir la documentation du dépôt)
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"Résultats du benchmark
Utilisation de wrk pour benchmarker cela. Le serveur tourne sur un AMD Ryzen 5 3600 6-Core Processor avec exclusivement des disques durs (pas de SSD), avec MinIO servant le bucket S3 sur HTTPS. Le client est connecté via un réseau routé avec une latence de ping de 0,3ms.
$ 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: 6Comme on peut le voir dans les résultats, la configuration est capable de gérer une charge extrême avec une latence raisonnable et un faible taux d’erreur, même compte tenu de la configuration sous-optimale avec uniquement des disques durs plus le surcoût supplémentaire de TLS-vers-MinIO, ce qui la rend adaptée à des cas d’usage en production.