我有两个 Tomcat 实例,一个运行在端口 8080 上,另一个运行在 8081 上。这两个实例都部署了一个名为 app.war 的 Web 应用程序,但它们不仅由不同的端口分隔,而且由不同的数据存储分隔。然而,它们都运行在同一个物理机上。
我们组织中的防火墙规则指定我只能通过端口 443 提供 HTTPS。 80、8080 或 8081 上不能提供 HTTP 或 HTTPS。
物理机箱运行 RHEL5,在 eth0 上运行单个 IP。DNS 设置为将 app1.example.com 和 app2.example.com 映射到机箱。
如何配置我的 httpd rewrite/proxy 以将 app1.example.com:443 定向到 localhost:8080 并将 app2.example.com:443 定向到 localhost:8081?
编辑:
这是我尝试过的...
LoadModule ssl_module modules/mod_ssl.so
Listen 443
NameVirtualHost *:443
ProxyRequests Off
<VirtualHost *:443>
ServerName app1.example.com
SSLProxyEngine On
SSlProxyMachineCertificateFile /etc/httpd/cert/10year.pem
SSLVerifyClient Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / https://app.example.com: /
ProxyPassReverse / https://app.example.com:8080/
ProxyPassReverseCookieDomain app.example.com app1.example.com
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>
<VirtualHost *:443>
ServerName app2.example.com
SSLProxyEngine On
SSlProxyMachineCertificateFile /etc/httpd/cert/10year.pem
SSLVerifyClient Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / https://app.example.com:8081/
ProxyPassReverse / https://app.example.com:8081/
ProxyPassReverseCookieDomain app.example.com app2.example.com
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>
...当我尝试启动它时出现错误...
$ service httpd start
Starting httpd: [Mon Oct 21 11:18:43 2013] [warn] module ssl_module is already loaded, skipping
(98)Address already in use: make_sock: could not bind to address [::]:443
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:443
no listening sockets available, shutting down
Unable to open logs
[FAILED]
答案1
此行似乎缺少端口号。这是拼写错误吗?
ProxyPass / https://app.example.com: /
另外,您可能还应该让 Apache 处理 SSL 并以 http(或 ajp)的形式代理到 Tomcat。您可以使用 localhost 作为服务器名称,例如:
ProxyPass / http://localhost:8080/
答案2
错误消息的第一部分似乎表明端口 433 上已有一些程序在运行。第二部分似乎表明您没有以 root 身份执行“service”命令……
做一个
sudo service httpd restart
这样,您就可以确定您是 root 用户,并且您正在停止,然后启动 apache。
您的 httpd.conf 看起来不错。但是,我会将您的 tomcat 实例配置为使用 http,而不是 https,因为当流量停留在主机上时无需加密。此外,https 代理在 apache 上无法开箱即用。我还将为您的实例禁用默认的 ssl 虚拟主机。这应该可以消除您尝试加载 ssl 模块两次的警告。