Нужно ли использовать keep-alive между reverse proxy (nginx) и backend сервером?
Есть веб сервер бекенда, перед ним стоит nginx. Имеет ли смысл использовать между ними keep-alive? Интересует ответ с точки зрения производительности и затрат ресурсов обоих серверов.
Размышления:
- При включенном keep-alive должно плодиться меньше соединений, тем более что через несколько постоянных соединений должны пролезать много запросов от многих пользователей.
- С другой стороны висячие keep-alive соединения расходуют ресурсы как операционки, так и обоих веб серверов.
- Предположим что бекенд будет отдавать контент медленно (я не знаю по каким причинам, но вдруг), тогда количество keep-alive соединений может сильно вырасти и остаться висеть все время их существования. Не приведет ли это к какому-нибудь неприятному эффекту? Понятно, что если их будет слишком много, то новые соединения не будет создаваться, но без keep-alive и с медленным бекендом их ведь так же будет очень много? Возможно, нужно использовать keep-alive с небольшим таймаутом (пару секунд)?
Зависит от. Если у вас большой запас по памяти/процессору - включайте (само собой, покрутив кол-во воркеров бэкэнда до нужной циферки).
Если памяти мало - то keep-alive не будет давать "лишним" процессам бэкэнда (особенно, если это apache2) завершаться и высвобождать память. Например, без keep-alive вполне себе можно отвечать достаточно бодро двумя-тремя процессами апача, а с включенным keep-alive оно наверняка подскочит до максимума одновременно запущенных.
Вообще же операция установления соединения по локальной петле стоит копейки по времени, поэтому если вы в бэкэнд явно ходите по 127.0.0.1 (или ::1) и у вас не low-latency сервис, где вы боретесь за каждую миллисекунду времени ответа - лучше выключить.
На бэкэнде воркерный сервер построенный по принципу nginx'а, т.е. висячие коннекты дешевы. С другой стороны я понимаю, что коннект на локалхост тоже дешев (пока да, на локалхост). Итого, опять не понятно что предпочтительнее. Спасибо за интересный ответ.
@Mandor тогда могу посоветовать взять какой-нибудь Яндекс.Танк и пострелять. Посмотрите насколько уменьшится время ответа под большой нагрузкой и насколько больше железа потратится - тогда и можно будет делать выводы.
Ну и да, не забывайте, что nginx не так давно поддерживает keep-alive к бэкэндам, так что вполне вероятно, что в какой-нибудь lts убунте текущая версия вообще не поддерживает его.
С клиентами keep-alive лучше включать, если на ваш сайт ходят посмотреть больше, чем полторы странички, само собой. Да и nginx почти ничего не тратит на поддержание таких соединений - почти вся работа в этом месте делается ядром.