Como desativar a compactação de imagens?

Eu administro um site onde entusiastas de fotografia frequentemente compartilham suas obras, e quero desativar toda a compressão de imagem enquanto habilito a remoção de metadados. Fiz os seguintes ajustes:

Defini o tamanho máximo da imagem para 40 MB, defini os megapixels máximos da imagem para o valor máximo permitido de 150 MP e desativei a otimização de imagem de mídia do compositor.

Também ajustei as configurações do Nginx no contêiner.
Simplificando, adicionei

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

e modifiquei

 # tamanho máximo de upload de arquivo (mantenha atualizado ao alterar a configuração do site correspondente)
  client_max_body_size 200m ;

Em server{} em /etc/nginx/nginx.conf.

Adicionei

        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;

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

Aqui estão as configurações para /etc/nginx/nginx.conf e /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;

        ##
        # Configurações Básicas
        ##

        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;

        ##
        # Configurações SSL
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Removendo SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Configurações de Log
        ##

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

        ##
        # Configurações 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;

        ##
        # Configurações de Hospedagem Virtual
        ##

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


#mail {
#       # Veja script de autenticação de exemplo em:
#       # 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 
# Tipos MIME adicionais que você deseja que o nginx processe vão aqui
types {
    text/csv csv;
    application/wasm wasm;
}

upstream discourse { server 127.0.0.1:3000; }

# inativo significa que mantemos as coisas por 1440m minutos independentemente do último acesso (1 semana)
# níveis significa que é uma hierarquia de 2 níveis porque podemos ter muitos arquivos
# max_size limita o tamanho do cache
proxy_cache_path /var/nginx/cache inactive=1440m levels=1:2 keys_zone=one:10m max_size=600m;

# Aumentado do valor padrão para acomodar grandes cookies durante fluxos oAuth2
# como em https://meta.discourse.org/t/x/74060 e grandes cabeçalhos CSP e Link (preload)
proxy_buffer_size 32k;
proxy_buffers 4 32k;

# Aumentado do valor padrão para permitir um grande volume de cookies nos cabeçalhos de solicitação
# O próprio Discourse tenta minimizar o tamanho do cookie, mas não podemos controlar outros cookies definidos por outras ferramentas no mesmo domínio.
large_client_header_buffers 4 32k;

# Se você for usar o Puma, use estes:
#
# upstream discourse {
#   server unix:/var/www/discourse/tmp/sockets/puma.sock;
# }


# tenta preservar o protocolo, deve estar no contexto 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"';

# Permite contornar o cache do 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;

  # Descomente e configure esta seção para suporte a HTTPS
  # NOTA: Coloque seu certificado SSL no diretório principal de configuração do 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;

  # tamanho máximo de upload de arquivo (mantenha atualizado ao alterar a configuração do site correspondente)
  client_max_body_size 200m ;

  # caminho para o diretório público do Discourse
  set $public /var/www/discourse/public;

  # sem etags fracos não temos nenhum benefício de etags em conteúdo dinamicamente comprimido
  # além disso, os etags são baseados no arquivo no nginx, não no hash dos dados
  # use datas, isso resolve o problema bem mesmo entre servidores
  etag off;

  # prevenir download direto de backups
  location ^~ /backups/ {
    internal;
  }

  # contornar a pilha Rails com um 204 barato para solicitações de 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;
    }

    # algum cache mínimo aqui para não ficarmos perguntando constantemente
    # a longo prazo, devemos aumentar provavelmente para 1y
    location ~ ^/javascripts/ {
      expires 1d;
      add_header Cache-Control public,immutable;
      add_header Access-Control-Allow-Origin *;
    }

    location ~ ^/assets/(?<asset_path>.+)$ {
      expires 1y;
      # o pipeline de ativos habilita isso
      brotli_static on;
      gzip_static on;
      add_header Cache-Control public,immutable;
      # GANCHO no local do ativo (usado para extensibilidade)
      # TODO Não acho que esse break seja necessário, apenas sai do rewrite
      break;
    }

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

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

    location ~ ^/uploads/ {

      # NOTA: é realmente irritante que não possamos definir cabeçalhos
      # no nível superior e herdar.
      #
      # proxy_set_header NÃO herda, por design, devemos repeti-lo,
      # caso contrário, os cabeçalhos não são definidos corretamente
      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;

      ## regras opcionais de anti-hotlinking de upload
      #valid_referers none blocked mysite.com *.mysite.com;
      #if ($invalid_referer) { return 403; }

      # CSS personalizado
      location ~ /stylesheet-cache/ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }
      # isso nos permite contornar o Rails
      location ~* \.(gif|png|jpg|jpeg|bmp|tif|tiff|ico||avif)$ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }
      # SVG precisa de um cabeçalho extra anexado
      location ~* \.(svg)$ {
      }
      # miniaturas e imagens otimizadas
      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;
    }

    # Este grande bloco é necessário para que possamos habilitar seletivamente
    # aceleração para backups, avatares, sprites e assim por diante.
    # veja nota sobre repetição acima
    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;

      # se Set-Cookie estiver na resposta, nada é armazenado em cache
      # isso é duplamente ruim porque não estamos passando last modified
      proxy_ignore_headers "Set-Cookie";
      proxy_hide_header "Set-Cookie";
      proxy_hide_header "X-Discourse-Username";
      proxy_hide_header "X-Runtime";

      # note que x-accel-redirect não pode ser usado com 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;
    }

    # precisamos desligar o buffering para o 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;
    }

    # isso significa que cada arquivo em público é tentado primeiro
    try_files $uri @discourse;
  }

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

  location @discourse {
add_header Strict-Transport-Security 'max-age=31536000'; # lembre-se do certificado por um ano e conecte-se automaticamente ao HTTPS para este domínio  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;
  }

}

Apesar dessas alterações, ainda recebo um erro „arquivo muito grande“ ao fazer upload de imagens maiores que 15 MB e, com a otimização de imagem de mídia do compositor desativada, as imagens falham no upload.

Alguém poderia me orientar sobre quais outras configurações devo ajustar ou se há um problema com minha configuração do Nginx?

Sou novo no Nginx e dependi inteiramente do Google e do ChatGPT para essas modificações.

Olá… Alguém poderia ajudar, por favor?

Parece que você está tentando resolver dois problemas ao mesmo tempo?

Desativar a compressão de imagem é feito alterando Administrador - Configurações - Arquivos - recompress original jpg quality para 100.

O outro problema é sobre o tamanho do arquivo de upload.

Você pode, por favor, postar o erro exato?

Funciona com essa configuração ativada?

você tem que mudar o valor do client_max_body_size do nginx dentro do discourse docker também