キャリテク!マガジン
- TOP
- キャリテク!マガジン
- 障害対応に強くなろう http障害解決の近道 – WEBサーバーのステータスコードを知ろう
障害対応に強くなろう http障害解決の近道 – WEBサーバーのステータスコードを知ろう
こんにちは。株式会社パイプラインの濱田です。
さて、前回はWEBサーバーのログ調査について取り上げましたが、今回は補足説明として、HTTPステータスコードについて取り上げてみたいと思います。
HTTPステータスコードとは
HTTPステータスコードとは、WEBブラウザなどのクライアントがWEBサーバーに対してコンテンツをリクエストし、WEBサーバーが応答する際にクライアントへ返答する3桁の数字になります。この数字はレスポンスの意味を表現しており、RFC 7231で定義されています。HTTPステータスコードは100番台から500番台まであり、それぞれに意味があります。
100番台 | 情報 |
200番台 | 成功した |
300番台 | リダイレクション |
400番台 | クライアントエラー |
500番台 | サーバーエラー |
あるWEBサーバーにコンテンツをリクエストして、そのコンテンツを正常にWEBブラウザで表示できたら、ステータスコードは200となります。一方で、 http://example.com/detarame-na-contents.html などのように、そのサーバーに存在しないURLをリクエストされた際、WEBサーバーはステータスコード404でエラーを返します。その他、頻出するエラーとしては
403 Forbidden | サーバーがリクエストを理解したものの、認証が拒否されたことを示す (IDやパスワードの間違い、そもそもユーザー登録されていないなど)。 |
500 Internal Server Error | サーバーがリクエスト実行を妨げる予期しない条件に遭遇した場合に返されるエラーレスポンス。後述する503エラーは明示的に「リクエストを処理する準備ができていない」という理由があるのに対して、500エラーは「よくわかんないけどなんかおかしい」と言っているようなもの。 |
503 Service Unavailable | サーバーがリクエストを処理する準備ができていないことを示す。一般的にサーバーが過負荷状態になっていたり、メンテナンス中のために停止していたりすることが原因。 |
このように、WEBページが表示されないといった障害ひとつとっても、ステータスコードを意識して調査を行うことで原因特定が容易になっていきます。また、WEBサーバーの設定によってはエラー理由を隠蔽したり偽装したりしているケースもありますので、障害申告を受ける際は「どのURLにアクセスしたのか」「アクセスしようとしたおおよその(できるだけ正確な)時刻」をヒアリングしましょう。
WEBサイトにアクセスしてステータスコードを取得しよう
それでは、ステータスコードを理解したところで、実際にWEBサイトにアクセスしてステータスコードを取得してみましょう。こうした調査をコマンドラインから実行できるようになると以下のようなメリットがあります。
- データセンター内などインターネットアクセスが制限されている環境において、インターネット上の調査サイトに頼る必要がなくなる
- 表示結果がテキストで出力されるため、他のプログラムにパイプラインで渡しやすい
コマンドラインからWEBサイトへアクセスするには、ダウンローダーコマンドである「curl」または「wget」コマンドを利用します。どちらも引数にURLを与えて実行しますが、後者のwgetコマンドはコンテンツをファイルとしてダウンロードするのに対し、前者のcurlコマンドはソースコードを標準出力に表示します(オプションをつけてファイルとしてダウンロードすることも可能です)。
curlコマンドはhttpヘッダーの取得だけを行う使いみちもありますので、WEBサイトの接続調査にはcurlが使われることも多く、ぜひ覚えておきたいコマンドの一つでもあります。さて、前置きが長くなってしまいましたが、curlコマンドを利用してのHTTPステータスコード調査の実例を見てみましょう。
curlコマンドを使ってみよう
まず、curlコマンドの引数にURLだけをつけて実行すると、ターミナルにhtmlソースコードがそのまま表示されます。PHPなどのプログラムで生成されたコンテンツは、PHPのソースコードではなく、プログラムがhtmlとしてブラウザに表示するソースコードが表示されます。
$ curl https://www.kcct.co.jp/ % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <noscript>お使いのブラウザはJavaScriptに対応していません。</noscript> <title>京セラグループ 株式会社AltX|AltX</title> <meta name="description" content="京セラグループ AltXはネットワークエンジニア(NE)・モバイルエンジニア(ME) の派遣を中心に各種サービスを提供しています。"> <meta name="keywords" content="人材派遣,アウトソーシング,エンジニア派遣, モバイルエンジニア,開発エンジニア,通信,ネットワーク,NE,データセンター,請負,BPO,AI,IT,ICT,IoT,研修"> <link rel="shortcut icon" href="img/common/favicon.ico" type="image/vnd.microsoft.icon"> <link rel="icon" href="img/common/favicon.ico" type="image/vnd.microsoft.icon"> |
しかしこれではダウンロードステータスとソースコードしか表示されず、調査としては不十分です。
HTTPヘッダー情報を確認する
curlコマンドでヘッダー情報のみを表示するには、大文字「I」オプションをつけて実行します。また、後述する理由により、今回の例では敢えてhttpsではなくhttpで実行します。
$ curl -I http://www.kcct.co.jp/ HTTP/1.1 301 Moved Permanently Date: Tue, 14 Jul 2020 06:33:34 GMT Server: Apache Location: https://www.kcct.co.jp/ Vary: Accept-Encoding Connection: close Content-Type: text/html; charset=iso-8859-1 |
上記実行例の赤太文字で強調した箇所がHTTPステータスコードになります。その3行下、青太文字で強調した箇所がロケーションヘッダーとなり、リダイレクトされた先のロケーションを示しています。しかし、リダイレクト先のステータスコードまではこれではわかりません。リダイレクト後のURLに対して再度curlコマンドを実行してもよいのですがこれではナンセンスです。curlには、リダイレクトも追いかけてくれる「L」オプションもありますので、これを活用しましょう。また、ダウンロードステータスを非表示にしてくれる「s」オプションもあわせてつけることにします。
$ curl -LIs http://www.kcct.co.jp/ HTTP/1.1 301 Moved Permanently Date: Tue, 14 Jul 2020 07:13:02 GMT Server: Apache Location: https://www.kcct.co.jp/ Vary: Accept-Encoding Connection: close Content-Type: text/html; charset=iso-8859-1 HTTP/1.1 200 OK Date: Tue, 14 Jul 2020 07:13:02 GMT Server: Apache Last-Modified: Mon, 06 Jul 2020 06:24:00 GMT Accept-Ranges: bytes Content-Length: 25485 Vary: Accept-Encoding Connection: close Content-Type: text/html |
青太文字で強調したように、httpでアクセスしたサイトのステータスコードは301リダイレクトであること、赤太文字で強調したロケーションヘッダーにあるhttpsサイトにリダイレクトされ、リダイレクト後のサイトでは200 OKであることがわかりました。これで、WEBサイトの正常性が確認できたことになります。
curlでステータスコードのみを出力する
単にステータスコード「だけ」を知りたい場合は以下のように「-w」オプションをつけてステータスコードのパラメータを取得し、「-o」オプションの引数に /dev/null を与えてヘッダー情報を標準出力に表示しないようにします。
$ curl -LIs https://www.kcct.co.jp/ -o /dev/null -w '%{http_code}\n' 200 |
ご覧のように、ステータスコードが200であることがわかりました。また、curlコマンドでステータスコードが000となるケースもありますが、これは
- そもそもhttp httpsポートが開かれていない
- 名前解決できない
のどちらかのケースです。www ではなくwwww というようにFQDNを間違えてアクセスしてみるとこうなります。
$ curl -LIs https://wwww.kcct.co.jp/ -o /dev/null -w '%{http_code}\n' 000 |
これを応用して、最初に名前解決をdigコマンドで確認し、その終了ステータスが正常終了だったらcurlでステータスコードを取得するプログラムを書けば、簡易http監視プログラムができるということにもなりますね。
まずはエンジニアデビューしたい、という方は、3ヶ月間学びながらお給料が貰える AltX キャリテク!の門を叩いてみてはいかがでしょう。