1MB PDF를 업로드하면 «업로드 파일이 너무 큽니다. 최대 4MB입니다»라는 오류가 발생합니다

4MB 미만의 PDF 파일을 업로드할 때 « 업로드가 너무 큽니다. 최대 크기는 4MB입니다 »라는 오류 메시지가 표시됩니다.
다음은 제 테스트 결과입니다:

  • 68KB PDF는 예상대로 정상적으로 업로드됩니다.
  • 2.3M JPG도 예상대로 정상적으로 업로드됩니다.
  • a pdf (2.3 MB)의 2.3M PDF는 오류가 발생합니다!
  • 3.6MB JPG도 예상대로 정상적으로 업로드됩니다.

이상하게도 meta.discourse.org에서는 업로드가 성공적으로 진행됩니다. 설정을 변경한 것일까요?

max가 포함된 수정된 설정은 없습니다.

자체 호스팅 인스턴스 https://discuss.afpy.org에서 2.9.0.beta9 4af080d20b 버전을 사용하고 있습니다.

파일 크기 제한을 변경하지 않은 내 포럼에서는 이 파일에 문제가 없습니다.

테스트 사이트(4b561277a9)에서 max 설정이나 파일 제한을 변경하지 않은 상태로 직접 테스트해 보았습니다. authorized extensions에 pdf를 추가하면 정상적으로 업로드가 되며, 기본값으로 되돌리면 '죄송합니다. 업로드하려는 파일은 허용되지 않습니다’라는 올바른 오류 메시지가 표시됩니다.

재현을 확인해 볼 수 있도록 제가 시도해 볼 수 있는 다른 방법이 있을까요?

아니요, 해당 파일 크기는 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;
          }
      }

Debian bullseye에서 제공하는 nginx 1.18.0-6.1+deb11u2를 사용하고 있습니다.

nginx에서 413 Request Entity Too Large 오류가 발생하고 있습니다. 즉, “큰” 이미지는 괜찮은데 “크지 않은” PDF는 왜 안 되는지 더 깊이 파고들어야 하는 상황이네요…

3.0MB JPG의 Content-Length는 557215로, 놀랍게도 0.5MB입니다.
2.3MB PDF의 Content-Length는 2460137로, 놀랍지 않게도 2.3MB입니다.

Discourse가 업로드 전에 JPG를 리스케일하는 건가요?

통과하는 JPEG들을 살펴보면, Discourse에 업로드한 후 이미지의 너비와 높이가 달라지는 것을 확인할 수 있었습니다. (https://apod.nasa.gov/apod/image/2209/DSCF4968_PS_Lioce.jpg를 시도해 보았는데, 원래는 5703x3892 크기의 3.6MB 사진이지만, 업로드 후에는 1920×1310 크기의 153 KB가 되었습니다.)

nginx의 client_max_body_size 기본값은 1MB이며, 클라이언트 측에서 리스케일된 JPEG 파일은 모두 1MB 미만이었기 때문에 모든 것이 명확해졌습니다.

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

네! 이 멋진 기능에 대한 블로그 포스트도 있습니다.