워커가 막힌 곳은 백엔드가 아니라 앞단이었다
GPU 인스턴스에 붙어 상태를 보다가 발견했다. supersub-worker 가 큐를 집으려는 요청을 전부 403 으로 돌려받고 있었고, 어제(9/16) 08:27 부터 지금까지 분석이 한 건도 돌지 않았다.
본문이 error code: 1010, 응답 헤더가 server: cloudflare 였다. 즉 오리진까지 가지도 않았다 — 그래서 백엔드 로그에는 아무 흔적이 없다. 이런 종류가 제일 찾기 나쁘다. 워커 저널의 403 만 보면 토큰을 의심하게 되는데 (401 이 아니라 403 인 것이 힌트였다), 정작 토큰은 멀쩡했다.
무엇이 걸렸나
인스턴스에서 UA 만 바꿔 가며 같은 경로를 쳐 봤다. Python-urllib 이 들어간 것만 403 이고, 소문자로 바꾸거나 다른 이름을 대면 오리진까지 갔다. 앞단이 대소문자를 구분해 Python-urllib 을 거르는 규칙을 들고 있다는 뜻이다.
워커의 _request() 가 UA 를 안 줘서 파이썬 기본값이 그대로 나가고 있었다. supersub-worker/1.0 을 명시하도록 고쳤고, 되살아나는 것을 막는 검사를 붙였다(test_every_backend_call_names_itself_in_the_user_agent).
그래도 닫지 않는다
UA 를 바꾼 것은 규칙을 피한 것이지 규칙이 우리를 안 막게 된 것이 아니다. 앞단 문구가 다음에 조금만 넓어지면 같은 증상이 그대로 돌아오고, 그때도 백엔드 로그에는 아무것도 안 남는다. 앞단에서 워커 전용 경로를 봇 차단 대상에서 빼는 것이 근본 대응이라 정어진에게 판단을 넘겼다.
다음
- UA 수정분을 인스턴스에 반영 — 그 전까지는 여전히 안 돈다
- 마지막 정상 처리가 9/16 08:11 이므로, 그 뒤 올라온 요청은 큐에 그대로 있다