みなさん、こんにちは。
Startup.Tokyo Inc.の吉岡朗です。
この度は、Webサイト運営時で、簡単なサーバー障害の切り分け方法について、述べたいと思います。
前編の今回は、全体な説明と障害発生時のポイントを中心に説明し、後編はOSレベルのコマンド関連の説明を行います。
- 連載『Webサイト運営時の簡単なサーバー障害の切り分け』のほかの記事はこちら
第1回:この記事 - 第2回:Webサイト運営時の簡単なサーバー障害の切り分け(後編)
Ⅰ.はじめに
サーバーエンジニアの方を含めて、運用に関わる方で、いざサーバーに障害が発生や予兆を見つけたとき、どのようにしたらいいか悩みがつきものです。
たくさんのサーバーの障害を切り分ける方法論があるなかで、今回は、私が行っているLinuxのウェブサーバーで障害が発生したときの切り分けをお知らせ致します。
私とLinuxとの関わり始まりはLinuxOSを1995年にSlackWareでインストールし、日本語バージョンのJEを入れていました。当時Intel i486DX4やInterl PentiumのパソコンにDualブートをして楽しんでいたことを思い出します。その後一時期離れていましたが、今はLinuxCentOSをクラウドサービスで借りながら、私自身がWebサービスと監視業務を行っています。
Ⅱ.サーバーでの運用で障害の切り分け
一般的にサーバーの運用は、そのサービス提供のレイヤーによって、図1のように分かれていると言われます。
図1 一般的なサービス提供のレイヤー
通常の切り分けでは、下層のハードウェアから上層へと切り分けていますが、日々何らかの運用で絶えずサーバーを監視している場合に、突然サーバーが監視できなくなった場合には、下層から見ずに、予兆がないかを探すうえでは、上層から見るのが自然でわかりやすいです。ウェブサーバーの単体運用を例で言うと、図1は図2のようなサービスレイヤーになります。
図2 ウェブサーバーのレイヤー
体感的なところや見た目など、視覚的や直感が感じられそうなところや、気になる点から、サーバー障害を切り分けていくと、良いかもしれません。
Ⅲ.障害発生時の状況の整理
サーバーで、ハードウェアでの障害発生でのグラフは、一般的には、図3と言われています。(バスタブ曲線と呼ばれています)
みなさんが運用しているサーバーが安定稼働している場合には、ハードウェア的な要素が少ないとみて、切り分けをしてみても良いと思います。(最終的にはハードウェアの下層まで調べるので回り道になるだけですが)
そこで、サーバー障害の切り分けとしては、以下のような状況があれば、障害の予兆や発生しているとみていいでしょう。
(1)ウェブサーバーのウェブページを開くのが遅い
異なる条件で少しずつ計測し記録してみましょう。
【例】
- ・同じネットワークに接続する、別のデバイス(パソコンやスマホ)で同じウェブページを開いてみる。
- ・別のネットワークに接続する、別のデバイス(パソコンやスマホ)で同じウェブページを開いてみる。
- ・時間帯を別にして、同じウェブページを開いてみる。
- ・ブラウザのデベロッパーズツールなどを使用して、読み込みスピードを確認してみる。
図4 GoogleCromeのデベロッパーズツール
<Google Chrome の場合>
[設定]→[ツール]→[デベロッパーツール]→[Network]の順にクリックしてからウェブサイトを再リロードで表示します。
(2)ウェブサーバーが、ステータス500、502、503、504を返す。
頻繁に発生する場合には、直近にリリースした案件や変更した箇所をもとに調べてみましょう。
ステータス番号 | 名称 | 考えらえる原因 | 対処方法 |
500 | Internal Server Error | CGIスクリプト(PHP、Phyton、Rails)などでエラーが出た。 | 直近のリリースしたスクリプトなどでエラーが発生している可能性があります。 |
---|---|---|---|
502 | Bad Gateway | ゲートウェイやProxyとして動作しているサーバー(例:Nginx)がリクエストを実行しようとしたら不正なレスポンスを受け取った。 | ウェブサーバーのサーバープロセス(例:Apache)が異常終了した可能性があります。 |
503 | Service Unavailable | 事情によりアクセスできません。 | ウェブサーバーに多数のアクセスが発生しており、ウェブページを開くことができない状態です。 |
504 | Gateway Time-out | サーバーからレスポンスを受信できなかった。 | ウェブサーバーに過大な負荷がかかっており、決められた時間内に応答がなかったようです。 |
(3)ウェブサーバーの読み込み中が終わらない。
ブラウザなどでウェブサーバーの読み込みがずっと続く場合、または、ブラウザで開くとエラーが発生する場合には、複合的な障害が発生しているようです。まずはサーバーのログなどを確認してみましょう。
【参考】Chromeブラウザで、以下のようなエラーが出てきた場合には、ウェブサーバーの稼働が安定していない可能性が高いです。
番号 | メッセージ |
エラー2 | net::ERR_FAILED |
---|---|
エラー101 | net::ERR_CONNECTION_RESET |
エラー102 | net::ERR_CONNECTION_REFUSED |
エラー104 | net::ERR_CONNECTION_FAILED |
エラー105 | net::ERR_NAME_NOT_RESOLVED |
エラー118 | net:: ERR_CONNECTION_TIMED_OUT |
エラー324 | net::ERR_EMPTY_RESPONSE |
図6 Chromeブラウザでのエラー
Ⅳ.状況の切り分け
ウェブサーバーの障害切り分けは、上層から下層にかけて行います。
(1)コンテンツ(サービス)レイヤーでの切り分け
障害や予兆発生の直前に、コンテンツのリリースや、セキュリティアップデートなどを行っていませんか?
日々の作業を記録していることで、原因が簡単に見つかることが多いです。
【参考】WordPressなどのアップデート(バージョン4.2→4.3へなど)でも障害が発生することはよくあります。
(2)アプリケーションレイヤーでの切り分け
アプリケーションの最新リリースへの対応は、定期的に行う必要はありますが、最新をすぐに追うアップデートまでは必要ありません。アプリケーションのリリース直後の不具合などの情報を調査してみましょう。
「Apache」、「PHP」、「MySQL」、「Nginx」など各種のアプリケーションの情報は、インターネットで検索することで容易に得られます。
(3)ネットワークレイヤーでの切り分け
今日のネットワークは大変安定しているので、障害は発生することはありませんが、情報の掲示先などは把握しておき、必要に応じて閲覧情報収集はしておきましょう。
【例】
●サーバーのホスティング会社の障害情報
図8 GMOクラウドhttps://support.gmocloud.com/info/
(4)OSレイヤーでの切り分け
後編(※近日公開)の「5.OSレイヤーでの切り分け」で説明します。
(5)ハードウェアレイヤーでの切り分け
クラウド・VPSで運用している場合には、ハードウェアでの障害はほぼないので、心配はありません。
オンプレミス(=情報システムを使用者自身が管理する設備内に導入、設置して運用)で運用している場合には、ハードウェアを導入した会社と相談しながらハードウェア上の障害切り分けを行ってください。