ある時、テスト環境のWordPress管理画面で次のような状態になっていました。
- WordPress本体の自動更新が動いていない
- 「自動更新を有効化」のリンクが表示されない
- サイトヘルスに次の警告が表示される
「○か月前に期限切れになった自動更新。WP-Cron に問題がある可能性があります。」
■ 原因
調査の結果、サイトにBasic認証(.htaccess)を設定していたことが原因でした。
WordPressの自動更新や予約投稿などは、「WP-Cron」という疑似cron機能によって実行されており、内部的に次のような処理を行います。
- WordPressが自分自身にHTTPアクセス(ループバック通信)
- そのアクセスをトリガーに、
wp-cron.phpを呼び出して定期処理を実行
しかし、Basic認証がかかっていた為に、このアクセスが401エラーになり、cronの実行が失敗していました。
つまり、外部アクセスだけでなく自己アクセスも遮断してしまい、WP-Cronが完全停止した状態でした。
他にも、次のような不具合があるようです。
- プラグイン更新チェックが止まる
- 予約投稿が公開されない
■ 対処方法
Basic認証は維持したまま、wp-cron.php だけ認証除外する。
具体的には、.htaccess のBasic認証設定の直後に、以下を追加します。
▼ 追加設定
<Files wp-cron.php>
Satisfy Any
Order Allow,Deny
Allow from all
</Files>
▼ Apache2.4環境の場合(推奨記述)
サーバーがApache2.4系の場合は、以下の書き方が推奨されています。
<Files "wp-cron.php">
Require all granted
Satisfy any
</Files>
※古い Order Allow,Deny は将来的に非推奨となる可能性があります。
■ 今回のこのトラブルの備忘として
開発中サイトや検証環境では、セキュリティ目的でBasic認証をかけることがよくあります。
しかしWordPressは「外部cron」ではなく、HTTPアクセス依存のcron設計のため、
Basic認証をかけるとた cron が止まる
という体験をしました。
ほかにも、wp-config.php で代替Cronを有効にするという方法もあるそうです。
.htaccess の編集が難しい場合は、設定ファイル wp-config.php に以下の1行を追加すると、別の方式で cron を動かすことができます。
define('ALTERNATE_WP_CRON', true);
今回は、.htaccess に wp-cron.php だけ認証除外する記述を追加することで解決しました。
コメントを残す