有没有办法使用HTTP代理将Apache连接到Tomcat,以便Tomcat获取正确的传入主机名而不是localhost?我在apache中使用这个指令:
ProxyPass /path http://localhost:8080/path
但它来自localhost,当我们在同一台服务器上有一堆网站时,这是无用的。我可以在服务器配置中手动设置主机:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
proxyName="pretend.host" proxyPort="80" />
但这又不能提供多个网站。而且我不喜欢为每个站点使用不同的内部端口,这听起来真的很难看。
代理时是否无法转移端口?
(如果你问为什么我不只是使用AJP,那么答案是this error。我在放弃Tomcat and Apache entirely之前我正在尽我所能。
答案 0 :(得分:38)
您要查找的设置是:
<VirtualHost *:80>
ServerName public.server.name
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>
请注意,我们使用localhost作为代理目标。我们可以执行此操作,因为我们启用了ProxyPreserveHost。文档说明了
它主要用于特殊配置,例如基于代理群发名称的虚拟主机,其中原始主机头需要由后端服务器进行评估。
听起来和你正在做的完全一样。
答案 1 :(得分:5)
我认为,如果您想在同一台服务器上安装多个站点,最好的办法就是在Apache配置中使用虚拟主机。这是一个例子:
<VirtualHost *:80>
ServerName server.domain.com
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://server.domain.com:8080/
ProxyPassReverse / http://server.domain.com:8080/
<Location />
Order allow,deny
Allow from all
</Location>
只要您在外部DNS中注册了server.domain.com,传入的主机名就会显示在客户端URL中。我正在运行一个托管6个独立站点的服务器,其中包括3个由Tomcat使用此方法返回的站点。
答案 2 :(得分:0)
您仍然可以使用AJP,因为它比HTTP更快。只需确保在http.conf中启用它:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
在这种情况下,此配置适用于我:
<VirtualHost *:80>
ServerName public.server.name
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / ajp://localhost:8080/
# ProxyPassReverse might not be needed,
# it's only for redirecting from inside.
# ProxyPassReverse / ajp://localhost:8080/
</VirtualHost>