Мне нужно настроить систему балансировки нагрузки. На данный момент у меня есть две машины, на которых работают Nginx 0.8.52, PHP-FPM (на сокете unix) и приложение на основе PHP Symfony 1.4.11.
На третьей машине мне нужно выбрать, какой балансир установить.
Я уже использовал Varnish для кэширования статических файлов, но я не знаю, сможет ли балансировка нагрузки Varnish обрабатывать PHP-сессии Symfony. Другой вариант - балансировка нагрузки Nginx с помощью ip_hash.
Какой из них лучше?
заранее спасибо
Почему не оба? Поместите NginX спереди, чтобы обрабатывать сжатие gzip, и SSL и Varnish за ним, чтобы обрабатывать кеширование и балансировку нагрузки. Бэкэнд-приложению потребуется некоторое совместное использование сеанса в БД или Memcache, как было предложено Кристапом, и Varnish не будет кэшировать какой-либо динамический контент, который обслуживается с помощью файлов cookie или аутентификации, но все остальное будет в порядке.
Рекомендуемая настройка - создать отдельное статическое имя хоста (например, static.example.com
и обслуживать весь статический контент оттуда, без файлов cookie (Varnish будет кэшировать его нормально, так как файлов cookie нет), и еще один для динамического контента, который может быть сбалансирован с помощью NginX или Varnish, используя cookie для обработки сеанса, и все бэкенды, совместно использующие информацию о сеансе, как указано выше.
Я не эксперт по фреймворкам Symfony, но для балансировки нагрузки рекомендуется переместить сеансы из хранилища файлов по умолчанию в обработчик сеанса memcache, чтобы разрешить сеансовую часть масштабирования приложения над отдельным приложением.
Вы можете заархивировать липкие сеансы в лаке с помощью магии VCL (некоторые простые аритметические операции по десятичному представлению IP-адреса клиентов, например по модулю).
Varnish по задумке - это кеширующий сервер, а не балансировка нагрузки. Также varnish не поддерживает SSL, а это значит, что нужен отдельный терминатор SSL (чаще всего - nginx с модулем ssl).
Я предлагаю вам использовать балансировщик нагрузки, который предназначен не для кеширования, а для полностью динамической части веб-приложения, такой как haproxy или nginx, оба из которых поддерживают липкие сеансы.
Я думаю, что лучше найти способ поделиться данными сеанса для будущих узлов, например. NAS или сделать так, чтобы балансировщик нагрузки разделял сеансы php. Другой вариант - переписать ваше приложение, чтобы оно могло использовать базу данных mysql для своих сеансов, и снова обмениваться этими данными по узлам.