Apache mod_proxy の背後に Discourse をインストールする方法

こんにちは。

Docker コンテナ内で Discourse をセットアップしようとしています。ホスト環境(Debian)では Apache httpd サーバーが動作しています(他のサイトを Apache でホストしているため、nginx は実行できません)。コンテナはポート 3000 でリッスンしており、mod_proxy を使用してリバースプロキシ化したいと考えています。

この仮想ホストに対する Apache の現在の設定は以下の通りです。

<VirtualHost *:80>
  ServerAdmin webmaster@example.com
  ServerName example.com
  ServerAlias www.example.com

  ErrorLog ${APACHE_LOG_DIR}/vhosts/example.com/error.log
  CustomLog ${APACHE_LOG_DIR}/vhosts/example.com/access.log combined

  <IfModule proxy_module>
  ## <https://meta.discourse.org/t/running-other-websites-on-the-same-machine-as-discourse/17247>
    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
  </IfModule>
</VirtualHost>

最初は ProxyPass と ProxyPassReverse ディレクティブのみで始め、その後 ProxyPreserveHost と RequestHeader ディレクティブを一つずつ追加しました。これらのディレクティブを使用してプロキシをどのように設定しても、ドキュメントルート以下の特定のファイル(例えば /images や /assets 内のものなど)にアクセスすると 404 エラーが返されます。

nginx 構文から Apache 構文に変換した Discourse Meta の URL が含まれるコメントにもご注目ください。

この問題を解決する方法について、ご助言をいただければ幸いです!

Set up Discourse on a server with existing Apache sites をご覧ください。

つまり、提案されている解決策は、Discourse を HAProxy の背後で、さらに Apache の背後で実行することでしょうか?

繰り返しになりますが、このマシンで他の vhost もホストしているため、前面には Apache を使用する必要があります。

なぜ nginx ではないのでしょうか?Discourse と Apache の組み合わせのパフォーマンスについては確信が持てません。

今は nginx に切り替える時間やリソースがありません。

はっきりさせておきますが、Discourse 自体は nginx で動作しますが、Apache を通してプロキシする必要があります。

さらに詳しく調べてみたところ、HAProxy が vhost に基づいてバックエンドを選択できるようなので、私が目指していることが実現できると考えています。

申し訳ありません。誤った検索をしてしまいました。もう一度お試しください。Apache の howto を見つけることができるかもしれません。

HAProxy は私が求めている機能を果たしており、非常に完成度が高く有用なツールのように見えます。ご教示ありがとうございます。

ただし、templates/web*.yml を編集してデフォルトの 80 および 443 以外のポートでリスニングさせる設定が問題の原因だったようです。デフォルト設定を復元した後、containser/app.yml を以下のような行に編集したところ、404 エラーが消えました。

expose:
  - "127.0.0.1:1234:80"    # http

最近、Traefik をとても気に入っています。Let’s Encrypt の証明書を自動的に発行してくれます(HA-Proxy でも可能ですが、少し手間がかかります)。

解決できてよかったです!