LINUX.ORG.RU

Балансировка нагрузки с Nginx для нескольких виртуальных хостов

 , , ,


1

1

Коллеги,

настраиваю выделенный под балансировку хост с nginx. С одним виртуальным хостом не было бы проблем, но у меня несколько, поэтому запутался в конфигурации. Схема такова:

На хост-балансер приходят запросы типа zapros1.ru, zapros2.ru, zapros3.ru. За балансером два бэкэнда с apache (между бэками репликация mysql и rsync, что не особо важно). На 1-ом бэкэнде крутятся zapros1.local, zapros2.local, zapros3.local, на 2-ом бэкэнде zapros1-repl.local, zapros2-repl.local, zapros3-repl.local.Реализовать хочу так:

сам nginx на балансере ничего не отдаёт, он только проксирует на бэки, то есть если запрос пришёл на zapros2.ru, то он проксируется на zapros2.local, если zapros2.local недоступен, то отдаётся zapros2-repl.local

По локальным адресам бэкэнды доступны.

Конфиг nginx (для одного виртуального хоста):

upstream zapros1-backend {
  server zapros1.local max_fails=3 fail_timeout=30s;
  server zapros1-repl.local backup;
}


server {
	 listen 192.168.0.150:80;
	 server_name zapros1.ru;
	 location / {
		proxy_pass http://zapros1-backend;
	  }
	}
	

Подскажите, как правильно сконфигурировать nginx в такой ситуации.

P.S. С таким конфигом проксирование работает, но отдаётся не тот виртуальный хост, который нужно (с бэкэнда).

отдаётся не тот виртуальный хост, который нужно (с бэкэнда).

Если делать запрос на бэкэнд напрямую, отдается все нормально?

goingUp ★★★★★ ()

но у меня несколько, поэтому запутался в конфигурации

Кажется я запутался уже на этапе чтения твоего описания.
Воткни на бекэнд (тот на который запросы ошибочно попадают) дамп или логгирование всего запроса (например var_dump($_GET); если это php), посмотри заголовки, подозреваю что там передаётся неправильный заголовок Host (zapros1.local или zapros1-backend вместо zapros1.ru)

MrClon ★★★★★ ()
Ответ на: комментарий от expelled
upstream zapros1-backend {
  server zapros1.local max_fails=3 fail_timeout=30s;
  server zapros1-repl.local backup;
}


server {
	 listen 192.168.0.150:80;
	 server_name zapros1.ru;
	 location / {
		proxy_pass http://zapros1-backend;
                proxy_set_header Host $host;
	  }
	}

Сделал так, ничего не поменялось.

yellowboy ()
Ответ на: комментарий от MrClon

Посмотрел логи на бэкэнде и появились идеи. Проверил, получилось. В итоге:

на бэкэндах в качестве сервернейма поставил zapros1.ru (было zapros1.local и zapros1-repl.local, соответственно), nginx переделал так:

upstream zapros1-backend {
  server 192.168.0.8;
  server 192.168.0.49 backup;
}


server {
	 listen 192.168.0.150:80;
	 server_name zapros1.ru;
	 location / {
		proxy_pass http://zapros1-backend;
                proxy_set_header Host $host;
	  }
	}

И всё работает как надо. Всем спасибо.

yellowboy ()
Ответ на: комментарий от yellowboy

Может посоветуете какие-то штуки по минимальному тюнингу моего конфига? Бэст практисиз, так сказать.

yellowboy ()
Ответ на: комментарий от yellowboy

Видимо домен указанный в директиве server переопределяет Host заданный директивой proxy_set_header

MrClon ★★★★★ ()
Ответ на: комментарий от yellowboy
  1. Внимательно прочитать тут, тут, тут и тут
  2. Подумать что из этого можно применить для свой задачи
  3. Перечитать
  4. Подумать
  5. Применить

ssl тоже не помешает

expelled ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.