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. С таким конфигом проксирование работает, но отдаётся не тот виртуальный хост, который нужно (с бэкэнда).



Последнее исправление: yellowboy (всего исправлений: 1)

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

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

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 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.