Почему HTTP-сервер Apache такой сложный?

14

HTTP-сервер Apache - это довольно большой проект, намного больше, чем, скажем, lighthttpили, nginxконечно, «простые HTTP-серверы», которые вы видите в учебниках по C / C ++.

Для чего нужен дополнительный код? Добавляет ли это безопасность / стабильность (и если да, то как?) Или это просто для таких вещей, как разбор confфайлов Apache / .htaccessтипа (и, я думаю, и VirtualHostsт. Д.).

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

Аарон Йодайкен
источник
Это помогает отсеять всех, кто не упаковывает снаряжение, чтобы справиться с этим.
Джоэл Этертон
6
Это не настоящий ответ - но я слышал, что название происходит от того факта, что у него было много участников даже на ранних стадиях разработки. Было внесено множество исправлений, что сделало его сервером A Patchy. Правдивая история.
Джереми
+1 @ Джоэл Этертон: Хорошая история, тем более, что это правда. Но никогда не позволяйте правде мешать хорошей истории :)
therobyouknow
+1 @aharon за пример опроса о статус-кво. Но "написание веб-сервера"? Разве мы не изобретаем колесо здесь, когда есть много предложений, а также Apache?
therobyouknow

Ответы:

20

Это намного сложнее, потому что:

  • это старше ,
  • он имеет больший набор функций ( Сравнение наборов функций ),
  • это модульное ,
  • он получил более широкую поддержку платформ ( Сравнение поддержки ОС ),
  • у него есть несколько режимов работы (многопроцессорный, многопоточный и т. д.).

Но и:

  • Он более активно разрабатывается ( Сравнение состояния. На сегодняшний день 2011-05-28, Apache httpd имеет самое последнее обновление, хотя его внутреннему процессу выпуска должно препятствовать его расширенная сложность в отличие от его конкурентов.)

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

Вы также можете посмотреть на /programming/475386/apache-vs-nginx-vs-lighttpd-which-is-simpler-to-configure-and-administer еще несколько материалов. Хотя и не отвечая непосредственно на ваш вопрос, весь поток указывает на множество различий.


Если я заинтересован в написании веб-сервера с нуля, я бы сказал, что изучение Apache httpd - это хорошая вещь, особенно если вы можете вспомнить, как он развивался с течением времени. Он также показывает вам, чего вам следует избегать (как по точкам, к которым он адресован, так и по местам, в которых он превосходит другие). Тем не менее, код может быть немного сложным для начала, и вы могли бы предпочесть взглянуть на меньшие, более легкие серверы для этого. Но изучите его общую архитектуру и сравните с другими.

haylem
источник
1
+1: Простое чтение истории изменений может быть невероятно поучительным, когда вы узнаете, как развивался сам веб-сервер и какие проблемы стояла перед командой за эти годы.
Джоэл Этертон
1
+1 @haylem «некоторые другие веб-серверы обладают относительной известностью» - обнадеживает чтение об альтернативах Apache, которые, как говорят, совместимы с Apache, то есть будут выполнять примерно ту же работу.
therobyouknow
3

По моему личному мнению, это все из-за всех особенностей, которые это имеет. Вы можете делать вещи с Apache, которые вы не могли бы сделать сейчас ни с nginx, ни с lighthttpd. Apache - фактически платформа, которая поставляется с поддержкой HTTP. Вы можете использовать практически любой протокол, например, FTP или SMTP (см., Например, mod_echo). Он поддерживает фильтры, которые позволяют вам, например: обслуживать PHP-код вне базы данных вместо файлов (поскольку mod_php является модулем фильтра, а не производителем контента). Это может показаться не очень полезной идеей, но в целом вы можете использовать фильтры для изменения любого контента, входящего или выходящего без необходимости настраивать оригинального производителя контента. У него есть настройки для HTTP-клиентов, которых больше нет, но в то время Apache был единственным способом обслуживать их согласованно и без ошибок. Многое из этого не используется в наши дни.

Дополнительный код также используется для безопасности, потому что mod_log_forensics вместе с CoreDumpDirectory предоставляют реальный инструмент, когда вы чувствуете, что кто-то использует уязвимость безопасности. Не слышал ничего подобного в случае других веб-серверов. Что касается стабильности, то она исходит из хорошо сконструированного ядра, а не из какого-то дополнительного кода. В списке рассылки Apache dev есть ребята, которых называют «стабилизаторами ядра». Они очень разборчивы в отношении любых изменений в ядре и склонны выдвигать их в модули, что на самом деле делает Apache достаточно стабильным. Если это не удается, в большинстве случаев это сбой модуля, а не ошибка в ядре сервера.

Яцек Прусия
источник
3

Я использую Apache более двенадцати лет в качестве администратора и разработчика для больших веб-приложений на Perl, Python и Ruby. Apache - это надежный веб-сервер с чистым / модульным дизайном и сильным изгибом UNIX. Одна из его самых мощных функций - это модульность и хорошая документация. Это очень управляемый веб-сервер. Он зрелый и проверенный, что хорошо видно по 15-летней доминирующей доле рынка .

Несмотря на то, что пользовательская документация очень хорошая, для разработчиков / разработчиков модулей, к сожалению, очень мало документации, и я думаю, что это немного ранит ее, поскольку не привлекает столько разработчиков, сколько могло бы. Но это никоим образом не означает, что он плохо спроектирован - просто плохо документирован в этом отношении. Есть книга Ника Кью, которая, кажется, является основным источником информации для авторов модулей. Но было бы неплохо, если бы у самого проекта была лучшая документация по всем аспектам написания модулей.

Что касается того, чтобы быть чрезмерно спроектированным - фигня. У него отличный дизайн. Да, здесь и там есть некоторые бородавки, но это верно для всего программного обеспечения. Его использование пулов памяти просто фантастично, его способность подключать различные бэк-энды говорит о том, насколько он чист и модульный, у него отличный C-API, и APR значительно облегчает многие вещи не только для проекта Apache для разработчики в других проектах. Если вам все равно что-то о переносимости, вы по достоинству оцените APR. Возможно, он не идеален, но все же он прочный, хорошо продуманный и очень удобный.

С точки зрения простых функций, гибкости, администрирования, поддержки платформы, масштабируемости, документирования и зрелости, Apache является фантастическим веб-сервером.

Майк Оуэнс
источник
-2

Это чрезмерно разработано / чрезмерно спроектировано. Хуже всего то, что он использует APR (Apache Portable Runtime), слой раздувания, который в конечном итоге тратит много уровней вызовов функций и динамического выделения памяти и освобождения для выполнения эквивалента одного printfвызова. Это все приводит к тому, что это:

  • очень медленно
  • очень ресурсоемкий
  • невозможно провести аудит в целях безопасности
  • трудно понять и изменить
R .. GitHub ОСТАНОВИТЬ, ПОМОГАЯ ЛЕД
источник
5
Вы в основном указываете на подводные камни, связанные с его сложностью и (возможно, зависит от того, от каких частей) плохой дизайн; Какими бы достоверными ни были эти утверждения, они не являются причиной его сложности.
Хайлем
1
-1 за раздувание АПР. Я работал с APR в эпоху, предшествующую 1.0, и тогда он не представлял больше вздора, чем это было в кодовой базе 1.3. Также динамическое распределение памяти в APR является более или менее точной копией кода памяти 1.3. И даже если вы правы ... как вздор любого рода делает невозможным что-либо одитировать?
Яцек Прусия
согласен с @haylem (+1), а также: эти четыре пункта в ответе @R ..: откуда ты знаешь? С чем ты сравниваешь? Вы можете быть правы, но ваши очки будут относительными, то есть «очень медленными» - но по сравнению с чем? Еще один сервер, подобный упомянутому здесь? Если это так, пожалуйста, приведите их.
therobyouknow
Я считаю, что на сайте thttpd есть хорошие цифры для статического контента. Что еще более удивительно, из личного опыта использования веб-системы домашней работы студентов Apache также был намного медленнее, mod_perlчем thttpd, просто запускающий новый экземпляр perl для каждого клиента. Это было давно, и я никогда не проводил строгих тестов, чтобы выследить все причины; Департамент только что купил новый сервер ...
R .. GitHub ОСТАНОВИТЬ ПОМОЩЬ ICE
@R .: еще раз, зачем вам запускать его с mod_perl :)
haylem