Probleme mit der HTTPD-Konfiguration zum Weiterleiten der meisten Anfragen an Tomcat

Probleme mit der HTTPD-Konfiguration zum Weiterleiten der meisten Anfragen an Tomcat

Ich hatte einige Schwierigkeiten, Folgendes in Apache zum Laufen zu bringen:

Wir haben eine Apache/Tomcat-Instanz, die hinter einem AWS ELB sitzt. Der ELB führt eine SSL-Terminierung durch, daher haben wir eine Umleitung auf dem Server, um dies zu handhaben.

Ich muss /healthüber http erreichbar sein, damit die ELB-Integritätsprüfung funktioniert.

Ich muss alles, was nicht an Tomcat /oder an Proxys gesendet werden soll, an .theme/foolocalhost:8080/foo

Ich habe mit mod_proxy und/oder mod_rewrite ein paar Varianten der folgenden Konfiguration ausprobiert, kriege es aber nicht hin, dass es richtig funktioniert, und wäre daher für alle Hinweise dankbar.

<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 lauscht auf Port 8080 und verwendet einfaches HTTP.

Antwort1

Ich habe Tomcat so eingestellt, dass er auf Port 8009 auf ajp wartet. Abgesehen von den anderen Vorteilen können dadurch in den Konfigurationen beider Server dieselben virtuellen Hosts definiert werden, sodass die Anfragen (die standardmäßig auf Port 80 laufen) zuerst Apache erreichen, wo ich mehrere virtuelle Hosts definiert habe. Reverse-Proxy-Regeln entscheiden dann, welche Anfragen an verschiedene andere Hosts (entweder Remote- oder andere lokale virtuelle Hosts) weitergeleitet werden, Inhalte von einem DocumentRoot bereitgestellt oder über ajp an Tomcat weitergeleitet werden. Wenn mod_proxy_ajp Anfragen an Tomcat weiterleitet, behalten sie standardmäßig ihre Hostnamen, wodurch Tomcat sie an verschiedene Webanwendungen mit passenden virtuellen Hostnamen weiterleiten kann, die ich in server.xml definiert habe.

Die folgenden Beispiele machen nicht genau das, was Sie beschrieben haben, aber ich hoffe, dass sie die mit virtuellen Hosts in beiden Serverkonfigurationen verfügbare Flexibilität zeigen und es Ihnen ermöglichen, Konfigurationen zu finden, die Ihren Anforderungen entsprechen.

/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>

verwandte Informationen