MAGAZINE

キャリテク!マガジン

コラム

障害対応に強くなろう 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 キャリテク!の門を叩いてみてはいかがでしょう。

https://www.kcct.co.jp/careetec/

facebook シェアシェア
LINE シェアシェア