이미지 업로드 크기/리사이즈 관련 질문

이 주제, 이 주제, 그리고 이 주제를 읽어본 후에도 Discourse가 큰 이미지에 대해 정확히 어떻게 처리하는지 확신이 서지 않습니다. 이전에는 소프트웨어 기반 리사이징이 이루어지지 않으며 CSS만 사용된다고 이해하고 있었습니다. 즉, 이미지 크기는 maximum image upload size in kB(최대 이미지 업로드 크기)로 제한되고, 그 이상이면 원격 파일인 경우 링크로 처리되고, 그렇지 않으면 아예 업로드가 불가능하다고 생각했거든요.

하지만 해당 주제들에서 다운사이징과 최적화에 대해 언급하고 있어서 혼란스럽습니다. 제가 실제로 확인해 본 적도 없었기 때문에 그런 과정이 일어나고 있다는 생각은 하지 못했거든요. 또한 Maximum number of megapixels allowed for an image(이미지에 허용되는 최대 메가픽셀 수) 제한이 정확히 어떤 것에 적용되는지도 모르겠습니다. 이 제한은 해당 크기 이상의 이미지 업로드를 막는 건가요, 아니면 max upload size(최대 업로드 크기)를 초과하지 않는 한 한도를 넘는 이미지가 리사이즈되는 건가요?

후자라면, 왜 메가픽셀 기본 설정이 최대 업로드 크기에 비해 이렇게 큰가요? 4096 kB보다 작은 51메가픽셀 이미지를 게시하고 싶어 할 사람이 있을 가능성은 극히 낮아 보이는데요.


제가 원하는 것은 사용자가 파일 크기나 해상도를 걱정하지 않고 가지고 있는 이미지를 편리하게 업로드할 수 있고, 소프트웨어가 모바일 사용자나 느린 연결 환경에 있는 사람들을 힘들게 하지 않으면서도 적절한 결과물을 제공해주는 것입니다. 현재 max image size(최대 이미지 크기)와 max megapixels(최대 메가픽셀)만 조정하면 이것이 가능한가요?

이 모든 것은 기본적으로 작동합니다:

:arrow_double_up: 원본 보기에서 마우스 오른쪽 버튼을 클릭하면 이미지가 작게 표시됩니다. 이미지를 클릭하면 전체 해상도의 이미지를 볼 수 있습니다.

그렇다면 max upload를 10MB로, max megapixel을 12로 변경하면, 사용자가 7MB 크기의 16메가픽셀 이미지를 업로드하려고 할 때 어떤 일이 일어나나요?

기본 설정에서는 최신 스마트폰으로 촬영한 사진 중 상당수가 4096kB보다 크지만, 40메가픽셀에 근접하지는 않습니다.

아직도 어떤 경우에, 그리고 왜 기본값이 그렇게 설정되어 있는지 이해하지 못하고 있습니다.

설정을 조정해 보세요. 설정을 변경한 후 거대한 이미지를 업로드하고 어떤 일이 일어나는지 확인해 보세요.

네, 그렇게 할 수 있습니다. 하지만 소프트웨어가 실제로 무엇을 하는지 이해해서 더 나은 판단을 내리고 싶습니다. Discourse를 사용해 온 동안 기본 설정을 존중하고, 필요한 경우에만 변경하는 습관을 들였습니다. 이번에는 꽤 일반적인 커뮤니티에서 기본 설정이 잘 작동하지 않아서, 왜 그렇게 설정되어 있는지, 대신 어떤 합리적인 값을 고려해야 하는지, 그리고 해당 변경 사항을 적용하면 어떤 일이 일어나는지 궁금합니다.

코드를 살펴보면, 최대 메가픽셀은 하드 제한 사항입니다. 이는 시스템이 다운사이징을 결정하는 데 사용되는 것이 아니라 안전 장치 역할을 합니다.

업로드 시 자동 다운사이징의 유일한 결정 요인은 max_image_size_kb입니다.

최대 메가픽셀을 호스팅하고자 하는 절대적으로 가장 큰 메가픽셀 수로 늘리세요.

잠시 동안 버튼들을 눌러가며 이것저것 알아본 결과, 제가 파악한 내용은 다음과 같습니다:

  • 기본 설치 환경에서는 client_max_body_size가 max image size kb와 같으므로 이미지가 리사이즈되지 않습니다.

  • client_max_body_size를 증가시키면 더 큰 용량의 업로드가 허용되며, Discourse는 이후 max image size kb에 설정된 한도 이하로 이미지를 리사이즈하려고 시도합니다.

  • 설명문과는 달리 max image size kb는 실제로 업로드 크기를 제한하지 않습니다(이 부분이 정말 혼란스럽네요!)

  • 업로드 크기는 nginx의 client_max_body_size로만 설정됩니다.

  • 리사이즈 시 JPEG는 JPEG로 유지되며 결과가 좋습니다.
    PNG는 JPG로 변환되며 허용할 만한 결과를 보입니다.
    애니메이션 GIF는 GIF로 유지되지만 대체로 결과가 좋지 않습니다.

이 모든 내용이 정확한가요? 맞다면, 이는 좀 더 잘 설명되어야 할 것 같습니다. 기본 설치 환경에서는 이미지가 리사이즈되지 않지만, 많은 사용자가 원할 수 있는 기능임에도 불구하고 사용 가능한 문서에서는 이를 활성화하는 방법에 대해 전혀 명확하지 않으니까요.

음, 방금 GitHub에서 nginx.sample.conf 파일을 살펴봤는데, client_max_body_size의 기본값이 4MB가 아니라 10MB로 설정되어 있네요. 처음부터 이렇게 되어 있었나요? 오늘까지 제 설치 환경에서 해당 파일을 변경한 적이 없다고 기억하는데, 어떻게 된 건지 궁금합니다.

현재 버전으로 철저하게 테스트해 주셔서 감사합니다. 확인해 본 결과, 말씀하신 대로 실제로도 정상적으로 작동하는 것 같습니다.

최대 바디 사이즈가 꽤 오랫동안 10으로 유지되어 왔으니, 20으로 증가시키는 것이 좋을 것 같습니다.

사이트 설정 설명을 개선해야 한다는 데 동의합니다. 오늘 늦게 처리하겠습니다.

수정:

아래 링크에 따라 문서가 업데이트되었습니다:

https://review.discourse.org/t/doc-improve-documentation-of-image-limit-site-settings/9303

Sam, 설명을 참고해봤는데 제 환경에서는 동작하지 않는 것 같습니다:

+ max_image_size_kb: “최대 이미지 업로드 크기(kB). 이 값은 nginx(client_max_body_size) / apache 또는 프록시에서도 설정해야 합니다. 이 값보다 크고 client_max_body_size보다 작은 이미지는 업로드 시 해당 크기에 맞게 리사이즈됩니다.”

+ max_image_megapixels: “이미지에 허용되는 최대 메가픽셀 수. 메가픽셀 수가 더 높은 이미지는 거부됩니다.”

아니면 최소한 리사이즈가 시도조차 되지 않는 것 같습니다.

max_image_size_kb를 1000kb로 설정했는데, 이 크기보다 약간 큰 이미지는 링크로 대체되고 (image larger than 1000KB)라는 텍스트가 뒤에 붙었습니다.

설정을 500kb로 변경해도 같은 일이 발생했습니다.

NGINX의 client_max_body_size는 기본값(4096)일 것으로 추정하여 변경하지 않았습니다.

참고로 이 이미지들은 핫링크된 이미지입니다. (download remote images to local 옵션이 체크되어 있다면) 이는 표준 업로드처럼 처리되어야 하지 않나요? (아니라면 동일한 방식으로 동작하도록 수정해 주실 수 있을까요?)

수정: 직접 업로드하면 리사이즈가 정상적으로 동작하네요 - 좋아요! 즉, 원격에서 가져오는 이미지에서만 실패하는 것입니다. 이상적인 동작 방식이 무엇인지 정확히 모르겠지만, 첫印象中으로는 원격 이미지 역시 리사이즈되어야 한다고 생각합니다.

이건 별도의 기능 요청인 것 같아요. 최대 이미지 크기를 200k까지 낮추면 다운로드할 때 핫링크된 이미지를 리사이즈하는 것이 완전히 합리적입니다. 기준값이 관여되는데, 이걸 확인하려고 700기가바이트짜리 이미지를 다운로드하는 건 안 되겠지만, 그래도 일부는 더 개선할 수 있을 것 같습니다.

동의합니다, Sam. 솔직히 다운로드된 핫링크 이미지가 동일한 규칙을 따르는 것이 좋지 않은 이유를 생각할 수 없습니다.


또한 최대 이미지 크기를 변경하면 실제로 최종 파일 크기에 영향을 미친다는 것을 방금 발견했습니다 - 정말 멋진 점입니다! 500kb로 설정하면 1.2mb 이미지가 360kb로 리사이즈되었고, 200kb로 설정하면 동일한 파일이 118kb가 되었습니다 :+1: (물론 해상도도 작아지지만요).

수정: 아, 하지만 원래 문제가 다시 발생합니다 - 리사이즈하기에 너무 큰 이미지들이 다음과 같은 오류로 실패하는 문제입니다:

lib/discourse.rb:57:in `exec': convert: improper image header `/tmp/image20200228-23391-t365z9.jpg' @ error/png.c/ReadPNGImage/4294.

이미지가 아주 작아지더라도 DC가 항상 리사이즈를 수행할 수 있는 방법이 있는지 궁금합니다.


이것은 우리 포럼의 기본 설정입니다. 20000으로 변경해 보았는데 작동하는 것 같았지만(또는 설정이 유지되는 것처럼 보였지만), 17.2mb 크기의 이미지/GIF를 업로드하려고 했을 때 다음과 같은 오류 메시지가 나타났습니다:


nginx에서 "client_max_body_size"를 변경할 수 있는 리눅스 경로(입력할 명령어)가 무엇인지 알려 주실 수 있나요? 저는 DigitalOcean 드롭렛을 사용하고 있습니다.

이것은 기본값이 곧 4096에서 20000으로 변경될 것이라는 뜻인가요?

정말 훌륭해요, @riking! 고마워, 친구야!

/var/discourse 폴더 안에는 공유 폴더만 있습니다. 말씀하신 파일을 찾을 수 없습니다. 제 문제는 완전히 새로 설치한 Discourse에서 게시물의 이미지 업로드가 전혀 작동하지 않는다는 것입니다. 관리자 권한으로도 "죄송합니다. 파일 업로드 중 오류가 발생했습니다. 다시 시도해 주세요."라는 오류가 표시됩니다. 여러 번 시도해 보았지만 동일한 오류가 계속 나옵니다.

오류 로그에는 다음과 같이 표시됩니다:

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-ASN.mmdb)를 찾을 수 없음: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-ASN.mmdb

Discourse는 “텍스트 전용” 토론 그룹으로 설계된 것일까요? 최대 업로드 용량을 극단적으로 큰 값으로 설정해 보았지만, 7kb짜리 그래픽 파일조차 업로드할 수 없습니다.

/var/discourse에 아무것도 없다면 이전 버전의 설치를 사용하고 있을 수 있습니다. /var/docker도 확인해 보세요.

음, 재빌드(rebuild)를 시도해 볼까요? mmdb 키가 없는 경우를 올바르게 처리하지 못하는 오래된 베이스 이미지를 사용 중일 수 있습니다.

음, 자, 해당 폴더의 모습은 다음과 같습니다.


재구축하는 방법을 잘 모르겠습니다. 조언을 구합니다. 이는 VM에 설치된 완전히 새로운 설치 환경이며, 오류는 전혀 발생하지 않았습니다. 그래픽을 제외하면 모든 것이 정상적으로 작동하는 것 같습니다.

제이가 여기서 묻듯이: Uploading Files to Discourse - #3 by pfaffman
Discourse 공식 표준 설치를 수행하셨나요?