Настройка обратного прокси-сервера Nginx

Настройка обратного прокси-сервера Nginx

В настоящее время у меня есть несколько сотен веб-приложений, распределенных по примерно 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их сопоставить.

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