Apache: несколько ProxyPassReverse, несколько имен серверов, один виртуальный хост

Я работаю над конкретной настройкой следующим образом:

  • Несколько приложений на нескольких хостах и ​​разных портах
  • Сервер (предположим, balancer.local), на котором работает nginx, прослушивает порт 8080 для локального хоста, который действует как прокси/балансировщик нагрузки для приложений, запущенных на предыдущих хостах.
  • Сервер apache2, работающий на том же компьютере, что и nginx, прослушивающий порт 80 (открытый для публики), обслуживающий некоторое содержимое напрямую для некоторых ServerName и перенаправляющий некоторые другие ServerName на localhost:8080, чтобы позволить nginx выполнять работу по балансировке нагрузки.

Моя проблема заключается в том, что количество имен хостов, которые нужно перенаправить на nginx, быстро растет, и у меня есть раздражающий список виртуальных хостов, который становится трудно поддерживать.

Итак, вопрос: есть ли способ определить виртуальный хост по умолчанию в apache без имен серверов и заставить его перенаправлять весь трафик, который не соответствует ни одному другому виртуальному хосту, на локальный хост: 8080?

Я уже пытался удалить директиву ServerName, но проблема в том, что ProxyPassReverse вставляет свой hostname в исходящий URL.

На данный момент единственное, что я смог сделать, это уменьшить количество строк в каждом vhost до минимума, но это все равно слишком много.

Вот несколько примеров конфигурации:

Нгинкс:

upstream foo {
        server foo1.local:9999 max_fails=3 fail_timeout=30s;
        server foo2.local:9999 max_fails=3 fail_timeout=30s;
}

upstream bar {
        server bar1.local:8888 max_fails=3 fail_timeout=30s;
        server bar2.local:8888 max_fails=3 fail_timeout=30s;
}
server {
        listen *:8080;
        server_name  foo.public.com;
        access_log  /var/log/nginx/foo.public.com-access.log  proxy;
        error_log   /var/log/nginx/foo.public.com-error.log;
        location / {
                proxy_pass         http://foo/;
                include            /etc/nginx/proxy_app.conf;
        }
}
server {
        listen *:8080;
        server_name  bar.public.com;
        access_log  /var/log/nginx/bar.public.com-access.log  proxy;
        error_log   /var/log/nginx/bar.public.com-error.log;
        location / {
                proxy_pass         http://bar/;
                include            /etc/nginx/proxy_app.conf;
        }
}

Апач:

<VirtualHost *:80>
        ServerName foo.public.com
        ErrorLog /var/log/httpd/nginx-redirect.sis.service-error.log
        CustomLog /var/log/httpd/nginx-redirect.sis.service-access.log combined
        ProxyPreserveHost On
        ProxyPass               /       http://localhost:8080/
        ProxyPassReverse        /       http://%{HTTP_HOST}:8080/
</VirtualHost>
<VirtualHost *:80>
        ServerName bar.public.com
        ErrorLog /var/log/httpd/nginx-redirect.sis.service-error.log
        CustomLog /var/log/httpd/nginx-redirect.sis.service-access.log combined
        ProxyPreserveHost On
        ProxyPass               /       http://localhost:8080/
        ProxyPassReverse        /       http://%{HTTP_HOST}:8080/
</VirtualHost>
<VirtualHost *:80>
    ServerName baz.public.com
    DocumentRoot /some/local/path
    <Directory "/">
      some irrelevant options
    </Directory>
</VirtualHost>

В этом примере в nginx перенаправляется только два виртуальных хоста, но в моей реальной настройке их больше 30!

Как я уже сказал, я уже пытался использовать один виртуальный хост без тега ServerName для пересылки трафика, но в итоге получил http://balancer.local/some/path в моих перенаправлениях, что явно не сработало.

Я также пытался использовать один ServerName и несколько ServerAlias, но в этом случае ProxyPassReverse всегда использовал в ответе имя сервера.

Любое предложение?


person Carles Sala    schedule 25.03.2014    source источник
comment
› Я также пытался использовать одно имя сервера и несколько псевдонимов сервера, но в этом случае ProxyPassReverse всегда использовал имя сервера в ответе. У вас есть UseCanonicalName On где-то в конфигурации Apache?   -  person Alexey Ten    schedule 25.03.2014
comment
@alexeyten: Туше! На самом деле у меня в httpd.conf было наоборот, UseCanonicalName Off, но, похоже, его как-то проигнорировали или просто не хватило. Итак, я сделал это явным внутри своего VirtualHost, и это помогло! Пожалуйста, преобразуйте свой комментарий в полный ответ (предложите явно указать значение Off), и я приму его как действительный.   -  person Carles Sala    schedule 26.03.2014


Ответы (1)


Я также пытался использовать одно имя сервера и несколько псевдонимов серверов, но в этом случае ProxyPassReverse всегда использовал имя сервера в ответе.

Вероятно, у вас есть UseCanonicalName On где-то в вашей конфигурации Apache.

Попробуйте установить его Off явно в вашем VirtualHost.

person Alexey Ten    schedule 26.03.2014