Почему Unicorn нужно разворачивать вместе с Nginx?

Я хотел бы знать разницу между Nginx и Unicorn. Насколько я понимаю, Nginx — это веб-сервер, а Unicorn — HTTP-сервер Ruby.

Поскольку и Nginx, и Unicorn могут обрабатывать HTTP-запросы, зачем использовать комбинацию Nginx и Unicorn для приложений RoR?


person loganathan    schedule 05.01.2012    source источник
comment
Хороший вопрос ! Я думаю, что заголовок этого вопроса должен быть «Зачем нам нужна комбинация nginx и unicorn». ;) Ответы были очень полезны для меня.   -  person servatj    schedule 28.10.2015
comment
@servatj Я добавил ответ, в котором более подробно объясняется, почему Unicorn нужен перед ним обратный прокси-сервер, такой как Nginx. Возможно, вы захотите проверить это ;)   -  person Agis    schedule 30.04.2016


Ответы (4)


Nginx
введите здесь описание изображения
Единорог
введите здесь описание изображения
См. unicorn на github для получения дополнительной информации.

person Pratik    schedule 05.01.2012
comment
Pratik, какой у меня вопрос: сервер единорога может обслуживать как статические, так и динамические процессы, тогда почему мы используем NGinx или Apache, которые могут обрабатывать только статическое содержимое в сочетании с пассажиром, единорогом или mod_php? - person loganathan; 05.01.2012
comment
@loganathan, и Apache, и Nginx намного быстрее обслуживают статический контент, чем ruby ​​или любой из серверов приложений. Они также умеют обращаться с кэшированием и умеют разрешать одновременную загрузку файлов, при этом получая трафик и передавая его на серверы приложений. - person Pratik; 05.01.2012
comment
Кроме того, если у вас есть большие объемы входящих и исходящих данных, nginx будет буферизовать их от клиента (и подавать с ложки). Без nginx один из ваших единорогов будет подвязан во время загрузки/выгрузки. - person BraveNewCurrency; 22.07.2013
comment
Это не отвечает на вопрос, зачем вообще нужен nginx. Он просто помещает его на обе картинки без каких-либо комментариев. Ответ Ника намного лучше. - person gorn; 20.12.2014
comment
Я согласен с @gorn. Для меня, например, это ничего не значило. - person BalinKingOfMoria Reinstate CMs; 17.11.2015
comment
Согласен с @gom. Даже связанный пост в блоге Github не объясняет, зачем нужен nginx. См. мой ответ для подробного объяснения: stackoverflow.com/questions/8739871/ - person Agis; 02.05.2016
comment
Прежде чем читать другие ответы, я хотел согласиться с тем, что этот ответ не дает никакой информации. Лучшее, что я могу сделать из этой диаграммы, это то, что unicorn использовала Nginx в качестве модели, переписала ее и изменила некоторые словарные слова. Он действительно делает то же самое? - person omikes; 07.02.2017
comment
На нижнем рисунке желтое поле должно быть помечено как единорог вместо nginx? - person mbigras; 12.05.2017
comment
@oMiKeY К вашему сведению, вы можете пометить этот ответ как «Не ответ», если считаете, что он вам не поможет. - person Agis; 20.10.2017
comment
Система пометок на этом сайте — шутка. Бесполезные или украденные ответы больше не модерируются, если человек, дающий ответ, пользуется уважением в сообществе. Судя по количеству золотых медалей этого человека, отмечать этот ответ было бы бессмысленно. Критика в комментариях — это последняя форма критики, разрешенная на этом сайте, помимо отрицательного голосования, за которое я получу штраф. - person omikes; 20.10.2017

Nginx — это чистый веб-сервер, предназначенный для обслуживания статического контента и/или перенаправления запроса в другой сокет для обработки запроса.

Unicorn — это стоечный веб-сервер, предназначенный только для размещения «стоечного приложения», которое обычно генерирует динамический контент. Стоечные приложения также могут обслуживать статический контент, но они менее эффективны, чем большинство других традиционных веб-серверов.

В большинстве установок RoR используется комбинация как традиционных веб-серверов, так и стоечных серверов, чтобы максимально использовать их возможности. Nginx невероятно быстро перенаправляет запросы за счет балансировки прокси и обслуживания статического контента. Unicorn вполне способен обрабатывать заголовки HTTP и балансировать входящие запросы к Ruby для обработки.

person Nick    schedule 06.01.2012

Этот ответ дополняет другие и объясняет, почему Unicorn нужен nginx перед ним.

TL;DR Причина, по которой Unicorn обычно развертывается вместе с обратным прокси-сервером, таким как nginx, заключается в том, что его создатели намеренно разработали его таким образом, пожертвовав простотой.

Прежде всего, ничто не мешает вам развернуть Unicorn без обратного прокси-сервера. Однако это было бы не очень хорошей идеей; давайте посмотрим, почему.

Unicorn следует философии Unix, которая заключается в том, чтобы делать что-то одно и делать это хорошо, а именно обслуживать быстрых клиентов с малой задержкой (позже мы увидим, что это означает). на). Тот факт, что Unicorn предназначен для быстрых клиентов с малой задержкой, также означает, что он не очень хорош с медленными клиентами с высокой задержкой, что действительно верно. Это одно из слабых мест Unicorn, и именно здесь в игру вступает обратный прокси-сервер: он сидит перед Unicorn и заботится об этих медленных клиентах (посмотрим, как позже).

К счастью, такой обратный прокси-сервер уже существует и называется nginx.

Решение работать только с быстрыми клиентами значительно упрощает дизайн Unicorn и позволяет использовать гораздо более простую и меньшую кодовую базу за счет некоторой дополнительной сложности в отделе развертывания (т. е. вам также необходимо развернуть nginx в дополнение к Unicorn).

Альтернативным решением может быть проектирование Unicorn таким образом, чтобы ему не требовался обратный прокси. Однако это означает, что ему придется реализовать дополнительные функции, чтобы делать все то, что сейчас делает nginx, что приводит к более сложной кодовой базе и большим инженерным усилиям.

Вместо этого его создатели приняли решение использовать существующее программное обеспечение, которое проверено в боевых условиях и очень хорошо спроектировано, и не тратить время и энергию на проблемы, уже решенные другим программным обеспечением.

Но давайте перейдем к техническим аспектам и ответим на ваш вопрос:

Почему Unicorn нужно разворачивать вместе с nginx?

Вот некоторые из основных причин:

Unicorn использует блокировку ввода-вывода для клиентов

Использование обратного прокси-сервера означает, что Unicorn не необходимо использовать неблокирующий ввод-вывод. Вместо этого он может использовать блокирующий ввод-вывод, который по своей сути проще и легче для программиста.

Кроме того, как указано в документе DESIGN:

[Использование блокирующего ввода-вывода] позволяет использовать более простой путь кода в интерпретаторе Ruby и меньше системных вызовов.

Однако это также имеет некоторые последствия:

Ключевой момент №1: Unicorn неэффективен на медленных клиентах

(Для простоты мы предполагаем установку с 1 рабочим Unicorn)

Поскольку используется блокирующий ввод-вывод, воркер Unicorn может обслуживать только одного клиента за раз, поэтому медленный клиент (то есть клиент с медленным соединением) эффективно заставит воркер быть занятым в течение более длительного времени. (чем быстрый клиент). Тем временем другие клиенты будут просто ждать, пока работник снова освободится (т.е. запросы будут накапливаться в очереди).

Чтобы обойти эту проблему, перед Unicorn развертывается обратный прокси-сервер, который полностью буферизует входящие запросы и ответы приложения, а затем отправляет каждый из них в один раз (то есть кормит их с ложечки) Unicorn и клиентам соответственно. В связи с этим можно сказать, что обратный прокси-сервер «защищает» Unicorn от медленных сетевых клиентов.

К счастью, Nginx — отличный кандидат на эту роль, поскольку он предназначен для эффективной обработки тысяч сотен одновременных клиентов.

Крайне важно, чтобы обратный прокси-сервер находился в той же локальной сети, что и Unicorn (обычно на той же физической машине, которая взаимодействует с Unicorn через сокет домена Unix), чтобы свести задержку в сети к минимуму.

Таким образом, такой прокси-сервер эффективно играет роль быстрого клиента , для обслуживания которого в первую очередь предназначен Unicorn, поскольку он быстро проксирует запросы к Unicorn и сохраняет рабочие процессы быстрыми. em>за максимально короткое время (по сравнению с тем, сколько времени потребовался бы клиент с медленным соединением).

Ключевой момент № 2: Unicorn не поддерживает поддержку HTTP/1.1.

Поскольку Unicorn использует блокирующий ввод-вывод, это также означает, что он не может поддерживать функцию проверки активности HTTP/1.1, поскольку постоянные соединения медленных клиентов быстро займут все доступные рабочие процессы Unicorn.

Поэтому, чтобы использовать поддержку активности HTTP, угадайте, что: используется обратный прокси-сервер.

nginx, с другой стороны, может обрабатывать тысячи одновременных подключений, используя всего несколько потоков. Следовательно, у него нет ограничений на параллелизм, таких как сервер Unicorn (который по существу ограничен количеством рабочих процессов), что означает, что он может прекрасно обрабатывать постоянные соединения. Подробнее о том, как это работает, можно узнать здесь.

Вот почему nginx принимает поддерживающие соединения от клиентов и проксирует их в Unicorn по обычным соединениям, как правило, через сокет Unix.

Пункт № 3: Unicorn не очень хорошо обслуживает статические файлы

Опять же, обслуживание статических файлов — это то, что Unicorn может делать, но не предназначено для эффективной работы.

С другой стороны, обратные прокси, такие как nginx, гораздо лучше справляются с этим (например, sendfile(2) и кэширование).

Более

Есть и другие моменты, изложенные в документе ФИЛОСОФИЯ (см. "Улучшение производительности за счет обратного Прокси").

См. также некоторые из основных функций nginx.

Мы видим, что, используя существующее программное обеспечение (например, nginx) и следуя философии Unix «делать что-то одно и делать это хорошо», Unicorn может следовать более простому дизайну и реализации, сохраняя при этом эффективность обслуживания Rack-приложений (например, ваше приложение Rails).

Для получения дополнительной информации обратитесь к философии и design, которые более подробно объясняют варианты дизайна Unicorn и почему nginx считается хорошим обратным прокси-сервером для Unicorn.

person Agis    schedule 30.04.2016
comment
Но почему бы просто не использовать Nginx, я думаю, он спрашивал, а не «почему единорог требует nginx». Что, например, предоставляет Unicorn, чего нет в Nginx? - person omikes; 07.02.2017
comment
@oMiKeY Если это так, я считаю, что другие ответы довольно хорошо решают этот вопрос. Я по-прежнему думаю, что мой ответ содержит полезную информацию для всех, кто пытается понять комбинацию nginx и unicorn. - person Agis; 15.03.2017
comment
Это чистое золото. Спасибо! - person Magne; 22.11.2017

Nginx можно использовать для обслуживания медленных клиентов на сервере единорога, поскольку медленные клиенты могут задушить сервер единорога. Nginx используется как своего рода прокси-сервер, буферизующий все запросы и ответы медленным клиентам.

См. http://unicorn.bogomips.org/.

person bardiir    schedule 05.01.2012