我正在尝试设置一个包含多个 Web 应用程序的服务器,这些应用程序都将通过 apache VirtualHost(在同一台服务器上运行的 apache)提供服务。我的主要限制是每个 Web 应用程序都必须使用 SSL 加密。在谷歌搜索了一段时间并查看了 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 时,虚拟主机也能正常工作。
我怎样才能让它工作?
答案1
最后我找到了一个办法。首先我尝试了 Dave Cheney 的建议,所以我为重定向到 Tomcat 非 SSL 端口的 Apache 服务器安装了另一个证书(因此代理重定向到http://本地主机:8080/)。不幸的是,它无法完全工作,因为在网络浏览器中,https 在连接后立即转换为 http。所以我恢复使用https://本地主机: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>
答案2
尝试这个配置
<VirtualHost 1.2.3.4:443>
ServerName host.domain.org
SSLEngine On
# include other ssl options, like cert and key here
ProxyRequests Off
ProxyPreserveHost On
<Location />
ProxyPass http://localhost:8443/
</Location>
</VirtualHost>
如果您的应用程序需要从代理连接访问 SSL 信息,您应该考虑使用 mod_proxy_ajp 和 tomcat ajp1.3 连接器。
答案3
好吧,我不明白的是为什么你需要从你的 apache 到你的应用程序建立一个 SSL 连接,而这两个应用程序似乎在同一台机器上(http://本地主机:8443/)。
我猜想设置此类事物的通常方法是让 apache 为“客户”端(例如互联网)提供 SSL 加密,并与应用程序建立未加密的连接。这也使您有更多自由来调试应用程序响应。
Dave Cheney 提到的另一件事是使用本机 tomcat 连接器来实现负载平衡和其他功能。
答案4
你真的需要代理到 HTTPS 服务吗?你可能想代理到 localhost 中的非 SSL 服务,例如
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/