突然のネットワーク障害

WordPressの管理画面でプラグインのアップデートをしていた所、アップデート中に突然のネットワーク障害でサーバーから切断。ネットワークが回復して再度Webサイトにアクセスすると「現在メンテナンス中のため、しばらくの間ご利用いただけません」の文字が!うおおおお、管理画面どころかサイト自体も見えなくなってしまった!そこで、このメッセージが出てからの対処法をまとめました。

メッセージの発生箇所の特定

とりあえずこのメッセージを出力している所を見ようと思って、WordPressのディレクトリを検索。日本語翻訳ファイルに以下の記述を発見。

#: wp-includes/load.php:223
msgid "Briefly unavailable for scheduled maintenance. Check back in a minute."
msgstr "現在メンテナンス中のため、しばらくの間ご利用いただけません。

そしてさらに検索するとコアファイルの中の wp-includes/load.php ファイル中に定義されているwp_maintenance()関数にたどり着きました。

function wp_maintenance() {
  if ( ! file_exists( ABSPATH . '.maintenance' ) || wp_installing() )
    return;

  global $upgrading;

  include( ABSPATH . '.maintenance' );
  // If the $upgrading timestamp is older than 10 minutes, don't die.
  if ( ( time() - $upgrading ) >= 600 )
    return;

  /**
   * Filters whether to enable maintenance mode.
   *
   * This filter runs before it can be used by plugins. It is designed for
   * non-web runtimes. If this filter returns true, maintenance mode will be
   * active and the request will end. If false, the request will be allowed to
   * continue processing even if maintenance mode should be active.
   *
   * @since 4.6.0
   *
   * @param bool $enable_checks Whether to enable maintenance mode. Default true.
   * @param int  $upgrading     The timestamp set in the .maintenance file.
   */
  if ( ! apply_filters( 'enable_maintenance_mode', true, $upgrading ) ) {
    return;
  }

  if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) {
    require_once( WP_CONTENT_DIR . '/maintenance.php' );
    die();
  }

  wp_load_translations_early();

  $protocol = wp_get_server_protocol();
  header( "$protocol 503 Service Unavailable", true, 503 );
  header( 'Content-Type: text/html; charset=utf-8' );
  header( 'Retry-After: 600' );
?>
  <!DOCTYPE html>
  <html xmlns="http://www.w3.org/1999/xhtml"<?php if ( is_rtl() ) echo ' dir="rtl"'; ?>>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title><?php _e( 'Maintenance' ); ?></title>

  </head>
  <body>
    <h1><?php _e( 'Briefly unavailable for scheduled maintenance. Check back in a minute.' ); ?></h1>
  </body>
  </html>
<?php
  die();
}

どうやらメンテナンス中は .maintenance というファイルが出来上がり、更新処理などが終わればいなくなるようです。ということは、更新処理を中断すると .maintenance ファイルが残ったままになり永遠にメンテナンスになる罠に陥るという現象になるようです。このファイルを削除することで解決しそうです。

.maintenance ファイルの削除

WordPressのインストールディレクトリをFTPSSHで接続して削除しましょう。

.maintenanceファイルの削除

削除してWebサイトを確認すると……戻った!\(^o^)/
うおおおおお!戻った!これ知らない人はパニックになるだろうな……FTPSSHで接続できない状況だった場合、ゾッとする。更新する時はそういったリスクがあることを踏まえてやるように心がけようと思った。
(中断時のロールバック処理などはどうやっているんだろうか?プラグインなら上書きで良い気がするけど、本体は?今度調べてみよう。)