Как стать автором
Обновить

Комментарии 14

Как вовремя! Спасибо :)
Всегда пожалуйста :)
А какая у вас схема кластера? Интересно один ли балансировщик или используется два (три) сервера с HAProxy? И как они перехватывают управление?
А можно просто использовать LVS (linux virtual server) в режиме DR (direct routing) и не нести накладных расходов в юзерспейсе и не иметь таких проблем вообще — адрес будет оригинальный на nginx-е.
Можно и так конечно. Однако следует помнить, что haproxy довольно богат в функциональном плане и умеет еще массу полезных вещей, например проверять состояние backend'a при помощи кастомизируемых проверок, маршрутизировать через один ip разные домены при использовании TLS и т.д.

Правильно ли я понимаю, что способ маршрутизации на 4 уровне производительнее, но дает меньшую гибкость и работает не со всеми бэкэндами?
Не совсем так. В статье я показал как можно воспользоваться расширением proxy protocol, если frontend и backend его поддерживают. Без proxy protocol TCP-балансировку можно настроить на любой tcp-сервис, будь то FTP, IMAP, SQL и т.п.

И, пожалуй следует отметить, что в HAProxy так же можно использовать смешанную (http/tcp) маршрутизацию и балансировку [*]:
frontend mixed_frontend
	bind :80
	mode tcp
	option tcplog
	tcp-request inspect-delay 5s
	tcp-request content accept if HTTP
	use_backend http_backend if HTTP
	default_backend tcp_backend

   backend tcp_backend
        # tcp-only config

   backend http_backend
	# http-only config
	mode http

Таким образом можно, к примеру, расположить на 80 порту одновременно и веб-сервер и сервер SSH.
Интересная штука, надо будет попробовать.
А с HTTP протоколом оно действительно работать не должно, или я какой-то глюк словил?

nginx ругался ошибкой 400 при пустых логах. Отключаю send-proxy или перевожу haproxy в http режим — всё ок.
В Nginx обычно помогает увеличить уровень логированная до Debug.

Так же очень важно, чтобы одновременно с send-proxy на HAProxy был включен proxy_protocol на Nginx.
Попробую, но даже в access_log ничего не писалось, а там уровней логирования нет, насколько я знаю.

Включено было с обеих сторон естественно. Для HTTPS части сервера описанный тут метод у меня замечательно заработал. Хотел его же для HTTP применить.
Вот тут описывается схожий случай, но причину ошибочного поведения так и не нашли:
trac.nginx.org/nginx/ticket/650
Жаль, что Tomcat не понимает proxy protocol. Ищу возможность балансировки через tcp mode для Tomcat. Используется проприетарный протокол.
Пока все тщетно
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.