使用 httpd 配置将大多数请求代理到 tomcat 时出现问题

使用 httpd 配置将大多数请求代理到 tomcat 时出现问题

我在 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>

相关内容