名前 | バージョン |
---|---|
VPS | さくらインターネット 4GB |
OS | KUSANAGI 8.4.2-2 (CentOS7 ベース) |
ウェブサーバー | nginx 1.15.10 |
PHP | PHP 7.3.4 |
MySQL | MariaDB 10.1.38 |
アプリケーション | WordPress |
その他 | Mackerel |
サイトにブラウザからアクセスすると「データベース接続確立エラー」となる。
コンソールにて。
sudo cat /var/log/messages
以下のログを発見。
Apr 14 00:31:06 hoge kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
MySQL が落ちている。
コンソールにて。
sudo systemctl start mysqld
「データベース接続確立エラー」は解消される。
「データベース接続確立エラー」
コンソールにて。
sudo cat /var/log/messages
同様のログを確認。
Apr 14 07:48:32 hoge kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Mackerel でのメモリ状況を確認。
メモリを食いつぶした後スワップまで喰って無事死亡している。
詳細は割愛するが、nginx のログを確認したところ、ブルートフォースアタックでの接続数増、pubsubhubbub での接続数増、行儀の悪い bot からの接続数増など様々な痕跡があった。
なお、KUSANAGI による nginx ログは以下の場所に分散している。
(筆者はしばらくの間ログ分散に気付かず、確認に時間がかかった。)
/home/kusanagi/kusanagi_html/log/nginx/ssl_access.log
※ kusanagi_html はプロビジョニングディレクトリ
/home/kusanagi/kusanagi_html/log/nginx/access.log
※ kusanagi_html はプロビジョニングディレクトリ
/var/log/nginx/access.log
コンソールにて。
sudo vim /etc/php-fpm.d/www.conf
/pm.max_children =
i
PHP-FPM の設定を変更する。
pm.max_children = 50
を以下に変更。
pm.max_children = 17
[esc] キーで編集終了。
KUSANAGI (nginx + php-fpm) 再起動
sudo kusanagi restart
Mackerel でのメモリ状況
ピーク時のメモリ消費量が 3.5GB 程度と、上限の 4GB から 0.5GB 程度余裕のある状態で消費しきらずに、スワップアウトも発生しない。
結果、「データベース接続確立エラー」とならず接続状況は安定している。
PHP-FPM の pm.max_children
はアプリケーションの最大プロセス数。php.ini ファイルでの memory_limit
は 128M
に設定されているため、pm.max_children
を 17
に設定した場合 PHP-FPM のみで食いつぶすメモリ量を 2GB 程度に抑えることができる。
デフォルトで 1GB 程度消費しているため、計約3GB。さらに MySQL などで 0.5GB 程度消費しているものと思われる。
詳細は top
コマンド等で確認できる。
万が一落ちた場合に monit で MySQL の自動再起動、fail2ban によるブロッキング設定を行いたいが後ほど。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント