例のWordPressの脆弱性について、何故か自動アップデートが機能していないサイトが有った、という話にTwitterでなったのでちょろっと。
WordPress が自動アップデートされない!
WPの自動アップデートが働かない場合
– 明示的に切ってる ( define( 'WP_AUTO_UPDATE_CORE', false ); )
– wp-cronを遮断してる(内部で叩いてるだけだけど)
– アクセスがない— 赤字年(JC13) (@hnle0) February 6, 2017
DISABLE_WP_CRON ってのもある
— 赤字年(JC13) (@hnle0) February 6, 2017
ほかに、
- Load Balancer前に挟んでいて同期がちゃんとできていない
- WPがパーミッション等問題で自動更新できない
- サーバーから自ドメインにHTTPリクエスト出来ない
- 証明書検証で死んでいる
なんかも考えられる。
WPのcronについて
cronはリクエスト時にHTTPで内部的に叩かれるとかだったはず
— 赤字年(JC13) (@hnle0) February 6, 2017
cron使えない鯖でも関係ないよ
— 赤字年(JC13) (@hnle0) February 6, 2017
ただサイトのドメインを鯖からリクエストしても鯖にリクエストが届かないような環境だとwp-cronが使えない
— 赤字年(JC13) (@hnle0) February 6, 2017
wp-cronはあくまでも疑似cronなのでcrondの有無は普通関係ない(wp-cliをcronから呼んで使うこともできる)
— 赤字年(JC13) (@hnle0) February 6, 2017
wp-includes/cron.php:340 辺りで叩いてるね
— 赤字年(JC13) (@hnle0) February 6, 2017
ところでwp-cronでググると無効化する方法!みたいなのばっかヒットする。
ぐぐったら無効化ばっか出てくるんだけど
— 赤字年(JC13) (@hnle0) February 6, 2017
wp-cronはcronを用いずに非同期のタスクを実行するための仕組みなので普通は無効化する必要はないし、するべきでない。
もし無効化するのなら、cronでwp-cron.phpやwp-cliのwp cron event run --due-now
を叩くか、外部のcronサービスを用いてcronをじっこうしてやるべきである。
たとえばwp-cronを無効化していると自動更新だけでなく、予約投稿とかも使えなくなるので注意すること。
WPの自動アップデートが正しく機能しない主な原因は上に上げたようなものだが、それ以外もあると思う。
【追記 2018/2/7】WP4.9.3で壊れた…
この追記時点において、WordPress 3.7以降で自動アップデートが働かなくなってしまったバージョンが唯一存在している。WordPress 4.9.3だ。(#43103で誤って無効化されてしまった)
もし、自動アップデートで4.9.3になっている場合、手動アップデートが必要なので注意。4.9.3リリース翌日に4.9.4はリリース済み。(手動といっても管理画面1クリックで問題ない。)
なお、管理画面からアップデートする他、
- WP-CLI でアップデート (
wp core update
) - コマンドラインからのPHP直接呼び出し (
php -r 'include "wp-load.php"; wp_maybe_auto_update();'
)
といった手段も紹介されている。