Когда мне следует перейти на NGinx?

11

У меня есть сервер с несколькими доменами и приложениями, запущенными через Apache. На данный момент все хорошо, но у меня есть планы разработать какое-то очень ресурсоемкое веб-приложение (использующее C ++ с CPPCMS), начиная с моего сервера для тестирования, возможно, получив отдельный сервер только для этого приложения, как только оно будет готово.

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

Я не опытный пользователь Apache, я плохой администратор Linux и не очень много разрабатываю веб-приложения (но у меня есть представления). Я в основном посвящен написанию программного обеспечения, поэтому часть веб-сервера иногда очень неясна для меня. Каждый раз, когда мне приходится настраивать веб-сайт через apach, мне нужно много времени просматривать документ, чтобы убедиться, что я не нарушаю все.

Тем не менее, я думаю, что я становлюсь намного лучше с этой стороны, но все еще нуждаюсь в совете. Я видел некоторые файлы конфигурации nginx, и это кажется гораздо более понятным, чем файлы Apache, но, возможно, я ошибаюсь?

Из информации, которую я собрал, NGinx будет лучшим выбором, когда вы хотите распределить нагрузку, так что если ваше приложение распределено на несколько машин, верно? Поскольку я думаю о своем приложении для scalling (и производительности), похоже, что это то, что мне нужно, но, возможно, мне нужно знать больше о том, когда интересно перейти с Apache на NGinx. Стоит ли переходить на NGinx для всех моих текущих приложений? Сколько это стоит? (Я имею в виду, дорого ли по времени переключаться с одного на другое?) Могу ли я без проблем использовать Apache и NGinx на одном компьютере?

Примечание : пожалуйста, не советуйте мне использовать интерпретируемые языки вместо C ++, это не связано с вопросом. См. Страницу обоснования CPPCSM, чтобы узнать, какое приложение может извлечь из этого пользу. Я прекрасно понимаю недостатки (по сравнению с приложениями на Ruby и Python, которые я уже использую для менее энергоемких веб-приложений), и я в порядке.

Klaim
источник

Ответы:

10

Несколько моментов:

Основное различие между Apache и Nginx или Lighttpd (которое мне лично очень нравится) заключается в архитектуре:

  1. Apache обрабатывает одно соединение на процесс или поток (в зависимости от mod-XYZ)
  2. Nginx и Lighttpd являются однопоточными дескрипторами нескольких соединений в одном цикле обработки событий.

Как результат:

  1. Nginx и Lighttpd значительно лучше масштабируются при большом количестве одновременных подключений, скажем, при 1000 подключениях Apache почти умрет, поскольку ему потребуется 1000 процессов в mod-prefork или 1000 потоков в mod-worker.

    Если вы планируете использовать технологии Comet, где каждое соединение требует длительного HTTP-соединения с опросом, тогда Apache будет неприемлемым, поскольку он плохо масштабируется.

  2. Nginx и Lighttpd потребляют меньше памяти, поскольку каждое соединение требует + - два сокета (HTTP и FastCGI), промежуточный буфер памяти и некоторое состояние, в то время как Apache потребуется весь поток, включая стек и другие вещи.

Исходя из моего личного опыта в тестах производительности, я сделал Lighttpd (и я полагаю, что и Nginx) немного быстрее с бэкэндом FastCGI, чем Apache, но это для небольшого количества соединений.

Теперь еще один момент, когда вы хотите выполнить некоторые балансировки нагрузки с использованием соединений FastCGI.

В традиционной архитектуре

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

Поскольку Apache обрабатывает пулы процессов, каждый из которых работает с mod-PHP (или другими режимами)

Когда вы используете CppCMS, которая обрабатывает пулы самостоятельно, вы можете сделать что-то другое:

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

Таким образом, в принципе вам не нужен другой уровень косвенности, потому что CppCMS обрабатывает процесс, поток и пул соединений для вас. В то время как PHP / Ruby / Perl нужно немного Apache mod-XYZ или обрабатывать собственный коннектор FastCGI.

Артём
источник
+1 Хорошее полное объяснение автора CppCMS;) Хорошо, теперь я вижу лучше общую проблему. Таким образом, случай, когда у вас есть только один сервер (для начала) это HTTP-> Balancer-> FCGI-> CPPCMS, если я правильно понимаю? Что вы думаете о совете из комментария Джеспера Мортенсена о том, что FastCGI не быстрый?
Klaim
@Klaim: Посмотрите на превосходные рисунки выше - в этой архитектуре FastCGI используется в качестве межсоединения между несколькими серверами, на каждом из которых работает многопоточный экземпляр CppCMS. Относительная скорость FastCGI в этом случае имеет гораздо меньшее значение; вашими альтернативами будут HTTP, AJP и другие сетевые протоколы, которые тоже не «быстрые». Этот ответ, вероятно, должен быть помечен как принятый, а ваш вопрос отредактирован, потому что речь не идет о том, когда nginx того стоит.
Джеспер М
@Jesper Mortensen> Я согласен, но какую модификацию в вопросе вы предлагаете точно?
Klaim
6

Nginx, говоря очень ( очень ) в целом, может получить намного более высокую пропускную способность, чем Apache, благодаря другому архитектурному подходу к проблеме подачи страниц в Интернет. Nginx также был построен в основном как обратный прокси-сервер, и он отлично справляется с этой ролью (это бит балансировки нагрузки, на который вы ссылались); Апач, с другой стороны, был создан для обслуживания веб-страниц, а позже получил возможность прокси.

Тем не менее, есть почти наверняка области, в которых Apache будет последовательно превосходить Nginx, в то время как есть другие, где Nginx будет так же стабильно превосходить Apache.

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

Тем не менее, если вы хотите переключиться на Nginx (что я действительно поощряю!), То сделайте это. Вы увидите какую-нибудь выгоду? 9 раз из 10: нет, не будешь. Но вы упомянули, что вам больше нравится язык конфигурационных файлов Nginx, так что если вам удобнее настраивать Nginx, чем Apache, это будет для вас преимуществом! (Лично я считаю, что конфигурации Apache легче читать в целом, но это может быть из-за того, что я потратил много-много лет на их чтение, а на Nginx было потрачено всего несколько коротких месяцев!)

На заметку: Вы упомянули о своем желании создать веб-приложение на C ++. Ради вашего здравого смысла я настоятельно призываю вас использовать язык более высокого уровня, такой как PHP, Python или даже Java. Затем профилируйте свой код и подумайте о создании модулей на основе C ++ для устранения конкретных узких мест (и Python, и PHP оба позволяют это довольно легко; не знают о Java). Если вас беспокоит общая производительность, учтите следующее: EVE Online, единственная в мире неосколенная MMORPG, построена на варианте Python (Stackless Python), в котором только ключевые компоненты (например, графические библиотеки) написаны на C ++. Если Python может справиться с этим, конечно, он может обрабатывать ваше веб-приложение?

Kromey
источник
+1 Спасибо. О C ++, см. Мой комментарий к ответу Джеспера Мортенсена. Кроме того, даже если Python используется на серверной стороне Eve Online (я знаю об этом, много знаю) AFAIK, он управляет только геймплейным кодом (который является большим), а некоторые другие части фактически находятся в C ++. Графический код находится на стороне клиента, поэтому C ++ также обязателен для таких типов графической производительности. Как я уже сказал, см. Страницу с обоснованием CPPCMS, почему я выбрал его. Если бы я последовал твоему совету, мне пришлось бы написать свое заявление дважды, хотя я уже знаю, что оно очень энергоемко. Кроме того, я понимаю недостатки, и я в порядке с этим.
Klaim
3

Никто не может ответить на часть «когда я должен переключиться» - это будет зависеть от вашей нагрузки, производительности вашего собственного кода приложения и т. Д.

NGinx, который кажется более производительным, чем Apache

nginx использует один процесс (или очень небольшое количество рабочих процессов) для обработки всех клиентских подключений с использованием четного ввода-вывода. В Apache доступно несколько «модулей многопроцессорной обработки» , но все они больше склоняются ко многим многим процессам / многим потокам. В результате Apache, как правило, потребляет больше оперативной памяти и ЦП, чем nginx, для базовой обработки HTTP-соединений. Вы можете получить обзор различных подходов к обработке соединений на странице Kegel C10K .

веб-приложение с высокой производительностью (с использованием C ++ и CPPCMS)

Я настоятельно рекомендую рассмотреть возможность создания базового веб-приложения на языке более высокого уровня (Python, или, может быть, Ruby, Scala) и использовать очередь сообщений для отправки рабочих билетов на рабочие машины, которые асинхронно обрабатывают «ресурсоемкие» задачи.

NGinx будет лучшим выбором, если вы хотите распределить нагрузку,

nginx - хороший балансировщик нагрузки; но есть много вариантов в этом пространстве .

Могу ли я без проблем использовать Apache и NGinx на одной машине?

Да. Просто запустите их на разных номерах IP-портов и / или IP-адресах.

Джеспер М
источник
«Я бы настоятельно рекомендовал рассмотреть возможность создания базового веб-приложения на языке более высокого уровня»> Я не говорил, что это базовое веб-приложение - оно даже тривиально. Если вы видите обоснование для использования CPPCMS, автор несколько пунктов случаев, когда это может быть полезным, и я в этих случаях. Я рассмотрел другие альтернативы, но нашел их дороже, чем переход на C ++, по крайней мере, в виде веб-приложения, которое я пишу. Так что это не часть вопроса. Но я понимаю ваш совет и даю то же самое людям, спрашивающим меня, должны ли они использовать C ++ для веб-приложений. Я также планирую использовать Python для другого более простого приложения.
Klaim
Во всяком случае, +1 для деталей.
Klaim
@Klaim: Если вы хотите реализовать заявленное улучшение производительности «на порядок» по сравнению с хорошо настроенной реализацией C # / Java, то посмотрите, можете ли вы запускать CppCMS и код приложения в процессе работы с вашим веб-сервером - то есть как плагин для nginx / Apache. Страницы CppCMS, кажется, показывают FastCGI как соединение между веб-сервером и CppCMS; и на самом деле FastCGI не ... быстро.
Джеспер М
> Интересная идея. Большинство советов заключается в том, что вы должны использовать fastcgi, потому что это быстрее, чем альтернативы. Я проверю, смогу ли я это сделать, возможно, узнаю у автора CPPCMS, почему он считает это самым быстрым.
Klaim