Drupal8のアップデート

2018年9月12日

Drupal8 の構築を引き続きやっています。古いバージョンでセットアップしてしまったので、最新バージョンの 8.4.3 にアップデートしようとしたところ、update.php がうまく動作しない問題が起きました。

今回は解決方法とそこに至る顛末を紹介しようと思います。分かってみればそれほど難しい話では無かったのですが、情報にたどり着くまで時間が掛かってしまいました。

Drupal8 のアップデートは、Update Manager Module が有効で無い場合、アーカイブを展開して FTPクライアントなどでファイルを置き換えます。最初に「環境設定」からメンテナンスモードを有効にします。その後ドキュメントルートの /sites と /themes を除いた全てのファイルを削除して、新しいファイルと置き換えます。

マイナーアップデートであれば、この状態でも特に問題無く表示されると思いますが、たいていは DB の登録データのアップデータが必要で、その場合は「レポート」で更新を促すメッセージが出ます。メッセージに従って /update.php をアクセスして、データベースの更新ボタンをクリックすると、

/update.php/selection

という URL に移動するのですが、これが Not Found になって動作しません。nginx のリライト処理がうまくいっていないのですが、これをどう表現するのか分かりませんでした。ちなみに Apache なら .htaccess にリライトディレクティブが記述されているので、問題なく動作するようです。

エラーメッセージを頼りに検索すると、Drupal の公式サイトにいくつかやり取りが見付かりました。皆さん同じところで引っ掛かっているようですが、回答者の記述がまちまちで、いくつかのパターンを試したものの、自分のサイトではうまくいきませんでした。

その後いくつかの情報を渡り歩いた結果、nginx の公式サイトに Drupal8 での記述例があると分かり、更に日本語訳してくれている情報がありました。ポイントはphp を fastcgi で動作させる為の location 記述で、

location ~ \.php$ {
    root /var/www/html;
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

この部分の記述を

location ~ '\.php$|^/update.php' {
    root /var/www/html;
    fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
    include fastcgi_params;
    fastcgi_param HTTP_PROXY "";
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_intercept_errors on;
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
}


このように書き直すことで無事に動作して、DB のアップデートも正常に出来ました。update.php の後に続く拡張子無しの場合のリライトパターンを指定しているようですが、具体的に何やってるのかいまいち理解してません。

これから理解の為に勉強が必要だと分かりました。公式の例では、Drupal8 に付属する .htaccess の記述を有効にする為の他の書き方も色々載っていますので、いずれちゃんと実装しようと思います。