로그에 DistributedMutex 오류 경고가 자주 나타남

Discourse는 1Panel 컨테이너로 배포되어 있으며, 역방향 프록시를 설정하여 접근하고 있습니다. 이 사이트는 개인 지식 관리 용도로 사용되며, 회원가입은 개방되어 있지 않고 저 혼자만 온라인으로 접속하고 있습니다. VPS 사양은 10 vCore (ARM64), 16 GB RAM, 512 GB NVMe입니다.

discourse 로그에 다음과 유사한 오류 경고가 빈번하게 나타납니다:

DistributedMutex(“memoize_lock_post##2f7d40f44a4b0fa66a711ca8f2ff9278fed9fa72”): held for too long, expected max: 1 secs, took an extra 1 secs

activesupport-8.0.5/lib/active_support/broadcast_logger.rb:218:in ‘block in ActiveSupport::BroadcastLogger#dispatch’

activesupport-8.0.5/lib/active_support/broadcast_logger.rb:217:in ‘Array#map’

activesupport-8.0.5/lib/active_support/broadcast_logger.rb:217:in ‘ActiveSupport::BroadcastLogger#dispatch’

activesupport-8.0.5/lib/active_support/broadcast_logger.rb:129:in ‘ActiveSupport::BroadcastLogger#warn’

/var/www/discourse/lib/distributed_mutex.rb:103:in ‘DistributedMutex#warn’

/var/www/discourse/lib/distributed_mutex.rb:57:in ‘block in DistributedMutex#synchronize’

/var/www/discourse/lib/distributed_mutex.rb:49:in ‘Thread::Mutex#synchronize’

/var/www/discourse/lib/distributed_mutex.rb:49:in ‘DistributedMutex#synchronize’

/var/www/discourse/lib/distributed_mutex.rb:34:in ‘DistributedMutex.synchronize’

/var/www/discourse/lib/distributed_memoizer.rb:12:in ‘DistributedMemoizer.memoize’

/var/www/discourse/app/controllers/posts_controller.rb:208:in ‘PostsController#create’

actionpack-8.0.5/lib/action_controller/metal/basic_implicit_render.rb:8:in ‘ActionController::BasicImplicitRender#send_action’

actionpack-8.0.5/lib/abstract_controller/base.rb:215:in ‘AbstractController::Base#process_action’

actionpack-8.0.5/lib/action_controller/metal/rendering.rb:193:in ‘ActionController::Rendering#process_action’

actionpack-8.0.5/lib/abstract_controller/callbacks.rb:261:in ‘block in AbstractController::Callbacks#process_action’

activesupport-8.0.5/lib/active_support/callbacks.rb:120:in ‘block in ActiveSupport::Callbacks#run_callbacks’

/var/www/discourse/app/controllers/application_controller.rb:452:in ‘block in ApplicationController#with_resolved_locale’

i18n-1.14.8/lib/i18n.rb:354:in ‘I18n::Base#with_locale’

/var/www/discourse/app/controllers/application_controller.rb:452:in ‘ApplicationController#with_resolved_locale’

activesupport-8.0.5/lib/active_support/callbacks.rb:129:in ‘block in ActiveSupport::Callbacks#run_callbacks’

/var/www/discourse/app/controllers/application_controller.rb:1103:in ‘ApplicationController#ensure_dont_cache_page’

activesupport-8.0.5/lib/active_support/callbacks.rb:129:in ‘block in ActiveSupport::Callbacks#run_callbacks’

activesupport-8.0.5/lib/active_support/callbacks.rb:140:in ‘ActiveSupport::Callbacks#run_callbacks’

actionpack-8.0.5/lib/abstract_controller/callbacks.rb:260:in ‘AbstractController::Callbacks#process_action’

actionpack-8.0.5/lib/action_controller/metal/rescue.rb:27:in ‘ActionController::Rescue#process_action’

actionpack-8.0.5/lib/action_controller/metal/instrumentation.rb:76:in ‘block in ActionController::Instrumentation#process_action’

activesupport-8.0.5/lib/active_support/notifications.rb:210:in ‘block in ActiveSupport::Notifications.instrument’

activesupport-8.0.5/lib/active_support/notifications/instrumenter.rb:58:in ‘ActiveSupport::Notifications::Instrumenter#instrument’

activesupport-8.0.5/lib/active_support/notifications.rb:210:in ‘ActiveSupport::Notifications.instrument’

actionpack-8.0.5/lib/action_controller/metal/instrumentation.rb:75:in ‘ActionController::Instrumentation#process_action’

actionpack-8.0.5/lib/action_controller/metal/params_wrapper.rb:259:in ‘ActionController::ParamsWrapper#process_action’

activerecord-8.0.5/lib/active_record/railties/controller_runtime.rb:39:in ‘ActiveRecord::Railties::ControllerRuntime#process_action’

actionpack-8.0.5/lib/abstract_controller/base.rb:152:in ‘AbstractController::Base#process’

actionview-8.0.5/lib/action_view/rendering.rb:40:in ‘ActionView::Rendering#process’

rack-mini-profiler-4.0.1/lib/mini_profiler/profiling_methods.rb:90:in ‘block in ActionController::Base#profile_method’

actionpack-8.0.5/lib/action_controller/metal.rb:252:in ‘ActionController::Metal#dispatch’

actionpack-8.0.5/lib/action_controller/metal.rb:335:in ‘ActionController::Metal.dispatch’

actionpack-8.0.5/lib/action_dispatch/routing/route_set.rb:67:in ‘ActionDispatch::Routing::RouteSet::Dispatcher#dispatch’

actionpack-8.0.5/lib/action_dispatch/routing/route_set.rb:50:in ‘ActionDispatch::Routing::RouteSet::Dispatcher#serve’

actionpack-8.0.5/lib/action_dispatch/journey/router.rb:53:in ‘block in ActionDispatch::Journey::Router#serve’

actionpack-8.0.5/lib/action_dispatch/journey/router.rb:133:in ‘block in ActionDispatch::Journey::Router#find_routes’

actionpack-8.0.5/lib/action_dispatch/journey/router.rb:126:in ‘Array#each’

actionpack-8.0.5/lib/action_dispatch/journey/router.rb:126:in ‘ActionDispatch::Journey::Router#find_routes’

actionpack-8.0.5/lib/action_dispatch/journey/router.rb:34:in ‘ActionDispatch::Journey::Router#serve’

actionpack-8.0.5/lib/action_dispatch/routing/route_set.rb:908:in ‘ActionDispatch::Routing::RouteSet#call’

/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:35:in ‘Middleware::OmniauthBypassMiddleware#call’

/var/www/discourse/lib/middleware/crawler_hooks.rb:13:in ‘Middleware::CrawlerHooks#call’

rack-2.2.23/lib/rack/tempfile_reaper.rb:15:in ‘Rack::TempfileReaper#call’

rack-2.2.23/lib/rack/conditional_get.rb:40:in ‘Rack::ConditionalGet#call’

rack-2.2.23/lib/rack/head.rb:12:in ‘Rack::Head#call’

actionpack-8.0.5/lib/action_dispatch/http/permissions_policy.rb:38:in ‘ActionDispatch::PermissionsPolicy::Middleware#call’

/var/www/discourse/lib/content_security_policy/middleware.rb:12:in ‘ContentSecurityPolicy::Middleware#call’

/var/www/discourse/lib/middleware/anonymous_cache.rb:420:in ‘Middleware::AnonymousCache#call’

/var/www/discourse/lib/middleware/csp_script_nonce_injector.rb:12:in ‘Middleware::CspScriptNonceInjector#call’

/var/www/discourse/lib/middleware/track_view_session_id_injector.rb:12:in ‘Middleware::TrackViewSessionIdInjector#call’

/var/www/discourse/config/initializers/008-rack-cors.rb:14:in ‘Discourse::Cors#call’

rack-2.2.23/lib/rack/session/abstract/id.rb:266:in ‘Rack::Session::Abstract::Persisted#context’

rack-2.2.23/lib/rack/session/abstract/id.rb:260:in ‘Rack::Session::Abstract::Persisted#call’

actionpack-8.0.5/lib/action_dispatch/middleware/cookies.rb:706:in ‘ActionDispatch::Cookies#call’

actionpack-8.0.5/lib/action_dispatch/middleware/callbacks.rb:31:in ‘block in ActionDispatch::Callbacks#call’

activesupport-8.0.5/lib/active_support/callbacks.rb:100:in ‘ActiveSupport::Callbacks#run_callbacks’

actionpack-8.0.5/lib/action_dispatch/middleware/callbacks.rb:30:in ‘ActionDispatch::Callbacks#call’

actionpack-8.0.5/lib/action_dispatch/middleware/debug_exceptions.rb:31:in ‘ActionDispatch::DebugExceptions#call’

actionpack-8.0.5/lib/action_dispatch/middleware/show_exceptions.rb:32:in ‘ActionDispatch::ShowExceptions#call’

logster-2.21.0/lib/logster/middleware/reporter.rb:40:in ‘Logster::Middleware::Reporter#call’

/var/www/discourse/lib/middleware/default_headers.rb:13:in ‘Middleware::DefaultHeaders#call’

railties-8.0.5/lib/rails/rack/logger.rb:41:in ‘Rails::Rack::Logger#call_app’

railties-8.0.5/lib/rails/rack/logger.rb:29:in ‘Rails::Rack::Logger#call’

/var/www/discourse/config/initializers/100-quiet_logger.rb:20:in ‘DiscourseRackQuietAssetsLogger#call’

/var/www/discourse/config/initializers/100-silence_logger.rb:29:in ‘SilenceLogger#call’

actionpack-8.0.5/lib/action_dispatch/middleware/request_id.rb:34:in ‘ActionDispatch::RequestId#call’

/var/www/discourse/lib/middleware/enforce_hostname.rb:23:in ‘Middleware::EnforceHostname#call’

rack-2.2.23/lib/rack/method_override.rb:24:in ‘Rack::MethodOverride#call’

actionpack-8.0.5/lib/action_dispatch/middleware/executor.rb:16:in ‘ActionDispatch::Executor#call’

rack-2.2.23/lib/rack/sendfile.rb:127:in ‘Rack::Sendfile#call’

rack-mini-profiler-4.0.1/lib/mini_profiler.rb:191:in ‘Rack::MiniProfiler#call’

message_bus-4.5.2/lib/message_bus/rack/middleware.rb:60:in ‘MessageBus::Rack::Middleware#call’

/var/www/discourse/lib/middleware/request_tracker.rb:372:in ‘Middleware::RequestTracker#call’

actionpack-8.0.5/lib/action_dispatch/middleware/remote_ip.rb:96:in ‘ActionDispatch::RemoteIp#call’

/var/www/discourse/lib/middleware/overload_protections.rb:18:in ‘Middleware::OverloadProtections#call’

/var/www/discourse/lib/middleware/processing_request.rb:14:in ‘Middleware::ProcessingRequest#call’

railties-8.0.5/lib/rails/engine.rb:535:in ‘Rails::Engine#call’

railties-8.0.5/lib/rails/railtie.rb:226:in ‘Kernel#public_send’

railties-8.0.5/lib/rails/railtie.rb:226:in ‘Rails::Railtie.method_missing’

rack-2.2.23/lib/rack/urlmap.rb:74:in ‘block in Rack::URLMap#call’

rack-2.2.23/lib/rack/urlmap.rb:58:in ‘Array#each’

rack-2.2.23/lib/rack/urlmap.rb:58:in ‘Rack::URLMap#call’

rack-2.2.23/lib/rack/tempfile_reaper.rb:15:in ‘Rack::TempfileReaper#call’

pitchfork-0.18.2/lib/pitchfork/chunked.rb:105:in ‘Pitchfork::Chunked#call’

rack-2.2.23/lib/rack/content_length.rb:17:in ‘Rack::ContentLength#call’

pitchfork-0.18.2/lib/pitchfork/http_server.rb:868:in ‘Pitchfork::HttpServer#process_client’

pitchfork-0.18.2/lib/pitchfork/http_server.rb:1017:in ‘Pitchfork::HttpServer#worker_loop’

pitchfork-0.18.2/lib/pitchfork/http_server.rb:616:in ‘block in Pitchfork::HttpServer#spawn_worker’

pitchfork-0.18.2/lib/pitchfork/http_server.rb:1222:in ‘block in Pitchfork::HttpServer#fork_sibling’

pitchfork-0.18.2/lib/pitchfork.rb:170:in ‘block in Pitchfork.clean_fork’

pitchfork-0.18.2/lib/pitchfork.rb:168:in ‘Kernel#catch’

pitchfork-0.18.2/lib/pitchfork.rb:168:in ‘Pitchfork.clean_fork’

pitchfork-0.18.2/lib/pitchfork/http_server.rb:690:in ‘Pitchfork::HttpServer#spawn_initial_mold’

pitchfork-0.18.2/lib/pitchfork/http_server.rb:176:in ‘Pitchfork::HttpServer#start’

pitchfork-0.18.2/exe/pitchfork:110:in ‘<top (required)>’

/var/www/discourse/vendor/bundle/ruby/3.4.0/bin/pitchfork:25:in ‘Kernel#load’

/var/www/discourse/vendor/bundle/ruby/3.4.0/bin/pitchfork:25:in '<

제 VPS 구성은 다음과 같습니다.

이 문제는 리버스 프록시로 인해 직접적으로 발생한 것이 아닐 가능성이 높습니다.

API를 통해 생성된 게시글의 경우, Discourse는 중복된 API 게시글 생성을 방지하기 위해 PostsController#create 주위에 DistributedMemoizer를 사용합니다. 이 메모라이저는 유효 기간이 1초로 매우 짧은 Redis 기반 DistributedMutex를 사용합니다. 이 경고는 해당 잠금(lock) 내부에서 수행되는 게시글 생성/시리얼라이징 작업이 예상보다 오래 걸렸음을 의미합니다.

즉:

  • API 게시글이 여전히 성공적으로 생성된다면, 이는 근본적인 실패가 아니라 경고 수준입니다.
  • expected max: 1 secs, took an extra 1 secs는 잠금이 약 2초 동안 유지되었음을 의미합니다.
  • 이 문제는 nginx/1Panel 리버스 프록시 자체보다는 서버 성능, Redis/Postgres 지연 시간, 디스크 I/O, CPU/RAM 부하, 플러그인 또는 느린 후처리(post-processing)와 관련이 있을 가능성이 더 높습니다.
  • API 게시글 작성 시에만 나타나는 이유는 이 메모라이저 경로가 API 요청에 사용되기 때문입니다.

확인해 볼 가치가 있는 사항:

  1. API 요청이 성공하여 게시글이 하나만 생성되는가?
  2. 클라이언트 측에서 API 요청에 걸리는 시간은 얼마나 되는가?
  3. API 게시글 작성 중 CPU, 메모리, 스왑 또는 디스크 I/O가 포화 상태인가?
  4. Redis와 Postgres가 동일한 컨테이너/호스트 내에 있으며, 정상적으로 작동 중인가?
  5. 이미지/업로드 없이 아주 작은 일반 텍스트 게시글만 작성해도 경고가 여전히 발생하는가?
  6. 비표준 플러그인이 설치되어 있는가?

이것은 표준 Discourse Docker 설치 방식이 아닌 1Panel/컨테이너 배포 환경이므로, Discourse 코어 버그로 판단하기 전에 가능하면 공식 지원되는 설치 환경에서 재현해 보는 것도 도움이 될 수 있습니다.

답변해 주셔서 감사합니다.

제 웹사이트는 주로 개인 지식 관리 용도로 사용하며, 가입 기능이 비활성화되어 있어 온라인에 있는 사용자는 저 혼자입니다. VPS 사양은 10 vCore (ARM64), 16 GB RAM, 512 GB NVMe입니다. 성능에는 문제가 없을 것 같습니다.

1. API 요청이 성공했고, 게시물이 하나만 생성되었나요?

네, API를 통한 게시물 등록에 성공했으며, 게시물은 하나만 생성되었습니다.

2. 클라이언트 관점에서 API 요청에 걸린 시간은 얼마였나요?

이 정보는 어떻게 확인하나요? 잘 모르겠습니다.

3. API로 게시물을 등록하는 동안 CPU, 메모리, 스왑 공간 또는 디스크 I/O가 포화 상태였나요?

모니터링 기록을 확인해 보니, API로 게시물을 등록할 당시 해당 리소스 사용량이 포화 상태가 아니었습니다.

4. Redis와 Postgres가 동일한 컨테이너/호스트 내에 있으며 정상적으로 실행되고 있나요?

동일한 컨테이너 내에 있으며 정상적으로 실행되고 있습니다.

5. 이미지나 업로드 콘텐츠가 없는 순수 텍스트의 짧은 게시물을 등록해도 경고가 여전히 나타나요?

순수 텍스트의 짧은 게시물을 등록해도 경고가 나타납니다.

6. 비표준 플러그인이 설치되어 있나요?

공식 기본 설치 플러그인을 제외한 다른 플러그인은 설치되어 있지 않습니다.

방금 AI 플러그인을 끄고 API를 통해 게시글을 작성했는데, 로그에 경고가 표시되지 않았습니다.
다시 AI 플러그인을 켜고 API를 통해 게시글을 작성해도 로그에 경고가 나오지 않았습니다.
한 번 더 관찰하고 테스트해 보겠습니다.

감사합니다. 그 추가 정보가 유용합니다.

ARM64 환경에서 실행 중이시므로, 이는 관련이 있을 수 있습니다. Discourse의 ARM/aarch64 컨테이너 지원은 역사적으로 x86_64와 비교했을 때 몇 가지 특별한 처리가 있었기 때문에, 토픽 제목이나 첫 번째 게시물에 이를 명확히 언급하는 것이 좋습니다.

AI 플러그인의 결과도 흥미롭습니다. AI 플러그인을 비활성화한 후 경고가 사라졌지만, 재활성화한 후 즉시 다시 나타나지 않았으므로, 이는 일회성 초기화, 캐시 워밍업, 모델/프로바이더 설정 또는 백그라운드 상태와 같은 요인 때문일 수 있으며, 일관되게 재현되는 플러그인 버그는 아닐 수 있습니다.

이 시점에서는 계속 관찰하는 것이 좋겠지만, 다시 발생한다면 다음 사항들을 기록해 보시기 바랍니다:

  1. 모든 비공개 내용을 제거한 정확한 API 엔드포인트와 페이로드 형식;
  2. 경보가 재시작/재빌드 후 첫 번째 API 게시에서만 나타나는지, 아니면 모든 API 게시에서 나타나는지;
  3. 클라이언트 측 요청 소요 시간;
  4. AI 플러그인을 비활성화하면 여러 테스트에 걸쳐 경고가 일관되게 제거되는지;
  5. 테스트가 가능하다면 x86_64에서도 동일한 현상이 나타나는지, 아니면 ARM64에서만 나타나는지.

클라이언트 측 요청 소요 시간을 확인하려면 curl을 타이밍 출력 옵션과 함께 사용할 수 있습니다. 예를 들어:

curl -s -o /dev/null \
  -w "total=%{time_total}s connect=%{time_connect}s starttransfer=%{time_starttransfer}s\n" \
  -X POST "https://your-site.example.com/posts.json" \
  -H "Api-Key: YOUR_API_KEY" \
  -H "Api-Username: YOUR_USERNAME" \
  --data-urlencode "title=API timing test" \
  --data-urlencode "raw=Small plain text API test post" \
  --data-urlencode "category=1"

요청 자체가 약 2초 이상 걸린다면, 뮤텍스 경고는 단순히 게시 생성 경로가 Discourse가 예상한 시간보다 오래 걸렸다는 것을 보고하는 것일 가능성이 높습니다. 반면, 요청은 매우 빠르지만 경고가 여전히 나타난다면 이는 더 흥미로운 상황이 됩니다.

하드웨어는 단일 사용자 사이트에 대해 충분히 여유 있어 보이므로, 이는 단순한 자원 부족보다는 아키텍처/배포/플러그인 경로에 특정한 문제일 수 있습니다.

일정 기간 동안 discourse ai를 꺼두면 이 경고가 여전히 나타나는지 확인해 보겠습니다.

현재 테스트 결과에 따르면, 경고 로그의 발생은 Discourse AI가 활성화되어 있는지 여부와 무관합니다.

테스트해 주셔서 감사합니다.

그렇다면 AI 플러그인을 주요 원인으로 보기는 어렵겠습니다. 단순한 우연이거나, 비활성화/재활성화 사이클이 일시적으로 일부 상태(transient state)를 변경했을 가능성도 있습니다.

가장 유용하게 활용할 수 있는 다음 단계는 아마도 요청 타이밍과 경고가 나타나는 패턴을 파악하는 일일 것입니다.

예를 들어:

curl -s -o /dev/null \
  -w "total=%{time_total}s connect=%{time_connect}s starttransfer=%{time_starttransfer}s\n" \
  -X POST "https://your-site.example.com/posts.json" \
  -H "Api-Key: YOUR_API_KEY" \
  -H "Api-Username: YOUR_USERNAME" \
  --data-urlencode "title=API timing test" \
  --data-urlencode "raw=Small plain text API test post" \
  --data-urlencode "category=1"

경고가 다시 나타나는 경우, 다음 사항들을 비교해 보면 도움이 될 것입니다:

  1. 클라이언트 측의 time_total 값;
  2. 가끔 발생하는지, 아니면 모든 API 게시글 작성 시마다 발생하는지;
  3. 재시작/재빌드 후에 발생하는지, 아니면 정상 실행 중에 발생하는지;
  4. 여러 API 요청이 짧은 시간 간격으로 연속해서 보내지는지;
  5. 동일한 API 호출이 게시글을 성공적으로 한 번만 생성하는지.

현재 상황으로 보아, 게시글 작성 실패나 중복 게시글 문제의 증거라기보다는, API 게시글 생성 경로가 짧은 뮤텍스(mutex) 윈도우보다 더 오래 걸리면서 발생하는 경고로 보입니다.

오늘 게시글이 생성되지 않았으며, 로그에도 경고가 한 번 나타났습니다


DistributedMutex("memoize_lock_post##59c6dac7790176d15fddc068dea5f734b254f591"): held for too long, expected max: 1 secs, took an extra 1 secs
activesupport-8.0.5/lib/active_support/broadcast_logger.rb:218:in 'block in ActiveSupport::BroadcastLogger#dispatch' 
activesupport-8.0.5/lib/active_support/broadcast_logger.rb:217:in 'Array#map' 
activesupport-8.0.5/lib/active_support/broadcast_logger.rb:217:in 'ActiveSupport::BroadcastLogger#dispatch' 
activesupport-8.0.5/lib/active_support/broadcast_logger.rb:129:in 'ActiveSupport::BroadcastLogger#warn' 
/var/www/discourse/lib/distributed_mutex.rb:103:in 'DistributedMutex#warn' 
/var/www/discourse/lib/distributed_mutex.rb:57:in 'block in DistributedMutex#synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:49:in 'Thread::Mutex#synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:49:in 'DistributedMutex#synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:34:in 'DistributedMutex.synchronize' 
/var/www/discourse/lib/distributed_memoizer.rb:12:in 'DistributedMemoizer.memoize' 
/var/www/discourse/app/controllers/posts_controller.rb:208:in 'PostsController#create' 
actionpack-8.0.5/lib/action_controller/metal/basic_implicit_render.rb:8:in 'ActionController::BasicImplicitRender#send_action' 
actionpack-8.0.5/lib/abstract_controller/base.rb:215:in 'AbstractController::Base#process_action' 
actionpack-8.0.5/lib/action_controller/metal/rendering.rb:193:in 'ActionController::Rendering#process_action' 
actionpack-8.0.5/lib/abstract_controller/callbacks.rb:261:in 'block in AbstractController::Callbacks#process_action' 
activesupport-8.0.5/lib/active_support/callbacks.rb:120:in 'block in ActiveSupport::Callbacks#run_callbacks' 
/var/www/discourse/app/controllers/application_controller.rb:452:in 'block in ApplicationController#with_resolved_locale' 
i18n-1.14.8/lib/i18n.rb:354:in 'I18n::Base#with_locale' 
/var/www/discourse/app/controllers/application_controller.rb:452:in 'ApplicationController#with_resolved_locale' 
activesupport-8.0.5/lib/active_support/callbacks.rb:129:in 'block in ActiveSupport::Callbacks#run_callbacks' 
/var/www/discourse/app/controllers/application_controller.rb:1103:in 'ApplicationController#ensure_dont_cache_page' 
activesupport-8.0.5/lib/active_support/callbacks.rb:129:in 'block in ActiveSupport::Callbacks#run_callbacks' 
activesupport-8.0.5/lib/active_support/callbacks.rb:140:in 'ActiveSupport::Callbacks#run_callbacks' 
actionpack-8.0.5/lib/abstract_controller/callbacks.rb:260:in 'AbstractController::Callbacks#process_action' 
actionpack-8.0.5/lib/action_controller/metal/rescue.rb:27:in 'ActionController::Rescue#process_action' 
actionpack-8.0.5/lib/action_controller/metal/instrumentation.rb:76:in 'block in ActionController::Instrumentation#process_action' 
activesupport-8.0.5/lib/active_support/notifications.rb:210:in 'block in ActiveSupport::Notifications.instrument' 
activesupport-8.0.5/lib/active_support/notifications/instrumenter.rb:58:in 'ActiveSupport::Notifications::Instrumenter#instrument' 
activesupport-8.0.5/lib/active_support/notifications.rb:210:in 'ActiveSupport::Notifications.instrument' 
actionpack-8.0.5/lib/action_controller/metal/instrumentation.rb:75:in 'ActionController::Instrumentation#process_action' 
actionpack-8.0.5/lib/action_controller/metal/params_wrapper.rb:259:in 'ActionController::ParamsWrapper#process_action' 
activerecord-8.0.5/lib/active_record/railties/controller_runtime.rb:39:in 'ActiveRecord::Railties::ControllerRuntime#process_action' 
actionpack-8.0.5/lib/abstract_controller/base.rb:152:in 'AbstractController::Base#process' 
actionview-8.0.5/lib/action_view/rendering.rb:40:in 'ActionView::Rendering#process' 
rack-mini-profiler-4.0.1/lib/mini_profiler/profiling_methods.rb:90:in 'block in ActionController::Base#profile_method' 
actionpack-8.0.5/lib/action_controller/metal.rb:252:in 'ActionController::Metal#dispatch' 
actionpack-8.0.5/lib/action_controller/metal.rb:335:in 'ActionController::Metal.dispatch' 
actionpack-8.0.5/lib/action_dispatch/routing/route_set.rb:67:in 'ActionDispatch::Routing::RouteSet::Dispatcher#dispatch' 
actionpack-8.0.5/lib/action_dispatch/routing/route_set.rb:50:in 'ActionDispatch::Routing::RouteSet::Dispatcher#serve' 
actionpack-8.0.5/lib/action_dispatch/journey/router.rb:53:in 'block in ActionDispatch::Journey::Router#serve' 
actionpack-8.0.5/lib/action_dispatch/journey/router.rb:133:in 'block in ActionDispatch::Journey::Router#find_routes' 
actionpack-8.0.5/lib/action_dispatch/journey/router.rb:126:in 'Array#each' 
actionpack-8.0.5/lib/action_dispatch/journey/router.rb:126:in 'ActionDispatch::Journey::Router#find_routes' 
actionpack-8.0.5/lib/action_dispatch/journey/router.rb:34:in 'ActionDispatch::Journey::Router#serve' 
actionpack-8.0.5/lib/action_dispatch/routing/route_set.rb:908:in 'ActionDispatch::Routing::RouteSet#call' 
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:35:in 'Middleware::OmniauthBypassMiddleware#call' 
/var/www/discourse/lib/middleware/crawler_hooks.rb:13:in 'Middleware::CrawlerHooks#call' 
rack-2.2.23/lib/rack/tempfile_reaper.rb:15:in 'Rack::TempfileReaper#call' 
rack-2.2.23/lib/rack/conditional_get.rb:40:in 'Rack::ConditionalGet#call' 
rack-2.2.23/lib/rack/head.rb:12:in 'Rack::Head#call' 
actionpack-8.0.5/lib/action_dispatch/http/permissions_policy.rb:38:in 'ActionDispatch::PermissionsPolicy::Middleware#call' 
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in 'ContentSecurityPolicy::Middleware#call' 
/var/www/discourse/lib/middleware/anonymous_cache.rb:420:in 'Middleware::AnonymousCache#call' 
/var/www/discourse/lib/middleware/csp_script_nonce_injector.rb:12:in 'Middleware::CspScriptNonceInjector#call' 
/var/www/discourse/lib/middleware/track_view_session_id_injector.rb:12:in 'Middleware::TrackViewSessionIdInjector#call' 
/var/www/discourse/config/initializers/008-rack-cors.rb:14:in 'Discourse::Cors#call' 
rack-2.2.23/lib/rack/session/abstract/id.rb:266:in 'Rack::Session::Abstract::Persisted#context' 
rack-2.2.23/lib/rack/session/abstract/id.rb:260:in 'Rack::Session::Abstract::Persisted#call' 
actionpack-8.0.5/lib/action_dispatch/middleware/cookies.rb:706:in 'ActionDispatch::Cookies#call' 
actionpack-8.0.5/lib/action_dispatch/middleware/callbacks.rb:31:in 'block in ActionDispatch::Callbacks#call' 
activesupport-8.0.5/lib/active_support/callbacks.rb:100:in 'ActiveSupport::Callbacks#run_callbacks' 
actionpack-8.0.5/lib/action_dispatch/middleware/callbacks.rb:30:in 'ActionDispatch::Callbacks#call' 
actionpack-8.0.5/lib/action_dispatch/middleware/debug_exceptions.rb:31:in 'ActionDispatch::DebugExceptions#call' 
actionpack-8.0.5/lib/action_dispatch/middleware/show_exceptions.rb:32:in 'ActionDispatch::ShowExceptions#call' 
logster-2.21.0/lib/logster/middleware/reporter.rb:40:in 'Logster::Middleware::Reporter#call' 
/var/www/discourse/lib/middleware/default_headers.rb:13:in 'Middleware::DefaultHeaders#call' 
railties-8.0.5/lib/rails/rack/logger.rb:41:in 'Rails::Rack::Logger#call_app' 
railties-8.0.5/lib/rails/rack/logger.rb:29:in 'Rails::Rack::Logger#call' 
/var/www/discourse/config/initializers/100-quiet_logger.rb:20:in 'DiscourseRackQuietAssetsLogger#call' 
/var/www/discourse/config/initializers/100-silence_logger.rb:29:in 'SilenceLogger#call' 
actionpack-8.0.5/lib/action_dispatch/middleware/request_id.rb:34:in 'ActionDispatch::RequestId#call' 
/var/www/discourse/lib/middleware/enforce_hostname.rb:23:in 'Middleware::EnforceHostname#call' 
rack-2.2.23/lib/rack/method_override.rb:24:in 'Rack::MethodOverride#call' 
actionpack-8.0.5/lib/action_dispatch/middleware/executor.rb:16:in 'ActionDispatch::Executor#call' 
rack-2.2.23/lib/rack/sendfile.rb:127:in 'Rack::Sendfile#call' 
rack-mini-profiler-4.0.1/lib/mini_profiler.rb:191:in 'Rack::MiniProfiler#call' 
message_bus-4.5.2/lib/message_bus/rack/middleware.rb:60:in 'MessageBus::Rack::Middleware#call' 
/var/www/discourse/lib/middleware/request_tracker.rb:372:in 'Middleware::RequestTracker#call' 
actionpack-8.0.5/lib/action_dispatch/middleware/remote_ip.rb:96:in 'ActionDispatch::RemoteIp#call' 
/var/www/discourse/lib/middleware/overload_protections.rb:18:in 'Middleware::OverloadProtections#call' 
/var/www/discourse/lib/middleware/processing_request.rb:14:in 'Middleware::ProcessingRequest#call' 
railties-8.0.5/lib/rails/engine.rb:535:in 'Rails::Engine#call' 
railties-8.0.5/lib/rails/railtie.rb:226:in 'Kernel#public_send' 
railties-8.0.5/lib/rails/railtie.rb:226:in 'Rails::Railtie.method_missing' 
rack-2.2.23/lib/rack/urlmap.rb:74:in 'block in Rack::URLMap#call' 
rack-2.2.23/lib/rack/urlmap.rb:58:in 'Array#each' 
rack-2.2.23/lib/rack/urlmap.rb:58:in 'Rack::URLMap#call' 
rack-2.2.23/lib/rack/tempfile_reaper.rb:15:in 'Rack::TempfileReaper#call' 
pitchfork-0.18.2/lib/pitchfork/chunked.rb:105:in 'Pitchfork::Chunked#call' 
rack-2.2.23/lib/rack/content_length.rb:17:in 'Rack::ContentLength#call' 
pitchfork-0.18.2/lib/pitchfork/http_server.rb:868:in 'Pitchfork::HttpServer#process_client' 
pitchfork-0.18.2/lib/pitchfork/http_server.rb:1017:in 'Pitchfork::HttpServer#worker_loop' 
pitchfork-0.18.2/lib/pitchfork/http_server.rb:616:in 'block in Pitchfork::HttpServer#spawn_worker' 
pitchfork-0.18.2/lib/pitchfork/http_server.rb:1222:in 'block in Pitchfork::HttpServer#fork_sibling' 
pitchfork-0.18.2/lib/pitchfork.rb:170:in 'block in Pitchfork.clean_fork' 
pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Kernel#catch' 
pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Pitchfork.clean_fork' 
pitchfork-0.18.2/lib/pitchfork/http_server.rb:690:in 'Pitchfork::HttpServer#spawn_initial_mold' 
pitchfork-0.18.2/lib/pitchfork/http_server.rb:176:in 'Pitchfork::HttpServer#start' 
pitchfork-0.18.2/exe/pitchfork:110:in '<top (required)>' 
/var/www/discourse/vendor/bundle/ruby/3.4.0/bin/pitchfork:25:in 'Kernel#load' 
/var/www/discourse/vendor/bundle/ruby/3.4.0/bin/pitchfork:25:in '< 

아래 두 이미지는 연속된 로그이며, 이 경고가 비교적 자주 발생하고 있습니다~:rofl:

API를 통해 게시물을 작성할 때 로그에 경고가 자주 나타납니다