Dlaczego serwer HTTP Apache jest tak złożony?

14

Serwer Apache HTTP jest dość duży projekt, znacznie większy niż, powiedzmy, lighthttplub nginxczy na pewno „simple serwery HTTP” Widzicie pływających wokół w C / C ++ tutoriale.

Do czego służy dodatkowy kod? Czy dodaje bezpieczeństwo / stabilność (a jeśli tak, to w jaki sposób?) Czy może po prostu robi takie rzeczy jak parsowanie confplików Apache / .htaccesswpisywanie rzeczy (i, jak sądzę, VirtualHostsitp.).

Proszę nie krytykować Apache, ale ponieważ jestem zainteresowany pisaniem pewnego rodzaju serwera WWW i chciałbym wiedzieć rzeczy, które, choć być może nieoczywiste, są ważne, aby pamiętać o bezpiecznym, stabilnym i szybkim serwerze internetowym.

Aaron Yodaiken
źródło
Pomaga wyeliminować wszystkich, którzy nie pakują sprzętu, aby sobie z nim poradzić.
Joel Etherton,
6
To nie jest prawdziwa odpowiedź - ale słyszałem, że nazwa pochodzi od faktu, że miała wielu współpracowników już na wczesnym etapie rozwoju. Udostępniono wiele łatek, dzięki czemu jest to serwer Patchy. Prawdziwa historia.
Jeremy
+1 @ Joel Etherton: Dobra historia, zwłaszcza, że ​​to prawda. Ale nigdy nie pozwól, aby prawda
stanęła
+1 @aharon za przykład kwestionowania status quo. Ale „pisanie serwera WWW”? Czy nie wymyślamy tutaj ponownie koła, gdy istnieje wiele ofert, a także Apache?
therobyouknow

Odpowiedzi:

20

Jest o wiele bardziej złożony, ponieważ:

Ale również:

  • Jest bardziej aktywnie rozwijany ( Porównanie statusu . Na dzień dzisiejszy 28.05.2011, Apache httpd ma najnowszą aktualizację, chociaż jego nieodłączny proces wydawania powinien być utrudniony z powodu jego większej złożoności, w przeciwieństwie do konkurencji).

To powiedziawszy, odpowiedź R. zawiera ważne punkty na temat jego architektury i dlaczego niektóre inne serwery sieciowe również korzystają z względnej sławy. To zależy od tego, czego chcesz.

Możesz także zajrzeć na /programming/475386/apache-vs-nginx-vs-lighttpd-which-is-simpler-to-configure-and-administer po więcej materiałów. Cały wątek, choć nie odpowiada bezpośrednio na twoje pytanie, wskazuje na wiele różnic.


Jeśli chcesz napisać serwer WWW od zera, powiedziałbym, że studiowanie Apache httpd jest dobrą rzeczą, zwłaszcza jeśli możesz spojrzeć wstecz na to, jak ewoluował on z czasem. Pokazuje także, czego należy unikać (zarówno w punktach, do których dobrze się odnosił, jak i w miejscach, w których inni osiągają lepsze wyniki). Jednak kod może być nieco skomplikowany na początek i możesz w tym celu spojrzeć na mniejsze, bardziej lekkie serwery. Ale przestudiuj ogólną architekturę i porównaj ją z innymi.

Haylem
źródło
1
+1: Samo przeczytanie historii dziennika zmian może być niezwykle pouczające w uczeniu się, jak ewoluował sam serwer WWW i jakie wyzwania napotkał zespół na przestrzeni lat.
Joel Etherton,
1
+1 @haylem „niektóre inne serwery sieciowe korzystają ze względnej sławy” - uspokajające jest czytanie o alternatywach dla Apache, które są uważane za kompatybilne z Apache, tzn. Wykonają prawie to samo zadanie.
therobyouknow
3

Moim osobistym zdaniem dzieje się tak ze względu na wszystkie funkcje, które posiada. Możesz robić rzeczy z Apache, których nie możesz teraz robić bez nginx i lighthttpd. Apache jest tak naprawdę platformą dostarczaną ze wsparciem HTTP. Możesz mieć zaimplementowany dowolny protokół, taki jak FTP lub SMTP (patrz na przykład mod_echo). Obsługuje filtry, które pozwalają np .: obsługiwać kod PHP poza bazą danych zamiast plików (ponieważ mod_php jest modułem filtru, a nie producentem treści). Może to wydawać się niezbyt użytecznym pomysłem, ale ogólnie można użyć filtrów, aby zmienić dowolną zawartość wchodzącą lub wychodzącą bez potrzeby modyfikowania oryginalnego producenta treści. Ma poprawki dla klientów HTTP, których już nie ma, ale wtedy Apache był jedynym sposobem, aby obsługiwać ich w spójny i wolny od błędów sposób. Wiele z nich nie jest obecnie używanych.

Dodatkowy kod służy również do bezpieczeństwa, ponieważ mod_log_forensics wraz z CoreDumpDirectory stanowią prawdziwe narzędzie, gdy czujesz, że ktoś wykorzystuje lukę w zabezpieczeniach. Nie słyszałem o czymś takim w przypadku innych serwerów internetowych. Jeśli chodzi o stabilność, pochodzi ona z dobrze skonstruowanego rdzenia, a nie dodatkowego kodu. Na liście dyskusyjnej deweloperów Apache są ludzie, którzy nazywani są „podstawowymi stabilizatorami”. Są bardzo wybredni w kwestii wszelkich zmian w rdzeniu i mają tendencję do wypychania ich do modułów, co w rzeczywistości czyni Apache dość stabilnym. Jeśli zawiedzie, przez większość czasu jest to awaria modułu, a nie błąd w rdzeniu serwera.

Jacek Prucia
źródło
3

Używam Apache od ponad dwunastu lat zarówno jako administrator, jak i programista dla dużych aplikacji internetowych Perl, Python i Ruby. Apache jest solidnym serwerem WWW, który ma czystą / modułową konstrukcję i silnie zgięty UNIX. Jedną z najpotężniejszych funkcji jest czysta modułowość i dobra dokumentacja. Jest to bardzo łatwy w zarządzaniu serwer WWW. Jest dojrzały i udowodniony, co wyraźnie widać po 15 latach dominującego udziału w rynku .

Chociaż dokumentacja użytkownika jest bardzo dobra, niestety jest bardzo cenna niewielka dokumentacja dla programistów / autorów modułów i myślę, że to trochę boli, ponieważ nie przyciąga tak wielu programistów, jak to możliwe. Ale to w żaden sposób nie oznacza, że ​​jest źle zaprojektowany - po prostu źle udokumentowany pod tym względem. Jest książka Nicka Kew, która wydaje się być ostatecznym źródłem dla twórców modułów. Byłoby jednak miło, gdyby sam projekt miał lepszą dokumentację dotyczącą wszystkich aspektów pisania modułów.

Co do tego, że jest przerobiony - pranie świń. Ma doskonały design. Tak, tu i tam są brodawki, ale dotyczy to całego oprogramowania. Wykorzystanie pul pamięci jest fantastyczne, możliwość podłączenia różnych modułów wewnętrznych mówi o tym, jak czysty i modułowy jest, ma świetny C-API, a APR znacznie ułatwia wiele rzeczy nie tylko dla projektu Apache dla programiści w innych projektach. Jeśli zależy ci w ogóle na przenośności, docenisz APR. Może nie jest idealny, ale wciąż jest solidny, dobrze zaprojektowany i bardzo wygodny.

Z punktu widzenia czystych funkcji, elastyczności, administracji, wsparcia platformy, skalowalności, dokumentacji i dojrzałości, Apache jest fantastycznym serwerem WWW.

Mike Owens
źródło
-2

Jest przeprojektowany / przeprojektowany. Co najgorsze, korzysta z APR (Apache Portable Runtime), nadętej warstwy, która w końcu wydaje wiele poziomów wywołań funkcji i dynamicznej alokacji pamięci i zwalnia, aby osiągnąć równowartość pojedynczego printfwywołania. Wszystko to prowadzi do:

  • bardzo wolno
  • bardzo wymagający zasobów
  • niemożliwy do skontrolowania dla bezpieczeństwa
  • trudne do zrozumienia i modyfikacji
R .. GitHub ZATRZYMAJ LOD
źródło
5
Wskazujesz przede wszystkim na pułapki jego złożoności i (dyskusyjne, zależy od tego, które części) zły projekt; Bez względu na to, jak ważne mogą być te stwierdzenia, nie są one przyczyną ich złożoności.
haylem
1
-1 dla wzdęcia APR. Pracowałem z APR w erze sprzed 1.0, a wtedy nie wprowadzało to więcej wzdęć niż w bazie kodu 1.3. Również dynamiczny przydział pamięci w APR jest mniej więcej dokładną kopią kodu pamięci 1.3. A nawet jeśli masz rację ... w jaki sposób wszelkiego rodzaju wzdęcia uniemożliwiają przeprowadzenie audytu?
Jacek Prucia,
zgadzam się z @haylem (+1), a także: te cztery punkty w odpowiedzi @R ..: skąd wiesz? Z czym się porównujesz? Być może masz rację, ale twoje punkty będą względne, tj. „Bardzo wolno” - ale w porównaniu z czym? Inny serwer, taki jak wspomniany tutaj? Jeśli tak, proszę je zacytować.
therobyouknow
Uważam, że strona internetowa thttpd ma dobre dane dotyczące zawartości statycznej. Co bardziej zaskakujące jest to, że z własnego doświadczenia w prowadzeniu internetowego systemu prac domowych, Apache działał znacznie wolniej mod_perlniż thttpd po prostu uruchamiał nową instancję perla dla każdego klienta. To było dawno temu i nigdy nie przeprowadzałem rygorystycznych testów w celu wyśledzenia wszystkich przyczyn; dział właśnie kupił nowy serwer ...
R .. GitHub ZATRZYMAJ POMOC W LODZIE
@R .: jeszcze raz, dlaczego miałbyś uruchamiać go z mod_perl :)
haylem