При загрузке PDF-файла размером 1 МБ получаю ошибку: «файл слишком большой, максимум 4 МБ»

При загрузке PDF-файлов размером менее 4 МБ я получаю сообщение об ошибке «загрузка слишком велика, максимальный размер — 4 МБ».Вот результаты моих тестов:

  • PDF размером 68 КБ загружается нормально, как и ожидалось.
  • JPG размером 2,3 МБ загружается нормально, как и ожидалось.
  • PDF-файл|вложение (2,3 МБ) размером 2,3 МБ вызывает ошибку!
  • JPG размером 3,6 МБ загружается нормально, как и ожидалось.

Странно, что на meta.discourse.org загрузка проходит успешно — возможно, вы изменили некоторые настройки.

Я не менял настройки, содержащие max.

Я использую версию 2.9.0.beta9 4af080d20b на самостоятельно размещённом экземпляре по адресу https://discuss.afpy.org.

С этим файлом на моём форуме проблем нет, так как я не менял лимит размера файла.

Я проверил это на своём тестовом сайте (4b561277a9) без изменений в настройках max или ограничениях на файлы. У меня загрузка работает корректно, если добавить pdf в authorized extensions, и выводится правильное сообщение об ошибке «Извините, файл, который вы пытаетесь загрузить, не разрешён», когда настройки возвращены к значениям по умолчанию.

Есть ли что-то ещё, что я мог бы попробовать, чтобы воспроизвести проблему?

Нет, так как размер этого файла меньше стандартного лимита nginx. Однако это хорошая подсказка.

На сайте, который @Julien_Palard размещает самостоятельно, между Discourse и браузером работает кастомный обратный прокси-сервер, поэтому эта ошибка, вероятно, вызвана неправильной конфигурацией обратного прокси.

Используется ли у вас обратный прокси перед Discourse? Как вы его установили?

Я использую nginx, моя конфигурация выглядит так:

Таким образом, мой конфиг nginx:

      server
      {
          listen [::]:80; listen 80;
          server_name {{ discourse_domain }};
          access_log /var/log/nginx/{{ discourse_domain }}-access.log;
          error_log /var/log/nginx/{{ discourse_domain }}-error.log;
          return 301 https://$host$request_uri;
      }
      server
      {
          listen [::]:443 ssl; listen 443 ssl;
          server_name {{ discourse_domain }};
          access_log /var/log/nginx/{{ discourse_domain }}-access.log;
          error_log /var/log/nginx/{{ discourse_domain }}-error.log;
          include snippets/letsencrypt-{{ discourse_domain }}.conf;
          location / {
              proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
              proxy_set_header Host $http_host;
              proxy_http_version 1.1;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto https;
              proxy_set_header X-Real-IP $remote_addr;
          }
      }

Это nginx 1.18.0-6.1+deb11u2 из Debian bullseye.

Я получаю ошибку 413 Request Entity Too Large от nginx, так что мне явно нужно копнуть глубже, чтобы понять, почему «большое» изображение проходит, а «не такое уж большое» PDF-файл — нет…

JPG размером 3,0 МБ имеет Content-Length 557215, то есть неожиданно всего 0,5 МБ!
PDF размером 2,3 МБ имеет Content-Length 2460137, то есть ожидаемо 2,3 МБ.

Перед загрузкой Discourse изменяет размер JPG?

На моих JPEG-изображениях я вижу, что после загрузки в Discourse ширина и высота изображения меняются (попробовал с https://apod.nasa.gov/apod/image/2209/DSCF4968_PS_Lioce.jpg — это картинка 5703×3892 пикселей, 3,6 МБ, но после загрузки она стала 1920×1310 пикселей и весит всего 153 КБ.

По умолчанию в nginx параметр client_max_body_size установлен на 1 МБ, все клиентские рескейленные JPEG-изображения имеют размер менее 1 МБ, и теперь всё стало ясно.

Я исправил конфигурацию nginx: Set client_max_body_size to 4m to match Discourse configuration. · AFPy/infra@861af29 · GitHub

Теперь всё работает. Вы были правы: проблема была в моём обратном прокси.

Спасибо всем :heart: и извините за шум!

Я не хочу ошибочно добавить тег unsupported-install, но, думаю, эта тема должна была иметь его с самого начала, верно?

Что ж, есть темы, объясняющие, как настроить обратный прокси-сервер, поэтому мы обычно помогаем с этим.

Angry Season 4 GIF by The Office

ДА! И у нас даже есть статья в блоге об этой супер крутой функции