
との2 つのサブドメインを設定しようとしていa
ます。 2 つの .conf ファイルを使用しますが、これらは ServerName と ProxyPass の変更に応じてほぼ同じように見えます。b
domain.com
<VirtualHost *:80>
ServerName a.domain.com #This was added as a try for a fix.
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/a
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
#Proxies
ProxyPass / https://a.domain.com:8444/
ProxyPassReverse / https://a.domain.com:8444/
ProxyPass /a/ https://a.domain.com:8444/
ProxyPassReverse /a/ https://a.domain.com:8444/
ProxyPass /b/ https://b.domain.com:8445/
ProxyPassReverse /b/ https://b.domain.com:8445/
</VirtualHost>
これは私のテスト環境で実行されており、現在運用中のものと似たものを複製しています。/etc/hosts で、a.domain.com
とb.domain.com
を 127.0.0.1 に追加しました。運用中の DNS には と のレコードがありa.domain.com
、b.domain.com
これらは同じ IP です (これをテストしているマシンでもこれを実行しました)。
また、ルート ディレクトリからコンテンツを提供していないことにも注意してください。タイトルに記載されている問題を修正するためにこれを追加しました。ただし、両方のディレクトリに単純な HTML があります。
実際の問題は何でしょうか?
単純に言えば、 を試みると、結果は予想どおりa.domain.com
からの Web アプリケーションになります。 を試みると、結果はではなく になります。と は両方とも有効になっており、 を無効にすると、正しく が得られます。 のようにも試すと、リダイレクトは に戻ります。localhost:8444
b.domain.com
localhost:8444
localhost:8445
a.conf
b.conf
a.conf
localhost:8445
a.domain.com/b
a.domain.com
いくつかの質問とチュートリアルを読みましたが、そのほとんどは私の設定で機能しているもの、または NameVirtualHost を追加するものでしたが、これは私のバージョンの Apache では必要ないことがわかりました。また、同じ IP であるため、要求がb
一致しているのではないかと考え、ポート 80 に ServerName を追加しましたがa.conf
、それでも機能しませんでした。
ここで何が欠けているのでしょうか? mod_proxy に関する何かを無視しているのでしょうか? 可能であれば、Web アプリケーションごとに 1 つのファイルを保持したいと思います。 ありがとうございます!
これは、Ubuntu 18.04.2、Apache 2.4 (mod_proxy および mod_ssl)、Tomcat 9 上で実行されています。他に必要な情報があれば、できる限り提供します。
アップデート
この構成でも試してみました。同じ望ましくない結果になりました。
<VirtualHost *:80>
ServerAlias a.domain.com
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin webmaster@localhost
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
#Proxies
Redirect /b https://b.domain.com
<Location />
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
<Location /a>
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
</VirtualHost>
アップデート
さて、非常に厄介なことが分かりました。ブラウザで または を入力するとa.domain.com
、b.domain.com
両方とも に解決されます。a.domain.com
これが最初に説明した問題です。ただし、 または を入力するとhttps://a.domain.com
、https://b.domain.com
両方とも正しいサーバーに解決されます:a
および8444
に。b
8445
これは非常にイライラすることなので、しばらく休憩してこれを分析します。
アップデート
長い休止の後、何が起こるかを見るために他のランダムな調整をいくつか試してみましたが、やはり HTTPS を使用する場合を除いて、何も期待どおりに動作しませんでした。リクエストで何が送信されているかを確認するために Postman をインストールしたところ、Postman では HTTP と HTTPS の両方がホストを正しく使用していることがわかりました。さらに良い/悪い点: 実際の応答には、a.domain.com
との異なるウェルカム ページが表示されていますb.domain.com
。つまり、Postman を使用する場合、構成は適切に機能しているということです。
このすべての問題は単にキャッシュの問題である可能性があると思いますが、私がテストに使用しているブラウザ (Firefox dev ed) はキャッシュしないように設定されています。curl と他のブラウザで応答を確認します。
答え1
犯人:キャッシュ。
ある時点で、ブラウザの設定が変わり (おそらくアップデート?)、サブドメインとして設定しようとしていたテスト サイトを含めて 3 GB を超えるキャッシュが存在していました。ひどい。
キャッシュをクリアした後、予想どおり、URL にアクセスしたときに自己署名証明書に関する警告が表示されました。リスクを受け入れた後、適切なサイトにリダイレクトされました。これは、b.domain.com
プロトコルを追加せずに使用することで実現しました。
これが機能していることを確認するために、他の 7 つのブラウザーすべて (確認が必要) とプロトコルありとなしの curl でテストしたところ、結果も期待どおりでした。
結局、設定は大丈夫でした。必要な場合に備えてここに投稿します。サブドメインによって特定の Tomcat インスタンスにプロキシする Apache サーバー。proxy_mod を使用してポート 80 からポート 433 に即座にリダイレクトします。。
<VirtualHost *:80>
ServerName a.domain.com
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin [email protected]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
SSLEngine On
SSLCertificateFile /etc/ssl/certs/DONT_USE_SELF_SIGNED.pem
SSLCertificateKeyFile /etc/ssl/private/CERTS_IN_PRODUCTIve.key
SSLVerifyClient none
#Proxies
ProxyRequests Off
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
#Redirections
Redirect /b https://b.domain.com
<Location />
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
<Location /a>
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
</VirtualHost>
SSL プロキシと SSL の設定は自己署名証明書用であることを考慮してください。これを実稼働環境に実装する場合は、それぞれの関連ドキュメントをお読みください。また、これは の構成ファイルであることにも注意してください。a.domain.com
の同等のものはb.domain.com
、適切な ServerName、ServerAlias、リダイレクト、場所、および localhost のポートを使用してまったく同じです。