「サイトが見れない!!!!」ってなったときの対応


タイトル見ただけで心臓がキュッってなりますが…
今までの経験からメモ書きしてみました
半分くらい自分用

原因究明に使える指標

HTTPのステータスコード

https://developer.mozilla.org/ja/docs/Web/HTTP/Status
これらのうちエラーになるのは400系と500系
ざっくりとした違いは下記

  • 400系:アクセス自体ができてない
    • 名前解決ができてない
    • 権限がない
    • サーバーが落ちてる
  • 500系:サーバー内部の処理でエラーを吐いて止まってる
    • サーバー設定が間違ってる
    • サイトを動かしているフレームワークのエラー

どっちかによって対応が変わるのでまずはここを切り分けます

ログファイル

linux系で出力のパスをいじってないなら/var/log/の中に大体のログがあると思います。

apache: /var/log/httpd/
nginx : /var/log/nginx/
nginx+phpならphp-fpmも要確認: /var/log/php-fpm/

何が動いてるのかを確認するならps aux
大量の情報が出てくるので、あたりがついてるならさらにgrepも併用

AWSモニタリング

AWSなら結構な情報がコンソールから確認できます

  • EC2:
    • CPU使用率
    • リクエスト数
  • ELB:
    • レイテンシー
    • 稼働サーバー数
  • RDS:
    • CPU使用率
    • 接続数
    • 書き込み/読み込みスループット

対応

1、 落ち着く

わりと重要です。
人間テンパるとろくなことをしません…
現状を整理するなり偉い人に相談するなりして心を落ち着かせましょう

2、 ステータスコードを確認する

上記の通りアクセスできない原因はいっぱいあるので、これから切り分けます
大概のブラウザで画面にステータスコードが出てるはず

3-1、 400系だった場合

原因によってコードが細かく分かれてるので対応はしやすいです
よく見るのは下記

  • 400 Bad Request
    • リクエストが無効です。新しい機能のリリース直後なら内部で送ってるリクエストがおかしいとか?
  • 403 Forbidden
    • 権限問題です。IP制限やファイルのパーミッションを確認します
  • 404 Not Found
    • 後述します

3-2、 500系だった場合

よく見るのは下記
ひとまずエラーログを確認するところから始まります
対応内容はログによって多岐に渡るので割愛

  • 500 Internal Server Error
    • サーバー内部で何か起きてます。下に出会ったことがあるエラーの一例を載せてます。
  • 502 Bad Gateway
    • ゲートウェイやProxyとして動作しているサーバがリクエストを実行しようとしたら不正なレスポンスを受け取ってます。

ここからは実例

404 Not Foundの対応

原因が多岐に渡るので別枠にします
あり得るのは
1、サーバーが落ちてる
2、名前解決ができてない
あたりなのでこの辺をチェックします。

pingしてみる

ping {IP/ホスト名}

で通信テストしてみます
(これはダミーとしてlocalhostにしてます)

$ ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=6.893 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.115 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.117 ms
^C
--- localhost ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.076/1.800/6.893/2.940 ms

生きてればとりあえず帰ってきます。
ポート番号を指定したいなら素のpingだとできないので別の方法を使います。
私はnping使ってます。便利
https://qiita.com/Yu-s/items/4b4f683fda374c8ddcc9

ログインしてみる

大概sshか何かでログインできるようにしてるはず
前まで出来てたはずのコマンドでログインできないなら落ちてる可能性が高いです

AWSならコンソールから確認する

EC2ダッシュボード > インスタンス > インスタンスの状態
から確認できます。stopになってたら落ちてます。
(aws-cliとかオートスケールとか使ってない場合、誰かが意図的に止めた可能性も…自動でstopにはならないはず…)
ステータスチェックが失敗してるかどうかも確認できるので、これが失敗してても落ちてます。

ただしインスタンスが自動で再起動を繰り返している場合(=実質落ちてる)でもrunningになってることがありますので注意

ここまででサーバーが生きてるのが確認できたのにドメインでアクセスできない場合おそらく名前解決ができてません

digしてみる

手っ取り早く確認するならこれ
https://www.atmarkit.co.jp/ait/articles/1711/09/news020.html

nslookupでもできます
https://www.atmarkit.co.jp/ait/articles/1710/27/news021.html

$ dig www.google.com

; <<>> DiG 9.10.6 <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3344
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.google.com.            IN  A

;; ANSWER SECTION:
www.google.com.     89  IN  A   172.217.24.132

;; Query time: 13 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Sep 11 13:51:58 JST 2020
;; MSG SIZE  rcvd: 59

;; ANSWER SECTION:がなければ名前解決できてないです

500 Internal Server Errorの対応

エラーが起きてる可能性があるのは

  • サーバーソフトウェア
  • コードを動かしているフレームワーク

の二択なのでとりあえずその二通りのログを見ます。
対応方法はエラー内容によって色々ですが、下記に私が出会ったことのあるエラーを紹介します。

ログローテート忘れ

nginxのエラーログで下記が出てました

write() to "/var/log/nginx/access.log" was incomplete: 83 of 314 while logging request

「アクセスログを書き込めなかったよ」とのこと。
見に行くと当日のアクセスログだけめちゃくちゃなサイズになってたのでこれでストレージが枯渇したと推測しました。
該当ファイルを削除するととりあえず解消するはずですがアクセスログを削除しても解消せず…
(多分他にも重たいファイルがあったんだと思います)
探す時間が惜しい&オートスケールしてたので新しいサーバーを立ち上げて入れ替えてとりあえず対処しました。

で、その間に根本的な原因を調査するとログローテートされてないことに気づきました…
この数日前にnginxのアップデートをしたのですが、その際にログローテート周りの設定ファイルを戻し忘れたようです。
これ以外にもストレージやメモリ枯渇したらアクセスできなくなるので、それを調べるコマンドはメモっておくといいかもですね

$ df -h //ストレージ確認
$ free -m //メモリ確認

設定変更を起動設定に反映し忘れ@オートスケール

ある日サイトが急に落ちて500エラーが出てたのでエラーログをチェック
cakephp2のログを見ると、数日前に出した新機能関連のエラーが!
直したはず…?と考えてすぐ気付きましたが、その設定変更を起動設定に反映し忘れてました…
どうやら
トラフィックが上がる
=>エラーが再現するオートスケールサーバー起動
=>アクセスできない
の流れだったようです。

cakephp2のキャッシュ周りのエラーでキャッシュファイルを削除すれば直る類のものだったので、
キャッシュを再び削除
=>その状態でAMI作成
=>起動設定に指定
で対応できました

まとめ

死ぬほど焦りますが、、
・落ち着く
・原因の切り分け
・偉い人に相談
で大体なんとかなります。