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