Wie man die Bildkomprimierung deaktiviert

Ich betreibe eine Website, auf der Fotografie-Enthusiasten häufig ihre Werke teilen, und möchte die Bildkomprimierung vollständig deaktivieren, während die Entfernung von Metadaten aktiviert bleibt. Ich habe folgende Anpassungen vorgenommen:

Ich habe die maximale Bildgröße auf 40 MB gesetzt, die maximale Bildgröße in Megapixeln auf den höchstzulässigen Wert von 150 MP festgelegt und die Optimierung von Medienbildern im Composer deaktiviert.

Außerdem habe ich die Nginx-Einstellungen im Container angepasst.
Kurz gesagt, habe ich folgendes hinzugefügt:

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

und folgende Zeile geändert:

 # maximale Dateigröße für Uploads (bei Änderung der entsprechenden Site-Einstellung aktuell halten)
  client_max_body_size 200m ;

in server{} in /etc/nginx/nginx.conf.

Zusätzlich habe ich folgendes eingefügt:

        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;

in http{} in /etc/nginx/nginx.conf.

Hier sind die Konfigurationen für /etc/nginx/nginx.conf und /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;

        ##
        # Basic Settings
        ##

        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;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # SSLv3 entfernen, Ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

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

        ##
        # Gzip Settings
        ##

        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;

        ##
        # Virtual Host Configs
        ##

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


#mail {
#       # Siehe Beispiel-Skript zur Authentifizierung unter:
#       # 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 
# Zusätzliche MIME-Typen, die nginx verarbeiten soll, kommen hier rein
types {
    text/csv csv;
    application/wasm wasm;
}

upstream discourse { server 127.0.0.1:3000; }

# inactive bedeutet, dass wir Inhalte 1440 Minuten (1 Woche) unabhängig vom letzten Zugriff vorhalten
# levels bedeutet, es ist eine 2-stufige Hierarchie, da wir viele Dateien haben können
# max_size begrenzt die Größe des Caches
proxy_cache_path /var/nginx/cache inactive=1440m levels=1:2 keys_zone=one:10m max_size=600m;

# Von Standardwert erhöht, um große Cookies während oAuth2-Flows zu ermöglichen
# wie in https://meta.discourse.org/t/x/74060 und große CSP- und Link-(Preload)-Header
proxy_buffer_size 32k;
proxy_buffers 4 32k;

# Von Standardwert erhöht, um eine große Anzahl von Cookies in Request-Headern zu erlauben
# Discourse selbst versucht, die Cookie-Größe zu minimieren, aber wir können andere Cookies, die von anderen Tools auf derselben Domain gesetzt werden, nicht kontrollieren.
large_client_header_buffers 4 32k;

# Wenn Sie Puma verwenden möchten, nutzen Sie diese:
#
# upstream discourse {
#   server unix:/var/www/discourse/tmp/sockets/puma.sock;
# }


# Versuch, das Protokoll beizubehalten, muss im http-Kontext stehen
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"';

# Umgehung des Caches von localhost zulassen
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;

  # Dieser Abschnitt für HTTPS-Unterstützung kommentieren und konfigurieren
  # HINWEIS: Legen Sie Ihr SSL-Zertifikat in Ihr Haupt-Nginx-Konfigurationsverzeichnis (/etc/nginx) ab
  #
  # 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;

  # maximale Dateigröße für Uploads (bei Änderung der entsprechenden Site-Einstellung aktuell halten)
  client_max_body_size 200m ;

  # Pfad zum öffentlichen Verzeichnis von Discourse
  set $public /var/www/discourse/public;

  # Ohne schwache ETags erhalten wir keinen Vorteil von ETags bei dynamisch komprimiertem Inhalt
  # Außerdem basieren ETags auf der Datei in nginx, nicht auf dem SHA des Dateninhalts
  # Verwenden Sie Datumsangaben, das löst das Problem auch serverübergreifend ordentlich
  etag off;

  # Direkten Download von Backups verhindern
  location ^~ /backups/ {
    internal;
  }

  # Rails-Stack mit einem günstigen 204 für favicon.ico-Anfragen umgehen
  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;
    }

    # etwas minimale Caching hier, damit wir nicht ständig fragen
    # langfristig sollten wir dies wahrscheinlich auf 1 Jahr erhöhen
    location ~ ^/javascripts/ {
      expires 1d;
      add_header Cache-Control public,immutable;
      add_header Access-Control-Allow-Origin *;
    }

    location ~ ^/assets/(?<asset_path>.+)$ {
      expires 1y;
      # Asset-Pipeline aktiviert dies
      brotli_static on;
      gzip_static on;
      add_header Cache-Control public,immutable;
      # HOOK im Asset-Standort (für Erweiterbarkeit verwendet)
      # TODO Ich glaube, dieser break ist nicht erforderlich, er bricht nur aus rewrite aus
      break;
    }

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

    # Emojis cachen
    location ~ /images/emoji/ {
      expires 1y;
      add_header Cache-Control public,immutable;
      add_header Access-Control-Allow-Origin *;
    }

    location ~ ^/uploads/ {

      # HINWEIS: Es ist wirklich ärgerlich, dass wir Header nicht einfach auf oberster Ebene definieren und vererben können.
      #
      # proxy_set_header wird per Design nicht vererbt, wir müssen ihn wiederholen,
      # sonst werden Header nicht korrekt gesetzt
      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;

      ## optionale Regeln gegen Hotlinking für Uploads
      #valid_referers none blocked mysite.com *.mysite.com;
      #if ($invalid_referer) { return 403; }

      # benutzerdefiniertes CSS
      location ~ /stylesheet-cache/ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }
      # dies ermöglicht uns, Rails zu umgehen
      location ~* \.(gif|png|jpg|jpeg|bmp|tif|tiff|ico||avif)$ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }
      # SVG benötigt einen zusätzlichen Header
      location ~* \.(svg)$ {
      }
      # Thumbnails & optimierte Bilder
      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;
    }

    # Dieser große Block ist erforderlich, damit wir Beschleunigung selektiv für Backups, Avatare, Sprites usw. aktivieren können.
    # Siehe Hinweis zur Wiederholung oben
    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;

      # wenn Set-Cookie in der Antwort enthalten ist, wird nichts gecacht
      # das ist doppelt schlecht, da wir last modified nicht übergeben
      proxy_ignore_headers "Set-Cookie";
      proxy_hide_header "Set-Cookie";
      proxy_hide_header "X-Discourse-Username";
      proxy_hide_header "X-Runtime";

      # Hinweis: x-accel-redirect kann nicht mit proxy_cache verwendet werden
      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;
    }

    # wir benötigen buffering aus für 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;
    }

    # das bedeutet, jede Datei in public wird zuerst versucht
    try_files $uri @discourse;
  }

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

  location @discourse {
add_header Strict-Transport-Security 'max-age=31536000'; # Zertifikat für ein Jahr merken und automatisch HTTPS für diese Domain verwenden  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;
  }

}

Trotz dieser Änderungen erhalte ich weiterhin einen Fehler „Datei zu groß“, wenn ich Bilder größer als 15 MB hochlade, und bei deaktivierter Optimierung von Medienbildern im Composer schlägt das Hochladen fehl.

Könnte mir jemand erklären, welche anderen Einstellungen ich anpassen sollte oder ob ein Problem mit meiner Nginx-Konfiguration vorliegt?

Ich bin neu bei Nginx und habe mich bei diesen Änderungen ausschließlich auf Google und ChatGPT verlassen.

Hallo… Kann mir bitte jemand helfen?

Es scheint, als ob Sie versuchen, zwei Probleme gleichzeitig zu lösen?

Das Deaktivieren der Bildkomprimierung erfolgt durch Ändern von Admin - Einstellungen - Dateien - recompress original jpg quality auf 100.

Das andere Problem betrifft die Upload-Dateigröße.

Können Sie bitte die genaue Fehlermeldung posten?

Funktioniert es mit dieser Einstellung aktiviert?

Sie müssen den Wert von client_max_body_size in der Nginx-Konfiguration auch innerhalb von Discourse Docker ändern.