최근 테스트 포럼을 3.3.0beta1로 업데이트했습니다. 이 테스트 포럼은 운영 중인 포럼의 내용을 기반으로 하되, 일부 구형 상태를 유지하고 있는 복사본입니다. 업데이트와 새 기능을 테스트하는 용도로 사용하며, 업로드에는 운영 포럼과 동일한 Amazon S3 연결을 사용합니다.
호스트 OS를 최신 Ubuntu 24.04. LTS로 업데이트하고 포럼을 3.3.0beta1로 업데이트한 후, 모든 사용자 지정 아바타가 사라지고 흰색/회색 머리 이미지가 표시되고 있습니다.
로그를 확인해 보니 다음과 같은 메시지가 발견되었습니다:
Could not find file in the store located at url: //ourbucket.s3.dualstack.eu-central-1.amazonaws.com/original/3X/6/9/69ca9110f27d91561axyz52a9cd9485a970fe9.jpeg
하지만 실제로 해당 URL에는 이미지가 존재하며 정상적으로 작동합니다. 서버에서 파일을 wget으로 받아와서 DNS 문제나 로컬 아바타 프록시가 파일을 가져오는 것을 방해할 수 있는 기타 문제가 있는지 확인해 보았지만, 그런 문제도 아닌 것으로 확인되었습니다.
테스트 서버(3.3.0beta1 실행 중)에 새로운 아바타 이미지를 업로드했습니다. 업로드 자체는 성공했고 미리보기에도 표시되었지만, 다시 로드하지 못했습니다.
/var/www/discourse/app/models/optimized_image.rb:81:in `block in create_for'
/var/www/discourse/app/models/optimized_image.rb:19:in `block (2 levels) in lock'
/var/www/discourse/lib/distributed_mutex.rb:53:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize'
/var/www/discourse/app/models/optimized_image.rb:19:in `block in lock'
/var/www/discourse/lib/distributed_mutex.rb:53:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize'
/var/www/discourse/app/models/optimized_image.rb:18:in `lock'
/var/www/discourse/app/models/optimized_image.rb:73:in `create_for'
/var/www/discourse/app/models/upload.rb:130:in `get_optimized_image'
/var/www/discourse/app/controllers/user_avatars_controller.rb:218:in `get_optimized_image'
/var/www/discourse/app/controllers/user_avatars_controller.rb:136:in `show_in_site'
/var/www/discourse/app/controllers/user_avatars_controller.rb:89:in `block (2 levels) in show'
/var/www/discourse/lib/hijack.rb:64:in `instance_eval'
/var/www/discourse/lib/hijack.rb:64:in `block in hijack'
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:911:in `callback_on_resolution'
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:797:in `call_callback'
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:803:in `call_callbacks'
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:692:in `resolve_with'
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:1325:in `resolve'
/var/www/discourse/lib/scheduler/defer.rb:115:in `block in do_work'
rails_multisite-5.0.1/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
rails_multisite-5.0.1/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/lib/scheduler/defer.rb:109:in `do_work'
/var/www/discourse/lib/scheduler/defer.rb:97:in `block (2 levels) in start_thread'
이것은 로그에서 가져온 내용입니다.
해당 로그 메시지는 다음과 같습니다:
Could not find file in the store located at url: //ourbucket.s3.dualstack.eu-central-1.amazonaws.com/original/3X/0/2/02832e36e27bbad791fda46e2290df31e5ee2dda.jpeg
(URL을 수정하여 실제 URL은 작동하지만 위 URL은 작동하지 않도록 했습니다)
‘block in hijack’ 부분이 가장 의아합니다.
실제 시스템은 Cloudflare 뒤에 실행되고 있습니다. 테스트 시스템은 “DNS only” 설정이므로 당연히 Cloudflare를 통해 필터링되지 않습니다. 최근 메인 사이트에서 봇 관련 문제가 있어 Cloudflare 필터를 꽤 많이 조정해 보았습니다.
그런데 amazonaws.com URL에서 가져오는 것이 왜 문제가 되며, 게다가 테스트 사이트는 Cloudflare를 전혀 거치지 않고 실행되고 있습니다.
그 문제로 정말 막혀 있습니다. 라이브 포럼과 테스트 포럼 모두에 영향을 미치는 것 같습니다. 라이브는 아직 이전 버전을 사용 중이며, 문제는 업데이트로 인해 시작된 것이 아니라 몇 일 전 아무런 눈에 띄는 변경 사항 없이 갑자기 발생한 것으로 보입니다.
즉, Discourse는 새로운 사용자 지정 아바타를 S3에 올바르게 업로드하고, 제가 볼 수 있는 한 ACL도 올바르게 설정하며, Discourse가 아바타 프록시로 가져오려고 사용하는 URL을 통해 파일도 공개적으로 접근 가능합니다. 그럼에도 불구하고 가져오는 데 실패합니다(위 스택 트레이스 참조).
아바타 프록시가 어떻게 작동하는지에 대해 잘 아시는 분이 이 문제에 대해 아이디어를 주실 수 있거나, 해당 스택 트레이스에서 어떤 정보를 추출해 내실 수 있을까요?
서버에서 이미지 URL에 대해 wget을 실행해 보았는데 모두 정상적으로 작동합니다. 따라서 해당 URL 접근을 차단하는 요인은 없는 것으로 보입니다.
아 네, 명확하지 않아서 죄송합니다. 브라우저에서 접근할 수 있습니다(따라서 공개적으로 사용 가능하다고 가정했습니다) 그리고 서버에서도 접근할 수 있습니다(서버가 이를 가져오는 데 문제가 있는 것을 배제하기 위함입니다). 실제로는 어떤 이유에서인지 Discourse가 이를 가져오지 못하는 것뿐입니다(위 스택 트레이스를 참조하세요).