У меня возникли некоторые трудности с запуском следующего кода в Apache:
У нас есть экземпляр apache/tomcat, расположенный за AWS ELB. ELB выполняет SSL-терминацию, поэтому у нас есть перенаправление на сервере для обработки этого.
/health
Для работы проверки работоспособности ELB мне необходимо быть доступным по http.
Мне нужно отправить все, что не является /
или 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 прослушивает порт 8080, используя обычный http.
решение1
У меня Tomcat прослушивает ajp на порту 8009. Помимо других преимуществ, это позволяет определить одни и те же виртуальные хосты в конфигурациях обоих серверов, поэтому запросы (которые по умолчанию на порту 80) сначала достигают Apache, где у меня определено несколько виртуальных хостов. Затем правила обратного прокси решают, какие запросы пересылать на другие хосты (удалённые или другие локальные виртуальные хосты), обслуживать контент из DocumentRoot или пересылать на Tomcat через ajp. Когда mod_proxy_ajp пересылает запросы на Tomcat, по умолчанию они сохраняют свои имена хостов, что позволяет Tomcat направлять их на разные веб-приложения с совпадающими именами виртуальных хостов, которые я определил в server.xml.
Следующие примеры не совсем соответствуют тому, что вы описали, но я надеюсь, что они демонстрируют гибкость, доступную при использовании виртуальных хостов в обеих конфигурациях сервера, и позволят вам создать конфигурации, соответствующие вашим потребностям.
/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>