nginx 장애 대응 · 앱 잘못이 아닌 실패 · 퀴즈
퀴즈: 버퍼 · 본문 크기 · 커넥션 재사용
문항 6개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
액세스 로그에 `200 ut=0.049 rt=4.173` 이 남았다. 첫 조사 방향으로 옳은 것은?
- 업스트림 애플리케이션과 DB 의 느린 쿼리를 먼저 본다
- 업스트림은 이미 끝냈으므로 응답 전송 구간과 버퍼 설정을 본다
- 두 값이 다르므로 로그 포맷이 잘못 정의된 것이다
- 업스트림 헬스체크가 실패해 재시도가 일어난 것이다
`an upstream response is buffered to a temporary file` 이 운영에서 거의 발견되지 않는 가장 큰 이유는?
- 이 메시지는 debug 수준이라 기본 설정에서는 아예 기록되지 않는다
- 임시 파일이 즉시 지워져 로그에도 남지 않기 때문이다
- `[warn]` 수준이라 error 수준 로그나 error 문자열 알림에 걸리지 않는다
- 같은 요청이 502 로 끝나 5xx 알림에 묻히기 때문이다
같은 8MB 응답을 버퍼링을 켠 경로와 끈 경로로 받아 재 보니 켠 쪽은 `ut=0.049 rt=4.173`, 끈 쪽은 `ut=3.188 rt=3.189` 였다. 이 숫자가 뜻하는 것은?
- 버퍼링을 끄면 응답이 더 빨리 도착한다
- 버퍼링을 끄면 업스트림이 클라이언트가 다 받을 때까지 붙들린다
- 버퍼링을 켜면 업스트림 처리 자체가 느려진다
- 두 경로의 업스트림이 서로 달라 비교할 수 없는 값이다
`client_max_body_size` 와 `client_body_buffer_size` 의 차이는?
- 앞은 요청 본문, 뒤는 응답 본문의 크기를 정한다
- 앞은 거절 문턱을 정하고 뒤는 본문을 메모리에 담아 둘 크기를 정한다
- 앞은 http 블록에서만, 뒤는 location 블록에서만 쓸 수 있다
- 앞은 하드 리밋이고 뒤는 같은 값의 소프트 리밋이다
업스트림 Keep-Alive 를 켜려고 `upstream` 블록에 `keepalive 16;` 을 넣고 location 에 `proxy_http_version 1.1;` 도 넣었는데, 10 회 요청에 업스트림이 본 커넥션이 여전히 10 개다. 빠진 것은?
- `proxy_set_header Connection "";`
- `keepalive_timeout` 을 upstream 블록에 함께 지정하는 것
- `proxy_socket_keepalive on;`
- `upstream` 블록의 `server` 줄에 `max_conns` 를 지정하는 것
커넥션 재사용이 안 되는 시스템이 평소에는 멀쩡하다가 트래픽이 늘자 502 가 쏟아졌다. 이 흐름의 설명으로 가장 알맞은 것은?
- 요청마다 새 소켓이 열려 TIME_WAIT 이 쌓이고 포트가 고갈되면서 연결이 거부됐다
- 커넥션이 많아져 업스트림의 응답 헤더가 커졌고 프록시 버퍼를 넘겼다
- 재사용이 없으면 nginx 가 요청을 큐에 쌓다가 읽기 타임아웃을 낸다
- 업스트림이 keepalive 커넥션을 먼저 끊어 nginx 가 재시도를 포기했다