Я работаю над конкретной настройкой следующим образом:
- Несколько приложений на нескольких хостах и разных портах
- Сервер (предположим, 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 всегда использовал в ответе имя сервера.
Любое предложение?
UseCanonicalName On
где-то в конфигурации Apache? - person Alexey Ten   schedule 25.03.2014UseCanonicalName Off
, но, похоже, его как-то проигнорировали или просто не хватило. Итак, я сделал это явным внутри своегоVirtualHost
, и это помогло! Пожалуйста, преобразуйте свой комментарий в полный ответ (предложите явно указать значениеOff
), и я приму его как действительный. - person Carles Sala   schedule 26.03.2014