WordPress の wp-cron.php を止め
Raspberry Pi の cron で 代替する
これを停止することによって、パフォーマンスが向上する。
2. nginx のアクセスログを見る
3. wp-cron.php を止める
4. linux の cron で代替する
5. cron のログを確認
6. cron に関するコマンド
wp-cron.php は、
時間と連動した処理で起動されるスクリプトで、
・記事の予約投稿
・メール投稿
・XML-Sitemap
などで使用される。wp-cron.php は、Dos攻撃などの不正アクセスに利用されることがあり、アクセス制限を掛ける方が良い。
問題は、
アクセスが発生する度に起動されるので、アクセス数が増えると、サーバへの負荷が掛かってしまう。例えば、ユーザーがサイトにアクセスすると wp-config.php が起動され、予約投稿の記事が無いかを確認する。毎回これが行われるので、アクセス数が多いサイトだと、サイトのパフォーマンスにも大きく影響する。
→ wp-config.php 自体を無効にすることが推奨されている。
(server ディレクティブに記述した。)
# nginxのアクセスログを出力
access_log /var/log/nginx/access.log;
(WordPressを導入したディレクトリーの直下にある。)
/** wp-cronを止める */
define('DISABLE_WP_CRON', 'true');
sudo crontab -e
35 * * * * curl https://arakan60.site/wp-cron.php > /dev/null 2>&1
HTTP / HTTPS経由での実行は、望ましくありません。
Webサーバー経由でアクセスすると、その分サーバーにオーバーヘッドが生じます。Webサーバーは、通信時に全体のコンテンツの長さを計算してレスポンスヘッダーに記載したり、圧縮処理を実行したり、名前解決などでネットワークを経由したり、キャッシュサーバーを利用している場合はトラフィック自体がネットワーク上を流れてしまったりするなど、様々な点でコマンドでの実行と比べ動作が遅くなる可能性を孕んでいます。また、Webサーバーが起動していないと動作せず、エラーを吐きます。
なお、この方法の場合は処理自体がWebサーバーを経由する(WebサーバーのユーザーがPHPファイルを読み込む)ため、rootユーザーで実行しても大丈夫です。
(/etc/cron.hourlyの中に、名前:wp-cron.shで作成。)
#!/bin/sh
# wp-config.php の実行
cd /; /usr/bin/php -q /home/yaopi/www/wordpress/wp-cron.php >/dev/null 2>&1
#
sudo crontab -e
# wp-config.php の実行
35 * * * * /etc/cron.hourly/wp-cron.sh
/usr/bin/php -q /home/yaopi/www/wordpress/wp-cron.php >/dev/null 2>&1
PHP コマンドラインオプション 【-q】
"-q"オプションを付けることで、HTTPヘッダを自動出力させないようにする。
/dev/null(nullデバイスとも呼ばれる)とは
UNIXやUnix系オペレーティングシステム (OS) におけるスペシャルファイルの1つで、そこに書き込まれたデータを全て捨て(writeシステムコールは成功する)、読み出してもどんなプロセスに対してもデータを返さない(EOFを返す)。
/dev/null は通常、プロセスの不要な出力ストリームを捨てるのに使う。
>/dev/null 2>&1
①標準出力
標準出力だけを出す場合
/path/script.sh 1> /path/exec.log②エラー出力
エラー出力だけ出す場合
/path/script.sh 2> /path/error.log③標準出力とエラー出力その1
両出力を一つのファイルに出す場合
/path/script.sh > /path/both.log 2>&1④標準出力とエラー出力その2
それぞれの出力を別々のファイルに出す場合
/path/script.sh 1> /path/exec.log 2> /path/error.log
上記設定で、【 cron 】は正常に起動・稼働するが、
【 cron のログ 】が書き出されない。
35 * * * * ユーザー /etc/cron.hourly/wp-cron.sh
ユーザーを指定すると、ログが書かれるがエラーになる。sudo cat /var/log/cron.log
sudo tail -f /var/log/cron.log
systemctl status cron.service
run level 2~5 で cron サービスが自動起動に設定されていることが分かる
sudo cat /var/log/cron.log
sudo tail -f /var/log/cron.log
「etc」ディレクトリの中の「crontab」ファイルで、「crontab -e」コマンドで編集されるcrontabファイルとは別物。
「crontab -e」コマンドで編集されるcrontabファイルは「/var/spool/cron/【ユーザ名】」になる。
→ 【reboot】以降、cron のログが書かれていない。
原因:rsyslogサービスが【 inactive 】になっている。
→ syslogサービスは、自動起動になっていない。
ps [option]
-e : 実行中のすべてのプロセスを表示
-a : すべてのプロセスを表示
-f : 完全( full )リストを作成します
-l : ロング形式出力を生成します
「rsyslogd」
システムのログを記録するデーモン。「syslog」と呼ばれる。
syslogdの代わりに「rsyslogd」が動いている。
(2020.10.07)