HTTPの診断
한국어 원문으로 표시합니다.
목표
HTTP 응답을 상태코드·헤더·타이밍·본문 네 축으로 나눠 읽고, 그것을 헬스체크 스크립트로 묶습니다.
왜 중요한가
"응답이 느리다"는 신고를 받았을 때 필요한 것은 더 많은 대시보드가 아니라 한 요청의 시간을 구간별로 쪼개 보는 것입니다. curl -w 의 타이밍 변수는 이름 해석 / TCP 연결 / TLS / 서버 첫 바이트 / 본문 전송을 각각 알려 줍니다. time_connect 까지 정상인데 time_starttransfer 만 크면 네트워크는 무고하고 애플리케이션이 범인입니다 - 그 자리에서 논쟁이 끝납니다. 그리고 헬스체크에는 반드시 최대 대기 시간을 걸어야 합니다. 없으면 상대가 응답하지 않을 때 스크립트가 영원히 멈추고, 크론이 그것을 5분마다 띄우면 프로세스가 쌓입니다.
단계
/root/www 를 문서 루트로, /root/http 를 작업 디렉터리로 씁니다.
/root/www/index.html을 만들어labhub-http-ok를 넣고,python3 -m http.server 8000 --bind 127.0.0.1 --directory /root/www를 백그라운드로 띄운 뒤 PID 를/root/http/server_pid.txt에 적으세요.- 없는 경로를 요청했을 때의 상태코드를
/root/http/status404.txt에 숫자만 적으세요. /index.html의 응답 헤더만 받아/root/http/headers.txt에 저장하세요. 본문이 섞이면 안 됩니다.- 요청의
time_namelookup,time_connect,time_total세 값을 공백으로 구분해 한 줄로/root/http/timing.txt에 저장하세요. /root/www/api.json을 만드세요.name은labhub,tags는 값이 2개 이상인 배열이어야 합니다. 그리고 그 파일을 서버에서 받아tags의 두 번째 값을/root/http/tag.txt에 적으세요./root/www/sub디렉터리를 만들고 파일을 하나 넣으세요.http://127.0.0.1:8000/sub를 리다이렉트를 따라가지 않고 요청했을 때와 따라갔을 때의 상태코드를/root/http/redirect.txt에 다음 두 줄로 적으세요.no_follow=<코드>follow=<코드>
- POST 요청을 보냈을 때의 상태코드를
/root/http/method.txt에post=<코드>형식으로 적으세요. /root/http/healthcheck.sh <URL>을 만드세요.- 2xx 면
ok code=<코드> time=<초>를 출력하고 종료 코드0 - 응답은 왔지만 2xx 가 아니면
down code=<코드>를 출력하고 종료 코드1 - 연결 자체가 안 되면
down으로 시작하는 메시지를 내고 종료 코드1. 10초 안에 판정해야 합니다.
- 2xx 면
참고
curl -s -o /dev/null -w '%{http_code}' URL로 상태코드만 뽑습니다. 연결 실패 시에는000이 나옵니다.curl -sI URL은 HEAD 요청으로 헤더만 받습니다.curl --max-time 5로 최대 대기 시간을 겁니다.- 흔한 실수 1: 6번에서
-L없이도 200 이 나온다면 끝 슬래시를 붙여 요청한 것입니다. 슬래시 없이 요청해야 301 이 나옵니다. - 흔한 실수 2: 8번에서
000을 숫자로만 비교하면 연결 실패와 정상을 구분하지 못합니다.
로컬 HTTP 서버 띄우기
/root/www/index.html 을 만들어 labhub-http-ok 를 넣고, python3 -m http.server 8000 --bind 127.0.0.1 --directory /root/www 를 백그라운드로 띄운 뒤 PID 를 /root/http/server_pid.txt 에 적으세요.
python3 -m http.server 에 문서 루트를 지정하는 옵션이 있습니다. 127.0.0.1 에만 묶으세요.
상태코드만 뽑기
없는 경로를 요청했을 때의 상태코드를 /root/http/status404.txt 에 숫자만 적으세요.
본문은 버리고 상태코드만 출력하는 -w 변수가 있습니다.
헤더만 받기
/index.html 의 응답 헤더만 받아 /root/http/headers.txt 에 저장하세요. 본문이 섞이면 안 됩니다.
HEAD 요청을 보내는 옵션입니다. 본문이 파일에 섞이면 안 됩니다.
구간별 소요 시간 재기
요청의 time_namelookup, time_connect, time_total 세 값을 공백으로 구분해 한 줄로 /root/http/timing.txt 에 저장하세요.
-w 의 time_namelookup, time_connect, time_total 세 개를 공백으로 구분해 한 줄로 출력하세요.
JSON 응답에서 값 뽑기
/root/www/api.json 을 만드세요. name 은 labhub, tags 는 값이 2개 이상인 배열이어야 합니다. 그리고 그 파일을 서버에서 받아 tags 의 두 번째 값을 /root/http/tag.txt 에 적으세요.
curl 의 출력을 jq 로 넘깁니다. 배열 인덱스는 0 부터입니다.
리다이렉트 따라가기
/root/www/sub 디렉터리를 만들고 파일을 하나 넣으세요. http://127.0.0.1:8000/sub 를 리다이렉트를 따라가지 않고 요청했을 때와 따라갔을 때의 상태코드를 /root/http/redirect.txt 에 다음 두 줄로 적으세요.
no_follow=<코드>follow=<코드>
curl 은 기본적으로 리다이렉트를 따라가지 않습니다. 디렉터리 경로에 끝 슬래시가 없으면 서버가 301 을 냅니다.
미구현 메서드 응답
POST 요청을 보냈을 때의 상태코드를 /root/http/method.txt 에 post=<코드> 형식으로 적으세요.
-X 로 메서드를 지정합니다. 이 서버는 GET 과 HEAD 만 구현돼 있습니다.
헬스체크 스크립트
/root/http/healthcheck.sh <URL> 을 만드세요.
- 2xx 면
ok code=<코드> time=<초>를 출력하고 종료 코드0 - 응답은 왔지만 2xx 가 아니면
down code=<코드>를 출력하고 종료 코드1 - 연결 자체가 안 되면
down으로 시작하는 메시지를 내고 종료 코드1. 10초 안에 판정해야 합니다.
정상·비2xx·연결불가 세 가지를 구분해야 합니다. 최대 대기 시간을 반드시 거세요.