Проблемы с конфигурацией httpd для проксирования большинства запросов к tomcat

Проблемы с конфигурацией httpd для проксирования большинства запросов к tomcat

У меня возникли некоторые трудности с запуском следующего кода в 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>

Связанный контент