Apache-2.2
帶有 mod-proxy 和 SSL 的 Apache VirtualHost
我正在嘗試設置具有多個 Web 應用程序的伺服器,這些應用程序都將通過 apache VirtualHost(執行在同一台伺服器上的 apache)提供服務。我的主要限制是每個 Web 應用程序都必須使用 SSL 加密。在Google搜尋了一段時間並查看了有關 stackoverflow 的其他問題後,我為 VirtualHost 編寫了以下配置:
<VirtualHost 1.2.3.4:443> ServerName host.example.org <Proxy *> Order deny,allow Allow from all </Proxy> SSLProxyEngine On ProxyRequests Off ProxyPreserveHost On ProxyPass / https://localhost:8443/ ProxyPassReverse / https://localhost:8443/ </VirtualHost>
即使https://host.example.org:8443>可以訪問,但<https://host.example.org不能訪問,這違背了我的虛擬主機配置的目的。Firefox 抱怨說,即使它成功連接到伺服器,連接也會中斷。我還在 apache 的 error.log 中收到以下警告:
proxy: no HTTP 0.9 request (with no host line) on incoming request and preserve host set forcing hostname to be host.example.org for uri
在 Web 應用程序(Tomcat 伺服器)上,訪問日誌顯示了一個奇怪的訪問請求:
"?O^A^C / HTTP/1.1" 302
以下是我直接連接到https://host.example.org:8443時得到的正確訪問請求:
"GET / HTTP/1.1" 302
最後我還應該提到,當我不使用 SSL 時,虛擬主機工作得非常好。
我怎樣才能使這項工作?
最後我找到了一種讓它工作的方法。首先,我嘗試了 Dave Cheney 的建議,因此我為重定向到 Tomcat 非 SSL 埠的 apache 伺服器安裝了另一個證書(因此代理重定向到http://localhost:8080/)。不幸的是,它並沒有完全工作,因為在網路瀏覽器中,https 在連接後立即轉換為 http。所以我恢復使用https://localhost:8443/並使其工作的最後一步是再次添加 SSLProxyEngine。
這是生成的 VirtualHost 配置:
<VirtualHost 1.2.3.4:443> ServerName host.domain.org <Proxy *> Order deny,allow Allow from all </Proxy> SSLEngine on SSLProxyEngine On SSLCertificateFile /etc/apache2/ssl/certificate.crt SSLCertificateKeyFile /etc/apache2/ssl/certificate.key ProxyRequests Off ProxyPreserveHost On ProxyPass / https://localhost:8443/ ProxyPassReverse / https://localhost:8443/ </VirtualHost>