nginx 장애 대응 · 502 와 504 를 증거로 가른다 · 퀴즈
퀴즈: 502 · 504 와 에러 로그 서명
문항 6개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
error.log 에 `connect() failed (111: Connection refused) while connecting to upstream` 이 찍히고 클라이언트는 502 를 받았다. 가장 효과가 없는 조치는?
- `proxy_read_timeout` 을 30s 로 올린다
- 업스트림 프로세스가 그 포트에 실제로 LISTEN 중인지 확인한다
- `proxy_pass` 가 가리키는 주소와 포트가 맞는지 확인한다
- 업스트림 앞단에 방화벽이나 정책이 끼어 있는지 확인한다
504 두 건의 error.log 가 아래와 같다. 무엇이 다른가? ① `upstream timed out (110: Connection timed out) while connecting to upstream` ② `upstream timed out (110: Connection timed out) while reading response header from upstream`
- ①은 이름 해석에 실패했고 ②는 TCP 연결 자체에 실패한 것이다
- ①은 연결 단계, ②는 응답 헤더 대기 단계에서 시간이 초과됐다
- ①은 업스트림이 보낸 코드이고 ②는 nginx 가 스스로 만든 코드다
- 둘은 같은 상황이며 nginx 버전에 따라 문구만 달라진 것이다
`/hang/` 블록에 `proxy_read_timeout 30s;` 를 넣었는데도 요청이 2 초 만에 504 로 끊긴다. 가장 그럴듯한 설명은?
- reload 를 하지 않아 설정이 반영되지 않았다
- location 블록 안의 타임아웃은 http 블록 값에 덮어써진다
- 업스트림이 2 초 만에 커넥션을 끊었기 때문에 읽기 타임아웃과 무관하다
- 연결 단계에서 `proxy_connect_timeout` 이 먼저 걸렸다
헬스체크는 계속 정상인데 SSO 로 로그인한 일부 사용자만 502 를 받는다. error.log 에는 `upstream sent too big header` 가 있다. 원인은?
- 그 사용자들의 요청이 다른 업스트림으로 분배되고 있다
- 응답 헤더가 `proxy_buffer_size` 를 넘겼다
- 세션 쿠키가 만료되어 업스트림이 빈 응답을 돌려준다
- 업스트림의 스레드풀이 포화되어 헤더를 다 못 보냈다
`proxy_buffer_size` 를 16k 로 올렸더니 nginx 가 `"proxy_busy_buffers_size" must be less than the size of all "proxy_buffers" minus one buffer` 로 기동을 거부한다. 무엇을 해야 하나?
- `proxy_busy_buffers_size` 를 0 으로 명시한다
- `proxy_buffering` 을 off 로 바꾼다
- `proxy_buffers` 도 함께 키운다
- `proxy_buffer_size` 를 4k 로 되돌리고 업스트림에서 헤더를 줄인다
액세스 로그에 `413 ut=- rt=0.002 us=- "POST /upload HTTP/1.1"` 이 남았다. 애플리케이션 로그를 뒤졌더니 이 요청이 없다. 어떻게 판단해야 하나?
- 애플리케이션 로그 수집이 누락된 것이므로 로그 파이프라인을 먼저 본다
- 업스트림이 요청을 받고도 로그를 남기지 않은 것이므로 앱 설정을 본다
- `ut` 와 `us` 가 대시이므로 요청이 업스트림에 간 적이 없다
- 413 은 업스트림이 돌려준 코드이므로 업스트림 설정을 본다