WordPress の wp-cron を無効にしたら劇的にパフォーマンスが改善した話

WordPress の wp-cron を無効にしたら劇的にパフォーマンスが改善した話
あぱーブログ
2017年5月24日  カテゴリー:WEB  タグ: ,
Pocket
LINEで送る

WordPress の wp-cron(代替 cron)は、記事の予約投稿やバックアップなどの定時実行をするための仕組みです。ふとしたきっかけからこの wp-cron を無効にしたところ、サーバーのメモリ不足が解消されWEBパフォーマンスが改善されました。そこで今回は、wp-cron を無効にした理由と wp-cron を使わずにシステムの cron で WordPress の自動処理を実行するための設定方法をご紹介いたします。

きっかけは謎のDoS攻撃

つい先日、Apache のDoS攻撃対策機能を検証するため、とある WordPressサイトのサーバーにDoS攻撃を検出できるモジュールを設置しました。

モジュールが出力するログを確認してみると、同じIPアドレスから大量のDoS攻撃が!!しかも1日中攻撃しています。

[Tue May 16 06:51:54.053502 2017] [:notice] [pid 813] dosdetector: '160.16.57.86' is suspected as DoS attack! (counter: 6)
[Tue May 16 06:53:54.065761 2017] [:notice] [pid 1282] dosdetector: '160.16.57.86' is suspected as DoS attack! (counter: 6)
[Tue May 16 07:01:46.396708 2017] [:notice] [pid 1920] dosdetector: '160.16.57.86' is suspected as DoS attack! (counter: 6)
[Tue May 16 07:04:49.433557 2017] [:notice] [pid 2053] dosdetector: '160.16.57.86' is suspected as DoS attack! (counter: 6)
[Tue May 16 07:06:51.451984 2017] [:notice] [pid 2280] dosdetector: '160.16.57.86' is suspected as DoS attack! (counter: 6)
[Tue May 16 07:07:39.727619 2017] [:notice] [pid 2345] dosdetector: '160.16.57.86' is suspected as Hard DoS attack! (counter: 11)
[Tue May 16 07:09:51.084389 2017] [:notice] [pid 2399] dosdetector: '160.16.57.86' is suspected as DoS attack! (counter: 6)
[Tue May 16 07:12:42.379171 2017] [:notice] [pid 2597] dosdetector: '160.16.57.86' is suspected as DoS attack! (counter: 6)
[Tue May 16 07:16:32.465907 2017] [:notice] [pid 2991] dosdetector: '160.16.57.86' is suspected as DoS attack! (counter: 6)

(こんなログが1日中続く、、、)

いったいどこの誰がこんなDoS攻撃を?しかもかなり執拗です(^^;)
 

ただ、どうもIPアドレスに見覚えがあるのです。少し調べてみると DoS攻撃の元はモジュールを設置したそのWordPressサイトのIPアドレスと一致します。なんと自分で自分のサーバーに DoS攻撃をしかけているのです!

$ dig blog.apar.jp
(略)
blog.apar.jp. 300 IN A 160.16.57.86 ← WordPressサイトのIPアドレス
 
(Dos攻撃のログ)
[Tue May 16 07:16:32.465907 2017] [:notice] [pid 2991] dosdetector: '160.16.57.86' is suspected as DoS attack! (counter: 6)

WordPressに詳しい方でしたらすでにご察しのことかと思いますが、DoS攻撃の原因はコレでした。下はApacheのアクセスログです。

160.16.57.86 - - [16/May/2017:16:51:24 +0900] "POST /wp-cron.php?doing_wp_cron=1494921084.2627639770507812500000 HTTP/1.1" 200 - "https://blog.apar.jp/wp-cron.php?doing_wp_cron=1494921084.2627639770507812500000" "WordPress/4.7.4; https://blog.apar.jp"
160.16.57.86 - - [16/May/2017:16:51:29 +0900] "POST /wp-cron.php?doing_wp_cron=1494921089.9014298915863037109375 HTTP/1.1" 200 - "https://blog.apar.jp/wp-cron.php?doing_wp_cron=1494921089.9014298915863037109375" "WordPress/4.7.4; https://blog.apar.jp"
160.16.57.86 - - [16/May/2017:16:51:40 +0900] "POST /wp-cron.php?doing_wp_cron=1494921100.0652639865875244140625 HTTP/1.1" 200 - "https://blog.apar.jp/wp-cron.php?doing_wp_cron=1494921100.0652639865875244140625" "WordPress/4.7.4; https://blog.apar.jp"
160.16.57.86 - - [16/May/2017:16:51:47 +0900] "POST /wp-cron.php?doing_wp_cron=1494921107.7849919795989990234375 HTTP/1.1" 200 - "https://blog.apar.jp/wp-cron.php?doing_wp_cron=1494921107.7849919795989990234375" "WordPress/4.7.4; https://blog.apar.jp"
160.16.57.86 - - [16/May/2017:16:52:00 +0900] "POST /wp-cron.php?doing_wp_cron=1494921120.8122279644012451171875 HTTP/1.1" 200 - "https://blog.apar.jp/wp-cron.php?doing_wp_cron=1494921120.8122279644012451171875" "WordPress/4.7.4; https://blog.apar.jp"
160.16.57.86 - - [16/May/2017:16:52:08 +0900] "POST /wp-cron.php?doing_wp_cron=1494921128.1159739494323730468750 HTTP/1.1" 200 - "https://blog.apar.jp/wp-cron.php?doing_wp_cron=1494921128.1159739494323730468750" "WordPress/4.7.4; https://blog.apar.jp"
160.16.57.86 - - [16/May/2017:16:52:19 +0900] "POST /wp-cron.php?doing_wp_cron=1494921138.9311130046844482421875 HTTP/1.1" 200 - "https://blog.apar.jp/wp-cron.php?doing_wp_cron=1494921138.9311130046844482421875" "WordPress/4.7.4; https://blog.apar.jp"
160.16.57.86 - - [16/May/2017:16:52:49 +0900] "POST /wp-cron.php?doing_wp_cron=1494921168.7744019031524658203125 HTTP/1.1" 200 - "https://blog.apar.jp/wp-cron.php?doing_wp_cron=1494921168.7744019031524658203125" "WordPress/4.7.4; https://blog.apar.jp"
160.16.57.86 - - [16/May/2017:16:52:50 +0900] "POST /wp-cron.php?doing_wp_cron=1494921170.3814280033111572265625 HTTP/1.1" 200 - "https://blog.apar.jp/wp-cron.php?doing_wp_cron=1494921170.3814280033111572265625" "WordPress/4.7.4; https://blog.apar.jp"

(こんなログも1日中続く、、)

WordPressは定時実行をするために、ページへアクセスがあるたびに自分のサーバーから wp-cron.php を HTTP(もしくはHTTPS)経由で実行しますので、このような謎のDoS攻撃?が発生します。アクセスが多い時間帯では1分間に20回以上も wp-cron.php が実行されていることもありました。

wp-cron は、特別な設定なしに定時実行を実現できるよく考えられた仕組みなのですが、単純に計算して、そのサイトのページビュー数×2近くの負荷がサーバーにかかることになります。これはあまりにリソースがもったいないので wp-cron を無効にすることにしました。

wp-cron を無効にする設定

WordPress の設定ファイル(wp-config.php)に次の一行を追加するだけで wp-cron を無効にできます。注意点として設定ファイルの最後に追加した場合 wp-cron が無効にならないことがありますので、必ず設定ファイルの先頭「<?php」の次の行に追加します。

sudo vi /var/www/wordpress/wp-config.php

<?php
define('DISABLE_WP_CRON', 'true'); ←必ず先頭に追加

システムの cron の設定

wp-cron を無効にすると、記事の予約投稿やバックアップなどの定時実行が動作しなくなりますので、システムの cron で wp-cron.php を定期的に実行するように設定します。

こちらの注意点としては システムの cron の実行ユーザーは、必ずWEBサーバーの実行ユーザーにすることです。root ユーザーなどで実行してしまうとファイルアクセス権がらみのトラブルをまねくことがあります。

まず php のパスを確認します。

$ which php
/usr/bin/php ← php のパス

続いてWEBサーバーの実行ユーザーを確認します。下の表示の場合は行頭に表示されている「apache」がWEBサーバーの実行ユーザーになります。

$ps aux | grep httpd
(略)
apache 21013 0.1 1.8 505548 37056 ? S 06:44 0:01 /usr/sbin/httpd -DFOREGROUND
apache 21518 0.1 2.2 513720 46112 ? S 06:51 0:01 /usr/sbin/httpd -DFOREGROUND
apache 21872 0.2 2.4 519624 50292 ? S 06:56 0:01 /usr/sbin/httpd -DFOREGROUND
apache 22230 0.2 1.6 501456 32920 ? S 07:01 0:00 /usr/sbin/httpd -DFOREGROUND

以上をふまえて cron の設定ファイルの最後に次の一行を追加します。wp-cron.php のパスはご自分の環境にあわせて変更してください。(wp-cron.php は WordPressをインストールしたディレクトリの直下にあります)

sudo vi /etc/crontab

* * * * * apache /usr/bin/php /var/www/wordpress/wp-cron.php > /dev/null 2>&1

これで1分ごとに apache ユーザーが wp-cron.php を実行するようになります。記事の予約投稿などで定時実行が動作していることを確認しましょう。

改善されたパフォーマンスの確認

メモリが不足ぎみのサーバーでしたが、wp-cron を無効にしたところ、メモリ(free)の緑の線が上昇しメモリ不足が解消されたことが確認できました。

特に改善されたのがWEBのレスポンスタイム(FirstByte)です。メモリ不足が原因のためかレスポンスに1秒以上かかっていましたが wp-cron を無効にした後は平均0.3秒ほどにおさえられています。

おわりに

これまで「WordPressはメモリを食うのでサーバースペックは高めの方がいいっすよ!」とドヤ顔で提案していました。WordPressの仕組みを理解してちゃんと設定していればそんなことはありません。ほんとにゴメンナサイ(^^;)

スポンサーリンク
Pocket
LINEで送る

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です