我在 Apache 中执行以下工作时遇到了一些困难:
我们在 AWS ELB 后面有一个 apache/tomcat 实例。ELB 正在执行 SSL 终止,因此我们在服务器上有一个重定向来处理此问题。
我需要/health
在 http 上保持可达性,才能使 ELB 健康检查正常运行。
我需要将所有不是/
或不是的内容发送theme
到 tomcat,即/foo
代理localhost:8080/foo
。
我尝试使用 mod_proxy 和/或 mod_rewrite 对下面的配置进行一些修改,但似乎无法使其正常工作,因此希望得到任何指点。
<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。
答案1
我让 Tomcat 在端口 8009 上监听 ajp。除了其他优点之外,这还允许在两个服务器的配置中定义相同的虚拟主机,因此请求(默认为端口 80)首先到达 Apache,我已在其中定义了几个虚拟主机。然后,反向代理规则决定将哪些请求转发到其他各个主机(远程或其他本地虚拟主机)、从 DocumentRoot 提供内容或通过 ajp 转发到 Tomcat。当 mod_proxy_ajp 将请求转发到 Tomcat 时,默认情况下它们会保留其主机名,这允许 Tomcat 将它们定向到具有我在 server.xml 中定义的匹配虚拟主机名的不同 web 应用程序。
以下示例并未完全按照您所描述的进行操作,但我希望它们能够展示两种服务器配置中虚拟主机的灵活性,并允许您提出满足您需求的配置。
/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/服务器.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>