LabHub
배우기 러닝패스 코스

Linuxネットワーク診断

HTTPの診断

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

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 을 만드세요. namelabhub, 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=<코드>
  7. POST 요청을 보냈을 때의 상태코드를 /root/http/method.txtpost=<코드> 형식으로 적으세요.
  8. /root/http/healthcheck.sh <URL> 을 만드세요.
    • 2xx 면 ok code=<코드> time=<초> 를 출력하고 종료 코드 0
    • 응답은 왔지만 2xx 가 아니면 down code=<코드> 를 출력하고 종료 코드 1
    • 연결 자체가 안 되면 down 으로 시작하는 메시지를 내고 종료 코드 1. 10초 안에 판정해야 합니다.

참고

로컬 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 을 만드세요. namelabhub, tags 는 값이 2개 이상인 배열이어야 합니다. 그리고 그 파일을 서버에서 받아 tags두 번째 값을 /root/http/tag.txt 에 적으세요.

curl 의 출력을 jq 로 넘깁니다. 배열 인덱스는 0 부터입니다.

리다이렉트 따라가기

/root/www/sub 디렉터리를 만들고 파일을 하나 넣으세요. http://127.0.0.1:8000/sub 를 리다이렉트를 따라가지 않고 요청했을 때와 따라갔을 때의 상태코드를 /root/http/redirect.txt 에 다음 두 줄로 적으세요.

curl 은 기본적으로 리다이렉트를 따라가지 않습니다. 디렉터리 경로에 끝 슬래시가 없으면 서버가 301 을 냅니다.

미구현 메서드 응답

POST 요청을 보냈을 때의 상태코드를 /root/http/method.txtpost=<코드> 형식으로 적으세요.

-X 로 메서드를 지정합니다. 이 서버는 GET 과 HEAD 만 구현돼 있습니다.

헬스체크 스크립트

/root/http/healthcheck.sh <URL> 을 만드세요.

정상·비2xx·연결불가 세 가지를 구분해야 합니다. 최대 대기 시간을 반드시 거세요.