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
/foo
localhost: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>