Diagnosing HTTP With curl
한국어 원문으로 표시합니다.
목표
curl 로 상태 코드·헤더·리다이렉트·가상 호스트·타이밍을 뽑아, "느리다"와 "안 된다"를 구간 이름으로 바꾸는 훈련을 합니다.
왜 중요한가
curl -w 의 타이밍 필드는 요청 하나를 이름 해석 / TCP 연결 / TLS / 첫 바이트 / 전체 다섯 구간으로 쪼갭니다. 이 분해가 있으면 "API 가 느려요" 라는 신고를 "TLS 핸드셰이크가 800ms 입니다" 로 바꿀 수 있고, 그 순간 담당 팀과 조치가 정해집니다. --resolve 와 -H 'Host:' 는 배포 전 검증의 필수 도구입니다 — DNS 를 바꾸기 전에 새 서버를 실제 이름으로 시험하고, LB 뒤 백엔드를 직접 두드리면서도 가상 호스트 라우팅은 원래대로 태울 수 있습니다.
단계
/root/http디렉터리를 만들고,/opt/fixtures/nt-http/server.py를 8088 포트에 백그라운드로 띄우세요. 채점 시점에도 살아 있어야 합니다.http://127.0.0.1:8088/ok를 상세 모드로 요청해 요청·응답 헤더를 포함한 전체 출력을/root/http/verbose.txt로 저장하세요./ok,/notfound,/teapot,/redirect네 경로의 상태 코드를경로 코드형식으로 한 줄씩/root/http/status.txt에 적으세요. (리다이렉트는 따라가지 말 것)/ok의 응답 헤더만/root/http/headers.txt로 저장하세요.X-Labhub-Node헤더가 포함돼야 합니다./chain을 리다이렉트를 따라가며 요청하고, 최종 상태 코드와 리다이렉트 횟수를code=<코드> redirects=<횟수>한 줄로/root/http/redirect.txt에 적으세요.Host: shop.labhub.local헤더를 붙여/whoami를 요청하고 응답 본문을/root/http/host.txt로 저장하세요.--resolve를 써서http://shop.labhub.local:8088/ok를/etc/hosts를 건드리지 않고 성공시키고, 그 응답 본문을/root/http/resolve.txt로 저장하세요./root/http/timing.txt를 다음 4줄로 만드세요. 값은/slow경로를 요청해 얻은 실제 측정치입니다.code=<상태코드>/connect=<time_connect>/ttfb=<time_starttransfer>/total=<time_total>/slow는 1.2초 지연이 있으므로total은 1 이상이어야 합니다.
참고
curl -o /dev/null -s -w '%{http_code}\n' <URL>로 코드만 뽑습니다.- 헤더만 보려면
curl -sD - -o /dev/null <URL>이 안전합니다.-I는 HEAD 를 보내므로 서버 구현에 따라 결과가 달라질 수 있습니다. --resolve <이름>:<포트>:<IP>형식입니다.- 흔한 실수 1: 3번에서 리다이렉트를 따라가 버리면
/redirect가 200 으로 나옵니다.-L을 빼세요. - 흔한 실수 2: 2번에서
-v출력은 표준 에러라>만으로는 저장되지 않습니다.
진단 서버 띄우기
/root/http 디렉터리를 만들고, /opt/fixtures/nt-http/server.py 를 8088 포트에 백그라운드로 띄우세요. 채점 시점에도 살아 있어야 합니다.
픽스처 서버는 포트를 인자로 받습니다. 띄운 뒤 ss 로 리슨을 확인하세요.
요청과 응답 헤더 전체 보기
http://127.0.0.1:8088/ok 를 상세 모드로 요청해 요청·응답 헤더를 포함한 전체 출력을 /root/http/verbose.txt 로 저장하세요.
curl 의 상세 모드는 표준 에러로 나옵니다. 파일로 남기려면 리다이렉션을 함께 써야 합니다.
경로별 상태 코드 표
/ok, /notfound, /teapot, /redirect 네 경로의 상태 코드를 경로 코드 형식으로 한 줄씩 /root/http/status.txt 에 적으세요. (리다이렉트는 따라가지 말 것)
출력 형식 지정자로 상태 코드만 뽑을 수 있습니다. 본문은 버리고 코드만 남기세요.
응답 헤더만 뽑기
/ok 의 응답 헤더만 /root/http/headers.txt 로 저장하세요. X-Labhub-Node 헤더가 포함돼야 합니다.
헤더를 표준 출력으로 덤프하는 옵션과 본문을 버리는 옵션을 조합하면 GET 을 유지하면서 헤더만 볼 수 있습니다.
리다이렉트 따라가기
/chain 을 리다이렉트를 따라가며 요청하고, 최종 상태 코드와 리다이렉트 횟수를 code=<코드> redirects=<횟수> 한 줄로 /root/http/redirect.txt 에 적으세요.
리다이렉트를 따라가는 옵션과, 몇 번 따라갔는지 알려 주는 출력 변수가 있습니다.
Host 헤더로 가상 호스트 시험
Host: shop.labhub.local 헤더를 붙여 /whoami 를 요청하고 응답 본문을 /root/http/host.txt 로 저장하세요.
픽스처 서버의 /whoami 는 받은 Host 헤더를 그대로 돌려줍니다.
DNS 없이 이름으로 접속
--resolve 를 써서 http://shop.labhub.local:8088/ok 를 /etc/hosts 를 건드리지 않고 성공시키고, 그 응답 본문을 /root/http/resolve.txt 로 저장하세요.
--resolve 는 이름:포트:주소 세 값을 콜론으로 이어 씁니다. /etc/hosts 를 건드리지 않고도 됩니다.
타이밍 분해와 보고서
/root/http/timing.txt 를 다음 4줄로 만드세요. 값은 /slow 경로를 요청해 얻은 실제 측정치입니다.
code=<상태코드> / connect=<time_connect> / ttfb=<time_starttransfer> / total=<time_total>
/slow 는 1.2초 지연이 있으므로 total 은 1 이상이어야 합니다.
타이밍 필드는 누적값입니다. /slow 경로는 일부러 느리게 응답합니다.