はじめに
私の管理しているWordPressサイトが静かに落ちる。
リソースに問題はないはずなのに静かに落ちる。
監視グラフとログとにらめっこして原因を探って対策をしましょう。
システム構成
下図のように Cloudflare + Linux(Ubuntu 22.04) + nginx + PHP-FPM の構成になっています。
間にCDNを挟んでいるのでアクセス過多ではなさそうですが、いったい原因は何でしょう?
wp-cron.phpの実行エラー
調査のためにトップページのHTTPS応答時間をZabbixで1分おきに計測しました。
すると最大で1時間に6回ほど応答時間が遅くなっています。
このスパイクが発生している時間帯のログを確認すると下記のものがありました。
××.××.××.×× - - [×/×/××:××:××:×× +0900] "POST /wp-cron.php?doing_wp_cron=×××××.×××××××× HTTP/2.0" 499 0 "-" "WordPress/×.×.×; https://rtmaddon-search.com"
wp-cron.php
の実行で499エラーが発生しています。
ログ全体を調査したところ、1日の間に8413回実行されたうち、426回(約5%)で499エラーが出ていました
対策
wp-config.php
で DISABLE_WP_CRON
の設定を有効にします。
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
define( 'DISABLE_WP_CRON', 'true' ); # 追記
下記のシェルスクリプトを用意します。
#/bin/bash
/usr/bin/php×.× /<path-to-wp-home-dir>/wp-cron.php
※使用される際はPHPのバージョン等、ご利用の環境に合わせて変更してください。
crontab -u www-data -e
コマンドを発行し、下記のスケジュールを登録し10分に一回wp-cron.shが実行されるようにします。
*/10 * * * * /<path-to-script-dir>/wp-cron.sh > /dev/null 2>&1
それでもまだ落ちる
先ほどの対策後スパイクは減少しましたが、Zabbix上でHTTPS応答時間が0秒(タイムアウト)になる瞬間が引き続き確認できます。(画像赤丸内)
この時間帯のPHP-FPMのログを見ると下記のような事象が発生していました。
[×-××-×× ××:××:××] WARNING: [pool www] child 430165, script '/<path-to-wp-home-dir>/index.php' (request: "GET /index.php") execution timed out (31.228176 sec), terminating
[×-××-×× ××:××:××] WARNING: [pool www] child 430165 exited on signal 15 (SIGTERM) after 33.326078 seconds from start
WordPressの何かの処理で30秒以上掛かっていてワーカーが強制終了されています。
この時間帯のnginxのログを調査して499が発生しているページをひとつずつ確認したところ、特定の投稿ページ内容が原因であると分かりました。
その投稿にはoEmbed(wp:embed)が約60個埋め込まれていて、その処理で時間がかかっていました。
対策
システム的にはどうしようもないのでページの投稿者と相談して一度下書き設定にし、非公開にした後に別途ページを作り直してもらいました。
最後にCM
今回の調整を行ったWordPressサイトはこちらです。
https://rtmaddon-search.com/
Minecraft Forge MOD の一つであるRTMのアドオン紹介・検索サイトです。
ご興味御ある方はぜひお越しください。