皆様、こんにちは
ドキュメントを確認し、公開されている設定手順や推奨事項を読み込み、私の固有の状況に合わせて変更を試みました。
非常にシンプルに見えるこの課題に対して、提案された解決策のいずれも機能していないことは、信じられないほどイライラするものです。
私たちの環境:
- AWS EC2 インスタンス(具体的には AWS Linux 2 AMI)を実行しています。
- Apache2 が実行され、設定されています。
- このインスタンスは、AWS ロードバランサーから参照される AWS ターゲットグループの一部です。
- SSL/TLS 証明書は AWS によって提供され、ロードバランサーに関連付けられています。
- ドメインプロバイダーは
name.comです。 - 設定の一環として、複数のサブドメインを CNAME レコードを使用してルーティングしており、これらはすべて AWS ロードバランサーを指しています。ロードバランサーはその後、EC2 インスタンスへのトラフィックを管理します。
- ロードバランサーにルーティングされ、Web ユーザーに提供されるすべてのトラフィックは安全です。
- サーバー上では、3 つの独立した Node.js Express アプリケーションを実行しています。
- ポートは Express サーバーの設定の一部として定義されており、現在は 3000、4000、5000 です。
- トラフィックは、Apache によってサブドメインに基づいて関連する Web アプリにルーティングされます。例:
<VirtualHost *:80>
ServerName subdomain.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:4000/"
ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
-
直接的な関連性はあまりありませんが、サーバー再起動時に自動的に起動するように、Express アプリの管理に PM2 を使用しています。
-
同じサーバーに Docker をインストールしました。
-
さらに、app.yaml をコピーして Discourse をインストールしました(ガイダンスとして Run other websites on the same machine as Discourse - #182 by angus を参照)。
現在の状況:
- Docker が実行されています
- Discourse アプリ(コンテナ)が実行されています
- Express アプリはすべて実行されており、Apache によって正しくルーティングされています
注記:
- 最初はドキュメントに従ってポートを公開せずにアプリをビルドしようとしましたが、機能しなかったため、HTTP ポート 80 に対してポート 8000 を公開しました。
- 私の単純な理解では、Docker は家のようなもので、各種コンテナは各部屋です。Docker はアプリへのアクセス方法(どの部屋にアクセスするか)を決定します。ポート 8000 を公開したかった理由は、8000 が公開されたことで、他の Express アプリと同じようにポート 8000 を参照できると思ったからです。しかし、これは機能しません。以下は、Apache で試みた例です:
# FAQ (DISCOURSE ROUTES)
<VirtualHost *:80>
ServerName discourse.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:8000/"
ProxyPassReverse "/" "http://localhost:8000/"
</VirtualHost>
- 単純なテストとして、サーバー上のブラウザに localhost:8000 を入力して試みました。サーバーには Chromium がインストールされた AWS 環境です。これが即座に解決されないという事実は、何らかの問題があり、私の理解に根本的な欠落があることを示しています。私の Web アプリは、Express 設定で指定したポートで実行され、利用可能ですが、Docker コンテナについても同様であると思っていました。
追加の注記:
- ローカルサーバー上で暴露されているポート(Docker コンテナ用)に
discourse.domain.ioからのトラフィックをルーティングし、*.domain.ioからのすべてのトラフィックを Apache のポート 9000 にルーティングし、その後 VirtualHost 設定を変更してポート 9000 からトラフィックをルーティングするという、NGINX を Apache と Docker の「前面」に配置する潜在的な解決策があることは理解しています。つまり:
# EXPRESS APP ROUTING IN APACHE
<VirtualHost *:9000>
ServerName other_sub_domains.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:4000/"
ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
- 私には、これは完全に不要に思えます。ドメイン
discourse.domain.ioが Apache にルーティングされ、Apache がリクエストを受け取り、その後それをルーティングしようとする場合、Docker コンテナの公開ポートを指すだけで済むはずです。 - また、サーバー自体の localhost:8000 が解決されない場合、この方法でも機能しません。
現在、Chrome で Discourse Docker コンテナに移動しようとすると、502 エラーが表示されます(上記のスクリーンショットを参照)。
app.yml の抜粋
## これはオールインワン、スタンドアロンの Discourse Docker コンテナテンプレートです
##
## このファイルを修正した後、必ず再ビルドしてください
## /var/discourse/launcher rebuild app
##
## 編集時は *非常に* 注意してください!
## YAML ファイルは、空白やアライメントの誤りに極めて敏感です!
## 必要に応じて http://www.yamllint.com/ でこのファイルを検証してください
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/web.socketed.template.yml"
## Lets Encrypt (https) を追加したい場合は、以下の 2 行のコメントアウトを外してください
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
## このコンテナが公開すべき TCP/IP ポートはどれですか?
## Discourse を Apache や nginx などの他の Web サーバーとポートを共有したい場合は、
## https://meta.discourse.org/t/17247 を参照してください
expose:
- "8000:80" # http
#- "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## db_shared_buffers を総メモリの最大 25% に設定します。
## ブートストラップによって検出された RAM に基づいて自動的に設定されますが、上書きすることもできます
#db_shared_buffers: "256MB"
## ソートパフォーマンスを向上させることができますが、接続あたりのメモリ使用量が増加します
#db_work_mem: "40MB"
## このコンテナが使用する Git リビジョンはどれですか?(デフォルト:tests-passed)
#version: tests-passed
env:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## 同時 Web リクエストのサポート数。メモリと CPU コア数に依存します。
## ブートストラップによって検出された CPU に基づいて自動的に設定されますが、上書きすることもできます
#UNICORN_WORKERS: 3
## TODO: この Discourse インスタンスが応答するドメイン名
## 必須です。Discourse は IP アドレスのみでは動作しません。
DISCOURSE_HOSTNAME: 'discourse.domain.io'
## コンテナを上記で指定した同じホスト名(-h オプション)で起動したい場合は、コメントアウトを外してください
## (デフォルトは "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: 初期登録時に管理者および開発者に指定されるカンマ区切りのメールアドレスのリスト
## 例:'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'user@domain.io'
## TODO: 新規アカウントの検証と通知の送信に使用する SMTP メールサーバー
# SMTP アドレス、ユーザー名、パスワードが必要です
# 警告:SMTP パスワードの文字 '#' は問題を引き起こす可能性があります!
DISCOURSE_SMTP_ADDRESS: email-smtp.us-east-1.amazonaws.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: ******
DISCOURSE_SMTP_PASSWORD: ******
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (オプション、デフォルトは true)
#DISCOURSE_SMTP_DOMAIN: ****** # (一部のプロバイダーで必須)
#DISCOURSE_NOTIFICATION_EMAIL: ****** # (通知を送信するアドレス)
## Lets Encrypt テンプレートを追加した場合、以下のコメントアウトを外して無料の SSL 証明書を取得してください
#LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
## この Discourse インスタンスの http または https CDN アドレス(プルするように設定)
## 詳細は https://meta.discourse.org/t/14857 を参照
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## IP アドレス検索用の MaxMind 地理情報 IP アドレスキー
## 詳細は https://meta.discourse.org/t/-/137387/23 を参照
#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456
## Docker コンテナはステートレスです。すべてのデータは /shared に保存されます
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## プラグインはここに記述します
## 詳細は https://meta.discourse.org/t/19157 を参照
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## ビルド後に実行する任意のカスタムコマンド
run:
- exec: echo "Beginning of custom commands"
## 最初の登録時の 'From' メールアドレスを設定したい場合は、コメントアウトを外して変更してください
## 最初のサインアップメールを受信した後、再度コメントアウトしてください。一度だけ実行すれば十分です
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "End of custom commands"
ドメイン、メールアドレス、メール設定は正しいです。前述の通り、SSL/TLS 設定は必要ありません。
ご要望:
- NGINX による解決策が、この設定を機能させる唯一の方法でしょうか?もしそうなら、設定手順に関するより明確な説明は利用可能ですか?Discourse を動作させるために、保証もなくサーバーを最初から構築し直すことはできません。
- Discourse behind reverse proxy and https - #2 by itsbhanusharma で、@Dark Matter 氏は以下の Apache2 解決策を提供しましたが、これは Node.js Express 環境を想定したものではないと考えており、localhost:8000 が解決されない現状では、これが機能するかどうか確信が持てません:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName discourse.example.com
DocumentRoot /website/discourse
RewriteEngine On
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
ProxyPassReverse / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
ErrorLog /var/log/apache2/discourse.error.log
LogLevel warn
CustomLog /var/log/apache2/discourse.access.log combined
RewriteCond %{SERVER_NAME} =discourse.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
- ここでの問題は Discourse の設定にありますか?あるいは Apache のルーティングに問題があるのでしょうか(疑わしいですが)?それとも、より根本的な何かを見落としているのでしょうか?
- この問題を解決することは、将来多くのユーザーの助けになると考えています。
- 最善の解決策は、サーバー上でローカルに Discourse にルーティングすることです。
- 次に、URL を介してルーティングすることです。
よろしくお願いいたします
マシュー・ルカス



