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.

docker-compose.yml
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_benchmark.txt
$ 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: 6

Comme 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.


Check out similar posts by category: Nginx, Traefik, S3