WordPress本体の自動更新が止まっていた原因と対処

ある時、テスト環境のWordPress管理画面で次のような状態になっていました。

  • WordPress本体の自動更新が動いていない
  • 「自動更新を有効化」のリンクが表示されない
  • サイトヘルスに次の警告が表示される

「○か月前に期限切れになった自動更新。WP-Cron に問題がある可能性があります。」

■ 原因

調査の結果、サイトにBasic認証(.htaccess)を設定していたことが原因でした。

WordPressの自動更新や予約投稿などは、「WP-Cron」という疑似cron機能によって実行されており、内部的に次のような処理を行います。

  1. WordPressが自分自身にHTTPアクセス(ループバック通信)
  2. そのアクセスをトリガーに、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 だけ認証除外する記述を追加することで解決しました。


Comments

コメントを残す

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

CAPTCHA