サーバーがつながらない。webページが表示されないときに確認すること。

この記事について

環境centOS + apache + mysql
目的webページが表示されないときの確認手順をまとめる
結果サービスの状態 → プロセス数 → ログ → ネットワークの順で切り分ける

つまずきポイント要約

  • MaxClients 到達と oom-killer が原因のことが多い
  • 同一IPからの大量アクセスは netstat で見つける

1.ターミナルでサーバーにログインできるか

poderosaを使用。サーバーにログインできるのであればサーバー自体は問題ないと判断。

2.HTTPサーバー(apache)は起動しているか確認

service httpd status

もしくは

/etc/init.d/httpd status

/etc/init.dディレクトリ → デーモンを起動するためのファイル(起動スクリプト = rcスクリプト)が置いてある
rc は run command

結果(起動している場合)

httpd (pid 1759) を実行中...

3.mysql が起動しているか確認

# service mysqld status

もしくは

# /etc/init.d/mysqld status

結果(起動している場合)

mysqld (pid 1634) を実行中...

apache は起動しているが mysql が落ちている時に、ページにアクセスすると php のエラーが出る

Warning: mysql_set_charset(): No such file or directory in /var/www/libs/~~~~

Warning: mysql_set_charset(): A link to the server could not be established in /var/www/~~~~~
ConnectError!DB Error: connect failed

この場合は、mysqld を再起動などする

sudo /etc/init.d/mysqld restart

4.httpdのプロセス数を確認する(アクセス過多)

ps aux |grep httpd |wc -l
65

この数字が http.cnf の ServerLimit を超えるとサーバーが停止する。

StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

エラーログにもエラーが出る。

エラーログを調べる

cat /var/log/httpd/error_log

エラーログ一部抜粋

[Fri Aug 27 01:28:32 2021] [error] server reached MaxClients setting, consider raising the MaxClients setting

OS のエラーを調べると、上記エラーが出た時間の前後に oom-killer が発動しているのが分かる

cat /var/log/messages | grep oom

一部抜粋

Oct 6 02:24:02 hostname kernel: httpd invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0
Oct 6 02:24:02 hostname kernel: [] ? oom_kill_process+0x82/0x2a0
Oct 6 02:24:02 hostname kernel: [ pid ] uid tgid total_vm rss cpu oom_adj oom_score_adj name

oom-killer が発動したときにサーバーに再起動が起こるように設定する
OOM発動時にサーバーを再起動

エラーログで不具合が起きたらしい時間帯のアクセスログを調べる場合は

cat /var/log/httpd/○○_access_log | awk -F - '"0:00:00" < $5 && $5 <= "15:00:00"'

$5 の部分はアクセスログに書かれた時間の位置で、$4 だったり数字を変える。

5.ネットワークの状態も確認する

# netstat -tpn

netstat で同じipアドレスからのたくさんの重複アクセスを確認したので、対策として mod_evasiveをインストールした
その時の記事
ただしあまり効果が感じられない。インストールしてもサーバーは止まるし、ipを遮断したらメールが来る設定にしているが遮断条件に満たなくてメールがあまり来ない。

ipアドレス別でサーバーに接続している数を調べる

# netstat -tan | awk '{print $5}' | cut -d : -f1 | sort -n | uniq -c | sort -n
37 66.249.68.××
42 157.55.39.××
42 40.77.167.××
43 157.55.39.××
45 207.46.13.××
51 66.249.68.××
2256 207.××.××.××

207.××.××.×× が異常な接続数なので ipアドレスを解析してクローラーでなければ ipアドレスを拒否する

netstat で大量のCLOSE_WAITを確認。その時に行った対策のメモ

サーバーがつながらない。CLOSE_WAITが大量発生

タイトルとURLをコピーしました