Drupal8のアップデート
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 の記述を有効にする為の他の書き方も色々載っていますので、いずれちゃんと実装しようと思います。
ディスカッション
コメント一覧
まだ、コメントがありません