わかりやすい

主にIT関連や時事ネタの興味を持ったことを、なるべくわかりやすく書いてみようとおもいます。

スポンサーリンク

drupal8のインストールが途中で振り出しに戻る

drupalのインストールをしていたのですが、表記の事象に遭遇。 ちなみに振り出しに戻る、というのはリダイレクトでブラウザでのインストールの最初の画面に飛ばされる、という意味です。

前提

  • Ubuntu 14.04 LTSにdrupal8.0.6をインストールする
  • 前段にリバースプロキシが存在する←結論を言うとこいつが原因

事象

drupalのインストールは概ね以下の手順になります。

  • OSをインストール
  • 必要なパッケージ(apache, php, mysqlとその関連)
  • drupalのダウンロード&展開&Apacheから見えるようにする
  • ブラウザで当該サーバにアクセス、設定が進んでいく

どこで表記の事象が起きるかというと、ブラウザで当該サーバにアクセスした後。具体的には以下。

  • 言語の選択
  • プロフィールの選択
  • 必要条件の検証
  • データベースのセットアップ←このステップの次で「言語の選択」に戻される
  • サイトのインストール
  • 翻訳のセットアップ
  • サイトの環境設定
  • 翻訳の完了

対処

drupalのパッケージを展開した後、sites/default/default.settings.phpを以下のとおり編集する

(snip)
-# $settings['reverse_proxy'] = TRUE;
+$settings['reverse_proxy'] = TRUE;
(snip)
-# $settings['reverse_proxy_addresses'] = array('a.b.c.d', ...);
+$settings['reverse_proxy_addresses'] = array('a.b.c.d');

ちなみに上記のa.b.c.dは、drupalが実際に動いているサーバから見える、リバースプロキシのIPアドレスと思われる。

原因

もはや対処で解決しちゃった人は興味がないと思いますが、原因の推測。 ちゃんと追いきっていませんので内容は薄っぺらです。

どうやらインストーラはリダイレクトとかを巧みに使っているようで、 リバースプロキシが存在すると、それがうまく動かない模様。 エラー時にphpが「header already sent」的なエラーを吐いていました。

ちなみに、かなりハマった…。いろいろ調べた。

  • phpのエラーログを有効にしてみた
  • エラーで特定したファイル・行を確認してみた
    • ある箇所Bでヘッダ出力しようとしたとき、ある箇所Aですでにヘッダ出力されていることはわかった
    • しかし、それがなぜだかわからない…
  • サーバとかクライアントでパケットキャプチャしてみた
  • 手元のVirtualBoxdrupalをインストールしてみた
    • うまくいった
  • VirtualBoxと問題が起きている環境でインストール時のパケットキャプチャをして比べてみた
    • 失敗しているほうはTCPのRSTが頻発。これがリバースプロキシの有無と関連しているかどうかは不明
  • ためしに問題が起きている環境でリバースプロキシをはずしてみた
    • うまくいった
  • ようやく以下にたどりつく

やっと解決。ちなみに関連エラーは以下のとおり。

振り出しに戻される(リダイレクトされる)ときにphpのエラーログに出力される内容

RuntimeException: Failed to start the session because headers have already been sent by "/path/to/drupal-8.0.6/vendor/symfony/http-foundation/Response.php" at line 1151. in /path/to/drupal-8.0.6/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php on line 144

これはもはやdrupalとは関係なくなってきていて、罠。この先に答えは見つけられませんでした。

振り出しに戻されたあと、再度インストールを進めた際に途中でブラウザに表示される内容

Error
The website encountered an unexpected error. Please try again later.
Drupal\Core\Config\UnmetDependenciesException: Configuration objects (block.block.bartik_account_menu, block.block.bartik_branding, block.block.bartik_breadcrumbs, block.block.bartik_content, block.block.bartik_footer, block.block.bartik_help, block.block.bartik_local_actions, block.block.bartik_local_tasks, block.block.bartik_main_menu, block.block.bartik_messages, block.block.bartik_page_title, block.block.bartik_powered, block.block.bartik_search, block.block.bartik_tools, block.block.seven_breadcrumbs, block.block.seven_content, block.block.seven_help, block.block.seven_local_actions, block.block.seven_login, block.block.seven_messages, block.block.seven_page_title, block.block.seven_primary_local_tasks, block.block.seven_secondary_local_tasks, block_content.type.basic, comment.type.comment, contact.form.feedback, core.entity_form_display.block_content.basic.default, core.entity_form_display.comment.comment.default, core.entity_form_display.node.article.default, core.entity_form_display.node.page.default, core.entity_form_display.user.user.default, core.entity_view_display.block_content.basic.default, core.entity_view_display.comment.comment.default, core.entity_view_display.node.article.default, core.entity_view_display.node.article.rss, core.entity_view_display.node.article.teaser, core.entity_view_display.node.page.default, core.entity_view_display.node.page.teaser, core.entity_view_display.user.user.compact, core.entity_view_display.user.user.default, editor.editor.basic_html, editor.editor.full_html, field.field.block_content.basic.body, field.field.comment.comment.comment_body, field.field.node.article.body, field.field.node.article.comment, field.field.node.article.field_image, field.field.node.article.field_tags, field.field.node.page.body, field.field.user.user.user_picture, field.storage.node.comment, field.storage.node.field_image, field.storage.node.field_tags, field.storage.user.user_picture, filter.format.basic_html, filter.format.full_html, filter.format.restricted_html, node.type.article, node.type.page, rdf.mapping.comment.comment, rdf.mapping.node.article, rdf.mapping.node.page, rdf.mapping.taxonomy_term.tags, taxonomy.vocabulary.tags) provided by standard have unmet dependencies in Drupal\Core\Config\UnmetDependenciesException::create() (line 89 of core/lib/Drupal/Core/Config/UnmetDependenciesException.php).
Drupal\Core\Config\UnmetDependenciesException::create('standard', Array) (Line: 465)
Drupal\Core\Config\ConfigInstaller->checkConfigurationToInstall('module', 'standard') (Line: 136)
Drupal\Core\ProxyClass\Config\ConfigInstaller->checkConfigurationToInstall('module', 'standard') (Line: 146)
Drupal\Core\Extension\ModuleInstaller->install(Array, ) (Line: 87)
Drupal\Core\ProxyClass\Extension\ModuleInstaller->install(Array, ) (Line: 1560)
install_install_profile(Array) (Line: 648)
install_run_task(Array, Array) (Line: 526)
install_run_tasks(Array) (Line: 116)
install_drupal(Object) (Line: 39)

これはこれでぐぐるとそこそこ情報が出てきてしまい、罠。この先に答えは見つけられませんでした。

おまけ

自分のサーバは非力でインストールにすごく時間がかかります。 結果的に途中でHTTPがタイムアウトしてインストールが失敗してしまいました。

リクエスト処理時間が数時間? - HTTPサーバのタイムアウト設定について - — ありえるえりあ

上記を参考にいろいろ調べたところ、タイムアウトが発生しているのはクライアントとリバースプロキシの間。 つまり、バックエンドのWebサーバからの返事が遅すぎるので、リバースプロキシがクライアントにタイムアウトを返しちゃっている、ということのようです。

そんなわけで、リバースプロキシのタイムアウト設定を変更。

https://httpd.apache.org/docs/2.2/ja/mod/mod_proxy.html#proxytimeout

これでプロキシ時のタイムアウトを長くして問題が発生しなくなった。