「メンテナンスのためしばらく利用できません」が消えない時の対処法

実測 に検証

WordPress の更新が途中で止まって、全ページがこの表示になった。

メンテナンスのためしばらく利用できません。すぐに復旧しますのでしばらくお待ちください。

管理画面にも入れません。復旧方法と、待っていれば直るのかどうかを実測しました。

何が起きているのか

WordPress は更新処理の間、サイトのルートに .maintenance という 1 行のファイルを作ります。

<?php $upgrading = 1789148000;

数字は処理を始めた時刻です。このファイルがある間、WordPress は すべてのリクエストにメンテナンス画面を返します。更新が正常に終われば 自動で削除されますが、途中で止まると残ります。

実測: 全部 503 になる

メンテナンス画面

「現在メンテナンス中のため、しばらくの間ご利用いただけません。」— これだけが全 URL で返る

URLHTTP
サイト503
/wp-admin/503
/wp-login.php503

ログイン画面も 503 です。ブラウザからは何もできません。

レスポンスヘッダには Retry-After: 600 が付いていました。

HTTP/1.1 503 Service Unavailable
Retry-After: 600

503 と Retry-After は「一時的に使えない」を意味する正しい返し方なので、 検索エラーとしてインデックスから落とされる心配はありません。 むしろ、この期間に 200 で壊れた画面を返すほうが問題になります。

待てば直るのか: 10 分で自動解除される

WordPress はファイルの中の時刻を見ていて、10 分以上前なら メンテナンス画面を出しません。

実測です。

$upgrading の値サイト
現在時刻503
現在時刻より 700 秒前200

ファイルを消さなくても、10 分経てばサイトは戻ります。

ここから逆算できることがあります。

メンテナンス表示が 10 分以上続いているなら、単なる更新の中断ではありません。

  • 更新処理が止まったのではなく、繰り返し走っている(cron や自動更新が リトライし続けて、そのたびに時刻が書き直されている)
  • WordPress のものではない(サーバー会社やプラグインの独自メンテナンスモード)
  • ファイルのタイムスタンプではなく中身の時刻を見るので、FTP でファイルの 更新日時だけ見ても判断できない(中を開いて数字を確認する)

復旧

FTP かファイルマネージャで、サイトのルートにある .maintenance を削除します。 削除後は即座に 200 に戻りました(実測)。

/public_html/.maintenance    ← これを削除

先頭がドットのファイルなので、FTP クライアントの設定で隠しファイルを 表示しないと見えません。「ファイルが無い」と思ったら、まず隠しファイルの 表示設定を確認します。 FTP でできる他の復旧手順は → FTP と phpMyAdmin だけで復旧する方法

削除した後にやること

.maintenance を消しても、更新自体は途中で止まったままです。 プラグインやコアのファイルが半分だけ入れ替わっている可能性があります。

  1. サイトと管理画面が正常に開くか確認する
  2. 更新が途中だったプラグインを、管理画面からもう一度更新する
  3. コアの更新が途中だった場合は「更新 > 今すぐ再インストール」を実行する

なぜ途中で止まるのか

実測ではなく一般的な原因ですが、更新処理は ダウンロード・解凍・ファイル差し替え・DB 更新を続けて行うため、 途中で止まる要因が多い処理です。

  • PHP の実行時間上限(max_execution_time)に達した
  • メモリ不足で Fatal になった
  • ディスクの空き容量が足りなかった
  • 更新中にブラウザを閉じた・回線が切れた

実行時間やメモリが原因の場合は、debug.log か PHP のエラーログに 記録が残ります(→ ログの場所)。何度やっても同じところで止まるなら、そちらを先に見ます。

意図的に出す場合

計画メンテナンスで同じ画面を出したいときは、.maintenance を自分で置く手も あります。ただし 10 分で自動解除されるので、長時間の作業には使えません。

長く出すなら、.maintenance ではなく wp-content/maintenance.php(WordPress が代わりに読む差し替え用ファイル)か、 Web サーバー側で 503 を返す設定を使います。

再現手順

# 出す
printf '<?php $upgrading = %s;\n' "$(date +%s)" > .maintenance
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080/          # 503
curl -s -o /dev/null -D - http://localhost:8080/ | grep -i retry-after    # 600

# 10 分より前の時刻にすると自動で解除される
printf '<?php $upgrading = %s;\n' "$(( $(date +%s) - 700 ))" > .maintenance
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080/          # 200

# 消す
rm .maintenance