サーバーが重い、ページが開かない 20210819

運営サイトでサーバーが重くなった。タイムアウトでページが開かないことが多発した。
ipアドレスでアクセスした場合は問題なし。ドメインでアクセスした場合のみ問題が発生。

ニ三日前からページにアクセスしづらい状態がたびたび起こっている。ちょうどデーターベースの書き換えでサーバーに負荷のかかる作業だったので、それが原因かとデータベースを削除したり解決策を検索したが解決に至らず。

さくらインターネットに問い合わせて見る。

 

送ったメール内容
———————————————————

サーバーに利用制限がかかっていませんか?
二日ほど前多少サーバーに負荷のかかる処理をしました。そのあとからページの表示がされにくくなりました。
ブラウザからページにアクセスしても「サーバーが応答しません」と出ます。
ipアドレスでアクセスした場合は問題なく表示されますが、ドメイン名でアクセスした場合のみ問題が起こります。
http://160.○○○.○○○.○○○/index.html ← 問題ない
http://独自ドメイン/index.html ← 表示されない
調査をお願いします。
———————————————————

一時間ほどで返信あり。
返信の内容
———————————————————
現時点で弊社にて実施している制限はございません。

また、IPアドレスでブラウズ可能ということでございましたら仮想サーバ
自体の障害や制限によるものとは考えにくいものでございます。

恐れ入りますが「さくらのVPS」は、お客様に管理者権限をお渡ししている
サービスとなり仮想サーバの構築・運用・保守にいたる管理全般をお客様にて
実施いただいております。

そのため、弊社ではお客様のご利用いただく仮想サーバ内のシステム状況
などを把握や調査、トラブルシューティング等の技術的なサポートは承って
おりません。

お手数ですが、仮想サーバ内の設定やドメインのゾーンを管理するネーム
サーバに問題がないなど、サーバ管理者様にてご確認いただきますよう
お願いいたします。
———————————————————
このメールを受け取った前後に再度ページにアクセスしたら滞りなくページが開いた。
時間が解決してくれたということか?

一週間後・・・。

再びアクセスエラー。

再調査する。

このページが参考になりそう
https://meteoricstream.com/tips_detail/45.html

したこと。

手元の windows コマンドプロンプトから ping 送信 → 問題なし。

 

アクセスログを調べる。
rootで
cat /var/log/httpd/access_log

エラーログを調べる。
cat /var/log/httpd/error_log

 

エラーログ一部抜粋
——————————————————————————————-
[Fri Aug 27 01:28:32 2021] [error] server reached MaxClients setting, consider raising the MaxClients setting
——————————————————————————————-
訳:サーバーは MaxClients の設定値に達しました。MaxClients の設定値を大きくすることを検討してください。
setting → 設定(値)

↑ 上記メッセージは、Webサーバの起動後、リクエスト数がはじめてクライアントの同時接続数に達した際に一度だけ出るみたい。

 

MaxClients の値を上げるには httpd.conf の値を変えればいいらしい。

cat /etc/httpd/conf/httpd.conf

 

httpd.conf を開くと MaxClients ディレクティブが二つあった
httpd.conf 一部抜粋
——————————————————————————————-
# prefork MPM

# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
——————————————————————————————-

workerで動いてるか、preforkで動いてるか確認

コンソールで apachectl -l もしくは httpd -l を実行
apachectl と httpd はほぼ同じ内容で、どちらも httpd の軌道や停止をするコマンド

——————————————————————————————-
# apachectl -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
——————————————————————————————-

prefork で動いているという事らしい
デフォルトでは prefork ということ

httpd -V もしくは apachectl -V コマンドでも確認できる
Server MPM: の部分を確認

結果
——————————————————————————————-
# httpd -V
Server version: Apache/2.2.15 (Unix)
Server built: Oct 19 2017 16:43:38
Server’s Module Magic Number: 20051115:25
Server loaded: APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture: 64-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with….
-D APACHE_MPM_DIR=”server/mpm/prefork”
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT=”/etc/httpd”
-D SUEXEC_BIN=”/usr/sbin/suexec”
-D DEFAULT_PIDLOG=”run/httpd.pid”
-D DEFAULT_SCOREBOARD=”logs/apache_runtime_status”
-D DEFAULT_LOCKFILE=”logs/accept.lock”
-D DEFAULT_ERRORLOG=”logs/error_log”
-D AP_TYPES_CONFIG_FILE=”conf/mime.types”
-D SERVER_CONFIG_FILE=”conf/httpd.conf”
——————————————————————————————-

 

httpd.confより抜粋
——————————————————————————————-
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
——————————————————————————————-

同時接続の上限はこの場合 256 になる。

 

問題が起きているときのプロセスの数を確認すると 258 であり、上限を超えている
——————————————————————————————-
ps aux |grep httpd |wc -l
——————————————————————————————-

httpd.conf を書き変えて、MaxClientsを増やす。

ServerLimit ディレクティブも同じように増やす必要がある。

ではベストな MaxClients はいくつなのか

MaxClients及びServerLimitのベストな設定値

 

また、ネットワークの状態を確認して、同一ipアドレスから大量のリクエストが来ていないか確認する

コマンド
——————————————————————————————-
netstat -tpn
——————————————————————————————-

結果
——————————————————————————————-
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:52041 SYN_RECV –
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:65281 SYN_RECV –
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:50095 SYN_RECV –
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:62694 SYN_RECV –
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:49490 SYN_RECV –
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:64857 SYN_RECV –
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:57942 SYN_RECV –
tcp 0 0 160.16.63.○○○:443 154.21.212.○○:51261 SYN_RECV –
——————————————————————————————-
同一ipアドレスからの大量アクセスを確認。

.htaccess を編集して ipアドレスに制限を掛ける

——————————————————————————————-
#ipアドレスの制限
order allow,deny
allow from all
deny from 154.21.212.○○
——————————————————————————————-

禁止ipアドレスでアクセスするとcentOS のテストページが表示されてしまうので、forbidden が出るよう設定を変更

参考:https://www.dataplan.jp/blog/server/2089

問題のipアドレスを探す方法として、tcpdump でパケットキャプチャを仕掛けて分析するという方法もあるらしい。

↓サーバーを再起動するとerror_log に残る
——————————————————————————————-
[Fri Aug 27 02:02:07 2021] [notice] caught SIGTERM, shutting down
——————————————————————————————-

 

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