在Apache中进行以下工作时遇到了一些困难:
我们有一个坐在AWS ELB后面的apache / tomcat实例。 ELB正在做SSL终止,所以我们在服务器上有一个redirect来处理这个问题。
我需要/health可以通过HTTP ELB健康检查工作。
我需要将所有不是/ theme东西发送到tomcat ie /foo代理到localhost:8080/foo 。
我已经尝试了使用mod_proxy和/或mod_rewrite下面的configuration的一些变化,但我似乎无法得到这个工作正常,所以将不胜感激任何指针。
<Location /health> ProxyPass http://localhost:8080/health ttl=1 ProxyPassReverse http://localhost:8080/health </Location> <Location ~ "^/(.+)"> RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =https RewriteCond %{REQUEST_URI} !^/(health|theme)/ RewriteRule . http://localhost:8080/$1 [P] ProxyPassReverse http://localhost:8080/$1 </Location> <Location /> RewriteEngine On RewriteCond %{REQUEST_URI} !^/health RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent] </Location>
Tomcat正在使用纯HTTP在端口8080上侦听。
我有Tomcat监听端口8009上的ajp。除了其他优点,这允许在两个服务器的configuration中定义相同的虚拟主机,所以请求(默认为端口80)首先到达Apache,在那里我有几个虚拟主机定义。 然后,反向代理规则决定向其他各种主机(远程或其他本地虚拟主机)转发哪些请求,从DocumentRoot提供内容或通过ajp转发给Tomcat。 当mod_proxy_ajp将请求转发给Tomcat时,默认情况下它们保留它们的主机名,这允许Tomcat将它们引导到具有我在server.xml中定义的匹配虚拟主机名的不同webapp。
以下示例并不完全符合您所描述的内容,但我希望它们能够在两种服务器configuration中显示虚拟主机的灵活性,并允许您提供满足您需求的configuration。
/etc/apache2/extra/vhosts.conf
<VirtualHost *:80> ServerName my.local.website.com <Proxy *> Require all granted </Proxy> # proxy specific paths to other virtual hosts ProxyPass /articles http://a.local.website.com/articles ProxyPassReverse /articles http://a.local.website.com/articles ProxyPass /entertainment http://b.local.website.com/entertainment ProxyPassReverse /entertainment http://b.local.website.com/entertainment # send everything else to tomcat via ajp on port 8009 ProxyPass / ajp://localhost:8009/ ProxyPassReverse / ajp://localhost:8009/ </VirtualHost>
$ CATALINA_HOME / server.xml中
<Host name="my.local.website.com" appBase="temp" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" prefix="website_access." suffix=".log" pattern="common"/> </Host>