Czytałem wątek Hacker News, w którym jeden użytkownik publikuje link z 2011 roku, wyjaśniając, że IIS jest znacznie szybszy niż większość innych serwerów (* nix). Inny użytkownik odpowiada, wyjaśniając, że IIS uzyskuje tę korzyść dzięki modułowi jądra o nazwie HTTP.sys . Według mojej wiedzy większość innych popularnych serwerów internetowych w 2015 r. Tego nie robi.
Nigdy nie chciałbym pisać serwera WWW w trybie jądra, ponieważ nigdy nie mogłem ufać sobie, że uwolni go od exploitów zabezpieczających (co byłoby mniej poważne, działając w niższym pierścieniu ochronnym).
Z punktu widzenia inżyniera oprogramowania (w przeciwieństwie do klienta serwerów WWW), czy działanie w trybie jądra jest mądrą decyzją dotyczącą wydajności? Czy problemy związane z bezpieczeństwem można złagodzić podczas opracowywania aplikacji do tego stopnia, aby serwer działający w trybie jądra stał się zyskiem netto dla konsumenta?
źródło
Odpowiedzi:
Http.sys to nie tyle serwer WWW, co serwer proxy. Został zaprojektowany tak, aby pozwolić wielu serwerom internetowym współistnieć na komputerze z systemem Windows, dzięki czemu IIS może uruchamiać witrynę internetową, ale także kilka usług WCF działających z interfejsami http / REST lub SOAP, wszystkie na standardowym porcie 80. (dlatego właśnie nie można uruchomić Apache w systemie Windows bez drobnych problemów, Apache nie został zmodyfikowany do pracy z tym systemem rejestracji, szkoda, że nie został bardziej przejrzysty dla aplikacji i wymaga pewnych dość skomplikowanych modyfikacji, aby się do niego przyczepić).
Działa to tak, że rejestrujesz w nim adres URL i odpowiednią aplikację, a gdy żądanie HTTP jest przesyłane na porcie 80, http.sys je akceptuje, ale następnie przekazuje żądanie do dowolnej zarejestrowanej aplikacji do obsługi tego celu adresu URL.
Wątpię, aby serwer sieciowy działający w trybie jądra miał jakiś sens - nawet jeśli w ten sposób można poprawić wydajność gniazda, aby wykonać jakąkolwiek użyteczną pracę, logika aplikacji będzie nadal wykonywana w przestrzeni użytkownika, więc zawsze jest przejście - właśnie przesunąłem go trochę wzdłuż stosu wywołań.
źródło
Http.sys nie jest jedynym dostępnym serwerem sieciowym działającym w trybie jądra: pod Linuksem istnieje także tux . Jak prawidłowo zidentyfikowałeś, bezpieczeństwo jest problemem w tego rodzaju serwerach, co doprowadziło do tego, że tux nie został uwzględniony w głównym jądrze Linux-a (i uważam, że nie był aktualizowany dla nowszych wersji jądra).
Lepszym rozwiązaniem byłoby użycie systemu operacyjnego, który nie polega na ochronie sprzętowej w celu wymuszenia bezpieczeństwa procesu, np. Osobliwości Microsoftu: taki system pozwoliłby na zwiększenie wydajności serwera w trybie jądra bez ryzyka bezpieczeństwa. Niestety od 2015 roku nie są dostępne żadne gotowe do produkcji systemy operacyjne oparte na tej zasadzie, a AFAIK nikt też poważnie nad nimi nie pracuje (projekt Singularity został anulowany).
źródło
Http.sys ma niskie ryzyko, ponieważ nie może obsłużyć żadnej poradzi dostarczonej przez firmę zewnętrzną.
Http.sys wykonuje kilka zadań.
Działa jako serwer proxy, dzięki czemu wiele procesów może odpowiedzieć na żądanie w różnych częściach przestrzeni nazw HTTP. Odpowiedź gbjbaanb obejmuje to dobrze.
Obsługuje pliki statyczne bezpośrednio z pamięci podręcznej plików systemu Windows. Zapewnia to duże przyspieszenie dla małych plików statycznych, ponieważ nie ma przełączników kontekstu.
Będzie buforować dane wyjściowe z dowolnej aplikacji, do której przesyła żądanie HTTP i zwraca wynik kasowany. Aplikacja ma pełną kontrolę nad tym, jak długo (jeśli w ogóle) trwa buforowanie.
Http.sys jest zaprojektowany do BARDZO szybkiego wykonywania prostych zadań, jednocześnie przekazując wszystko inne do procesu w przestrzeni użytkownika.
W odpowiedzi na komentarz
Problem polega na tym, że musisz zaufać Microsoftowi, aby napisał skomplikowany kod jądra, aby zadać to pytanie, w przeciwnym razie zdecydujesz się nie używać systemu Windows do hostingu w ogóle . Http.sys niewiele zwiększa ryzyko błędów jądra, biorąc pod uwagę, jak skomplikowane jest jądro.
Jeśli cokolwiek, Http.sys zmniejsza ryzyko, ponieważ istnieje tak wyraźny podział poniżej „niskiego poziomu” serwisu WWW i kodu aplikacji.
W dobrze zaprojektowanej konfiguracji maszyna (lub serwer wirtualny), na której działa serwer WWW, ma bardzo ograniczony dostęp do reszty sieci, ponieważ stanowi cel wysokiego ryzyka. To bardzo niewiele różni się, jeśli zhakowane zostanie jądro lub serwer sieciowy w trybie użytkownika, ponieważ serwer nie powinien mieć więcej „praw” w sieci, wówczas proces trybu użytkownika serwera WWW musi wykonać swoją pracę.
źródło