
В настоящее время у меня есть несколько сотен веб-приложений, распределенных по примерно 20 серверам, и обратный прокси-сервер, установленный перед ними, на котором запущены Pound и Haproxy. Pound выполняет перенаправление http на https и шифрование SSL, а затем перенаправляет на Haproxy, который имеет правило, настроенное для каждого сайта, чтобы перенаправлять на один из внутренних серверов, на котором запущен Tomcat. Все сайты находятся на одном домене, например www.domain.com/webapp1, www.domain.com/webapp2
Pound и Haproxy изначально были настроены нашим хостинг-провайдером, и, разочаровавшись в Pound, я теперь рассматриваю замену этой настройки на Nginx. Я нахожусь на этапе, когда у меня запущен Nginx в среде разработки, который выполняет перенаправление https и SSL, и у меня есть пара правил, настроенных для проксирования на бэкенд.
На самом деле мне просто нужен совет о том, является ли это лучшим способом решения этой проблемы или мне лучше предоставить Haproxy управление всеми правилами и просто настроить Nginx в качестве замены Pound.
Меня беспокоит, что я настрою Nginx с сотнями правил пересылки, как показано ниже, и в итоге получу проблемы с производительностью. Буду рад любым предложениям, спасибо.
location /webapp1/ {
proxy_pass http://10.1.9.11:8080;
}
location /webapp2/ {
proxy_pass http://10.1.9.11:8080;
}
location /webapp3/ {
proxy_pass http://10.1.9.12:8080;
}
решение1
Я не так много знаю, haproxy
но знаю достаточно, чтобы nginx
ответить на ваши вопросы, связанные с производительностью.
Обратите внимание, что nginx
конфигурация компилируется в struct
удобный формат и хранится в памяти, файл не считывается при каждом запросе. Поэтому сотни location /...
конфигураций будут выполняться почти так же быстро, как вызов strlen()
+ strncmp()
такое же количество раз. Что ничтожно мало по сравнению с настройкой сокета.
URL-адрес:нормализовано до начала сопоставленияпоэтому в совпадениях нет ничего по-настоящему умного, если только вы не используете один из операторов ( =
, ~
, *~
, ^~
).
Вы можете использовать сопоставление регулярных выражений ( ~
, *~
) и затем некоторую if
логику для выбора между upstream
серверами, ноэто было бы медленным решением.
С другой стороны, если у вас есть хотя бы одно регулярное выражение, то вам следует рассмотреть возможность использования оператора ^~
. См.старый, но все еще актуальный ответ Мартина Редмонда на SOо различных операторах и о том, как nginx
их сопоставить.