Comment désactiver la compression d'image ?

Je gère un site où les passionnés de photographie partagent fréquemment leurs œuvres, et je souhaite désactiver toute compression d’image tout en activant le retrait des métadonnées. J’ai apporté les ajustements suivants :

J’ai défini la taille maximale des images à 40 Mo, la taille maximale en mégapixels à la valeur autorisée la plus élevée de 150 MP, et désactivé l’optimisation des images pour les médias du compositeur.

J’ai également ajusté les paramètres Nginx dans le conteneur.
Pour faire simple, j’ai ajouté :

client_header_timeout 1m;
client_body_timeout 1m;
proxy_connect_timeout 30s;
proxy_read_timeout 1m;
proxy_send_timeout 1m;

et modifié :

 # taille maximale de fichier upload (à maintenir à jour lors de la modification du paramètre correspondant du site)
  client_max_body_size 200m ;

dans server{} de /etc/nginx/nginx.conf.

J’ai ajouté :

        client_max_body_size  200m;
        client_header_timeout   1m;
        client_body_timeout     1m;
        proxy_connect_timeout  60s;
        proxy_read_timeout      1m;
        proxy_send_timeout      1m;

dans http{} de /etc/nginx/nginx.conf

Voici les configurations de /etc/nginx/nginx.conf et /etc/nginx/conf.d/discourse.conf :

root@iZj6cgi365ov99veqodfgnZ-app:/var/www/discourse# cat /etc/nginx/nginx.conf 
user www-data;
worker_processes auto;
daemon off;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 4000 ;
        # multi_accept on;
}

http {

        client_max_body_size  200m;
        client_header_timeout   1m;
        client_body_timeout     1m;
        proxy_connect_timeout  60s;
        proxy_read_timeout      1m;
        proxy_send_timeout      1m;

        ##
        # Paramètres de base
        ##

        sendfile on;
        tcp_nopush on;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # Paramètres SSL
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Suppression de SSLv3, réf. : POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Paramètres de journalisation
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Paramètres Gzip
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Configurations des hôtes virtuels
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}


#mail {
#       # Voir un script d'authentification d'exemple à :
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
#
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}

root@iZj6cgi365ov99veqodfgnZ-app:/var/www/discourse# cat /etc/nginx/conf.d/discourse.conf 
# Les types MIME supplémentaires que vous souhaitez que nginx gère vont ici
types {
    text/csv csv;
    application/wasm wasm;
}

upstream discourse { server 127.0.0.1:3000; }

# inactive signifie que nous conservons les éléments pendant 1440m minutes quelle que soit la dernière date d'accès (1 semaine)
# levels signifie qu'il s'agit d'une hiérarchie de 2 niveaux car nous pouvons avoir beaucoup de fichiers
# max_size limite la taille du cache
proxy_cache_path /var/nginx/cache inactive=1440m levels=1:2 keys_zone=one:10m max_size=600m;

# Augmenté par rapport à la valeur par défaut pour accommoder les gros cookies lors des flux oAuth2
# comme dans https://meta.discourse.org/t/x/74060 et les gros en-têtes CSP et Link (preload)
proxy_buffer_size 32k;
proxy_buffers 4 32k;

# Augmenté par rapport à la valeur par défaut pour permettre un grand volume de cookies dans les en-têtes de requête
# Discourse lui-même tente de minimiser la taille des cookies, mais nous ne pouvons pas contrôler les autres cookies définis par d'autres outils sur le même domaine.
large_client_header_buffers 4 32k;

# Si vous allez utiliser Puma, utilisez ceci :
#
# upstream discourse {
#   server unix:/var/www/discourse/tmp/sockets/puma.sock;
# }


# tentative de préserver le protocole, doit être dans le contexte http
map $http_x_forwarded_proto $thescheme {
  default $scheme;
  "~https$" https;
}

log_format log_discourse '[$time_local] "$http_host" $remote_addr "$request" "$http_user_agent" "$sent_http_x_discourse_route" $status $bytes_sent "$http_referer" $upstream_response_time $request_time "$upstream_http_x_discourse_username" "$upstream_http_x_discourse_trackview" "$upstream_http_x_queue_time" "$upstream_http_x_redis_calls" "$upstream_http_x_redis_time" "$upstream_http_x_sql_calls" "$upstream_http_x_sql_time"';

# Autoriser le contournement du cache depuis localhost
geo $bypass_cache {
  default         0;
  127.0.0.1       1;
  ::1             1;
}

limit_req_zone $binary_remote_addr zone=flood:10m rate=12r/s;
limit_req_zone $binary_remote_addr zone=bot:10m rate=200r/m;
limit_req_status 429;
limit_conn_zone $binary_remote_addr zone=connperip:10m;
limit_conn_status 429;
server {
  listen 80;
  return 301 https://kongjiang.org$request_uri;
}
server {
  access_log /var/log/nginx/access.log log_discourse;

  listen 443 ssl http2;
listen [::]:443 ssl http2;

client_header_timeout 1m;
client_body_timeout 1m;
proxy_connect_timeout 30s;
proxy_read_timeout 1m;
proxy_send_timeout 1m;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

ssl_certificate /shared/ssl/kongjiang.org.cer;
ssl_certificate /shared/ssl/kongjiang.org_ecc.cer;

ssl_certificate_key /shared/ssl/kongjiang.org.key;
ssl_certificate_key /shared/ssl/kongjiang.org_ecc.key;


ssl_session_tickets off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:1m;

gzip on;
add_header Strict-Transport-Security 'max-age=63072000';

if ($http_host != kongjiang.org) {
   rewrite (.*) https://kongjiang.org$1 permanent;
}


  gzip_vary on;
  gzip_min_length 1000;
  gzip_comp_level 5;
  gzip_types application/json text/css text/javascript application/x-javascript application/javascript image/svg+xml application/wasm;
  gzip_proxied any;

  # Décommentez et configurez cette section pour la prise en charge HTTPS
  # NOTE : Placez votre certificat SSL dans votre répertoire de configuration principal de nginx (/etc/nginx)
  #
  # rewrite ^/(.*) https://enter.your.web.hostname.here/$1 permanent;
  #
  # listen 443 ssl;
  # ssl_certificate your-hostname-cert.pem;
  # ssl_certificate_key your-hostname-cert.key;
  # ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  # ssl_ciphers HIGH:!aNULL:!MD5;
  #

  server_name _ ;
  server_tokens off;

  sendfile on;

  keepalive_timeout 65;

  # taille maximale de fichier upload (à maintenir à jour lors de la modification du paramètre correspondant du site)
  client_max_body_size 200m ;

  # chemin vers le répertoire public de discourse
  set $public /var/www/discourse/public;

  # sans les weak etags, nous n'obtenons aucun avantage des etags sur le contenu dynamiquement compressé
  # de plus, les etags sont basés sur le fichier dans nginx et non sur le hachage des données
  # utilisez les dates, cela résout le problème correctement même entre serveurs
  etag off;

  # empêcher le téléchargement direct des sauvegardes
  location ^~ /backups/ {
    internal;
  }

  # contourner la pile Rails avec un 204 bon marché pour les requêtes favicon.ico
  location /favicon.ico {
    return 204;
    access_log off;
    log_not_found off;
  }

  location / {
    root $public;
    add_header ETag "";

    # auth_basic on;
    # auth_basic_user_file /etc/nginx/htpasswd;

    location ~ ^/uploads/short-url/ {
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Request-Start "t=${msec}";
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $thescheme;
      proxy_pass http://discourse;
      break;
    }

    location ~ ^/(secure-media-uploads/|secure-uploads)/ {
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Request-Start "t=${msec}";
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $thescheme;
      proxy_pass http://discourse;
      break;
    }

    location ~* (fonts|assets|plugins|uploads)/.*\.(eot|ttf|woff|woff2|ico|otf)$ {
      expires 1y;
      add_header Cache-Control public,immutable;
      add_header Access-Control-Allow-Origin *;
    }

    location = /srv/status {
      access_log off;
      log_not_found off;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Request-Start "t=${msec}";
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $thescheme;
      proxy_pass http://discourse;
      break;
    }

    # un minimum de cache ici pour ne pas continuer à demander
    # à long terme, nous devrions probablement augmenter à 1 an
    location ~ ^/javascripts/ {
      expires 1d;
      add_header Cache-Control public,immutable;
      add_header Access-Control-Allow-Origin *;
    }

    location ~ ^/assets/(?<asset_path>.+)$ {
      expires 1y;
      # le pipeline d'actifs active ceci
      brotli_static on;
      gzip_static on;
      add_header Cache-Control public,immutable;
      # HOOK dans l'emplacement des actifs (utilisé pour l'extensibilité)
      # TODO Je ne pense pas que ce break soit nécessaire, il sort juste de la réécriture
      break;
    }

    location ~ ^/plugins/ {
      expires 1y;
      add_header Cache-Control public,immutable;
      add_header Access-Control-Allow-Origin *;
    }

    # cache des émojis
    location ~ /images/emoji/ {
      expires 1y;
      add_header Cache-Control public,immutable;
      add_header Access-Control-Allow-Origin *;
    }

    location ~ ^/uploads/ {

      # NOTE : c'est vraiment agaçant que nous ne puissions pas simplement définir les en-têtes
      # au niveau supérieur et les hériter.
      #
      # proxy_set_header n'hérite PAS, par conception, nous devons le répéter,
      # sinon les en-têtes ne sont pas définis correctement
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Request-Start "t=${msec}";
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $thescheme;
      proxy_set_header X-Sendfile-Type X-Accel-Redirect;
      proxy_set_header X-Accel-Mapping $public/=/downloads/;
      expires 1y;
      add_header Cache-Control public,immutable;

      ## règles optionnelles anti-hotlinking pour les téléchargements
      #valid_referers none blocked mysite.com *.mysite.com;
      #if ($invalid_referer) { return 403; }

      # CSS personnalisé
      location ~ /stylesheet-cache/ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }
      # cela nous permet de contourner Rails
      location ~* \.(gif|png|jpg|jpeg|bmp|tif|tiff|ico||avif)$ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }
      # SVG nécessite un en-tête supplémentaire attaché
      location ~* \.(svg)$ {
      }
      # vignettes et images optimisées
      location ~ /_?optimized/ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }

      proxy_pass http://discourse;
      break;
    }

    location ~ ^/admin/backups/ {
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Request-Start "t=${msec}";
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $thescheme;
      proxy_set_header X-Sendfile-Type X-Accel-Redirect;
      proxy_set_header X-Accel-Mapping $public/=/downloads/;
      proxy_pass http://discourse;
      break;
    }

    # Ce gros bloc est nécessaire pour que nous puissions activer sélectivement
    # l'accélération pour les sauvegardes, les avatars, les sprites, etc.
    # voir note sur la répétition ci-dessus
    location ~ ^/(svg-sprite/|letter_avatar/|letter_avatar_proxy/|user_avatar|highlight-js|stylesheets|theme-javascripts|favicon/proxied|service-worker) {
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Request-Start "t=${msec}";
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $thescheme;

      # si Set-Cookie est présent dans la réponse, rien n'est mis en cache
      # c'est doublement mauvais car nous ne passons pas last modified
      proxy_ignore_headers "Set-Cookie";
      proxy_hide_header "Set-Cookie";
      proxy_hide_header "X-Discourse-Username";
      proxy_hide_header "X-Runtime";

      # note : x-accel-redirect ne peut pas être utilisé avec proxy_cache
      proxy_cache one;
      proxy_cache_key "$scheme,$host,$request_uri";
      proxy_cache_valid 200 301 302 7d;
      proxy_cache_bypass $bypass_cache;
      proxy_pass http://discourse;
      break;
    }

    # nous devons désactiver le tamponnage pour le message bus
    location /message-bus/ {
      proxy_set_header X-Request-Start "t=${msec}";
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $thescheme;
      proxy_http_version 1.1;
      proxy_buffering off;
      proxy_pass http://discourse;
      break;
    }

    # cela signifie que chaque fichier dans public est essayé en premier
    try_files $uri @discourse;
  }

  location /downloads/ {
    internal;
    alias $public/;
  }

  location @discourse {
add_header Strict-Transport-Security 'max-age=31536000'; # rappeler le certificat pendant un an et se connecter automatiquement en HTTPS pour ce domaine  limit_conn connperip 20;
  limit_req zone=flood burst=12 nodelay;
  limit_req zone=bot burst=100 nodelay;
    proxy_set_header Host $http_host;
    proxy_set_header X-Request-Start "t=${msec}";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $thescheme;
    proxy_pass http://discourse;
  }

}

Malgré ces modifications, je reçois toujours une erreur « fichier trop volumineux » lors du téléchargement d’images supérieures à 15 Mo, et avec l’optimisation des images pour les médias du compositeur désactivée, les images échouent à être téléchargées.

Pourriez-vous m’indiquer quels autres paramètres je devrais ajuster ou s’il y a un problème avec ma configuration Nginx ?

Je suis nouveau dans Nginx et je me suis entièrement reposé sur Google et ChatGPT pour ces modifications.

Bonjour… Quelqu’un pourrait-il m’aider s’il vous plaît ?

Il semble que vous essayiez de résoudre deux problèmes à la fois ?

La désactivation de la compression d’images se fait en modifiant Admin - Paramètres - Fichiers - recompress original jpg quality à 100.

L’autre problème concerne la taille du fichier téléchargé.

Pouvez-vous s’il vous plaît poster l’erreur exacte ?

Est-ce que cela fonctionne avec ce paramètre activé ?

vous devez également modifier la valeur de client_max_body_size dans la configuration nginx de discourse docker.