4

Нужна помощь по следующей проблеме reverse-proxy в Apache.

  • есть Apache 2.4 на локальном хосте:80 (aaaa:80)
  • есть 3 разных веб-приложения
    • один работает на локальном хосте:8000 (аааа:8000)
    • два других находятся в других машинах - так хххх:8000 и гггг:8000
  • иметь некоторый статический контент (несколько html-страниц) на базовом apache:80-е DocumentRoot

Требования:

  • appX (на xxxx:8000) должен быть доступен по адресу http:// aaaa / appX /
  • appY (на yyyy:8000) как http:// aaaa / appY /
  • существующие статические страницы (из DocumentRoot apache) должны обслуживаться как обычно apache
  • defapp - все остальные должны быть прокси в aaaa:8000

Легко настроить appX и appY следующим образом:

ProxyPass         /appX/ http://x.x.x.x:8000/
ProxyPassReverse  /appX/ http://x.x.x.x:8000/

ProxyPass         /appY/ http://y.y.y.y:8000/
ProxyPassReverse  /appY/ http://y.y.y.y:8000/

Выше работает нормально. Поэтому при попытке доступа http://localhost/appX/ получил ответ от appX на x.x.x.x:8000 .

Но есть проблема с default destinaton по умолчанию для everything other . Когда пытался добавить:

ProxyPass         /   http://127.0.0.1:8000/
ProxyPassReverse  /   http://127.0.0.1:8000/

Это не работает, как я надеюсь ...

С учетом вышесказанного хочу сказать apache - все остальное, что не является /appX/ или /appY/ отправлять в 0:8000 .

И это, к сожалению, не работает, defapp который работает в 0:8000 получил запросы на appX и appY , а также запросы на статические страницы.

Переключение порядка определений, так

#define first the "default destination"
ProxyPass         /   http://127.0.0.1:8000/
ProxyPassReverse  /   http://127.0.0.1:8000/

#and after the appX and appY
ProxyPass         /appX/ http://x.x.x.x:8000/
ProxyPassReverse  /appX/ http://x.x.x.x:8000/
ProxyPass         /appY/ http://y.y.y.y:8000/
ProxyPassReverse  /appY/ http://y.y.y.y:8000/

тоже не работает. Все прокси на localhost:8000 .

Итак, вопрос: возможно ли настроить Apache в качестве обратного прокси-сервера для обработки указанных выше требований?

3 ответа3

5

Оберните ваши ссылки ProxyPass в определение <VirtualHost> , например так:

<VirtualHost *:*>
ProxyPreserveHost On
ProxyPass / http://192.168.111.2/
ProxyPassReverse / http://192.168.111.2/
ServerName hostname.example.com
</VirtualHost>

Создайте два отдельных из них с желаемыми именами ServerNames, а затем без заданных опций ServerName или Proxy (только DocumentRoot). Поместите это последнее.

Больше информации здесь.

0

Небольшое улучшение ответа Уоррена Сены (пропущено «app /» в первом RewriteRule (.... 127.0.0.1/$1 [P ....) )

RewriteRule         ^/app/(.*) http://127.0.0.1/$1 [P,L]

должно быть

RewriteRule         ^/app/(.*) http://127.0.0.1/app/$1 [P,L]

Итак, подведение итогов - в случае, когда все ваши ссылки распределены между несколькими хостами (точно как в вашем случае), попробуйте это:

ProxyPreserveHost   On
RewriteEngine       On

RewriteRule         ^/appX/(.*) http://x.x.x.x:8000/$1 [P,L]
ProxyPassReverse    /appX/      http://x.x.x.x:8000/
RewriteRule         ^/appY/(.*) http://y.y.y.y:8000/$1 [P,L]
ProxyPassReverse    /appY/      http://y.y.y.y:8000/
RewriteRule         ^/(.*)      http://127.0.0.1:8000/$1 [P,L]
ProxyPassReverse    /           http://127.0.0.1:8000

В случае, если вам нужно распространить свои ссылки на одном хосте (с разными портами и BaseURL)

ProxyPreserveHost   On
RewriteEngine       On

RewriteRule         ^/appX/(.*) http://127.0.0.1:8001/appX/$1 [P,L]
ProxyPassReverse    /appX/      http://127.0.0.1:8001/appX
RewriteRule         ^/appY/(.*) http://127.0.0.1:8002/appY/$1 [P,L]
ProxyPassReverse    /appY/      http://127.0.0.1:8002/appY/
RewriteRule         ^/(.*)      http://127.0.0.1:8000/$1 [P,L]
ProxyPassReverse    /           http://127.0.0.1:8000
0

Вы можете использовать правила перезаписи с флагом P

Правила перезаписи являются более гибкими, чем директивы ProxyPass, и вы можете использовать флаг L чтобы прекратить обработку набора правил и избежать проблемы, о которой вы упомянули (использование нескольких бэкэндов).

Вот пример:

ProxyPreserveHost   On
RewriteEngine       On

RewriteRule         ^/app/(.*) http://127.0.0.1/$1 [P,L]
ProxyPassReverse    /app/ http://127.0.0.1/app

RewriteRule         ^/blog/(.*) http://127.0.0.1/blog/$1 [P,L]
ProxyPassReverse    /blog/ http://127.0.0.1/blog

RewriteRule         ^/(.*) http://127.0.0.1/$1 [P,L]
ProxyPassReverse    / http://127.0.0.1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .