curlでHTTPを診断する
目標
curlでステータスコード・ヘッダー・リダイレクト・仮想ホスト・タイミングを取り出し、「遅い」と「つながらない」を区間の名前に置き換える訓練をします。
なぜ重要なのか
curl -wのタイミングフィールドは、1つのリクエストを名前解決 / TCP接続 / TLS / 最初のバイト / 全体の5つの区間に分解します。この分解があれば、「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の4つのパスのステータスコードを、경로 코드の形式(プレースホルダーはパスとステータスコードです)で1行ずつ/root/http/status.txtに書いてください。リダイレクトは追いかけないでください。/okのレスポンスヘッダーだけを/root/http/headers.txtに保存してください。X-Labhub-Nodeヘッダーが含まれている必要があります。/chainをリダイレクトを追いかけながらリクエストし、最終的なステータスコードとリダイレクト回数を、code=<코드> redirects=<횟수>の1行(プレースホルダーはステータスコードとリダイレクト回数です)で/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の4つのパスのステータスコードを、경로 코드の形式(プレースホルダーはパスとステータスコードです)で1行ずつ/root/http/status.txtに書いてください。リダイレクトは追いかけないでください。
出力フォーマット指定子で、ステータスコードだけを取り出せます。本文は捨て、コードだけを残してください。
レスポンスヘッダーだけを取り出す
/okのレスポンスヘッダーだけを/root/http/headers.txtに保存してください。X-Labhub-Nodeヘッダーが含まれている必要があります。
ヘッダーを標準出力にダンプするオプションと、本文を捨てるオプションを組み合わせると、GETを維持したままヘッダーだけを見られます。
リダイレクトを追いかける
/chainをリダイレクトを追いかけながらリクエストし、最終的なステータスコードとリダイレクト回数を、code=<코드> redirects=<횟수>の1行(プレースホルダーはステータスコードとリダイレクト回数です)で/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は、名前:ポート:アドレスの3つの値をコロンでつなげて書きます。/etc/hostsに触れなくてもできます。
タイミングの分解とレポート
/root/http/timing.txtを次の4行で作成してください。値は、/slowパスをリクエストして得た実際の測定値です。
code=<상태코드> / connect=<time_connect> / ttfb=<time_starttransfer> / total=<time_total>(プレースホルダーはステータスコードです)
/slowには1.2秒の遅延があるため、totalは1以上である必要があります。
タイミングフィールドは累積値です。/slowパスは、わざと遅く応答します。