Webrick jako serwer produkcyjny kontra cienki czy jednorożec?

117

Wygląda na to, że jest oczywiste, że nie możesz używać Webricka jako serwera produkcyjnego, ale tak naprawdę nie mogę znaleźć nigdzie wspominającego dlaczego. Wydaje się, że konsensus jest następujący: „Webrick nadaje się do tworzenia, ale Cienki lub Jednorożec to wybór do produkcji, kropka”.

Sprawdziłem stronę główną serwera Thin i mówi o żądaniach / sekundę, ale tak naprawdę nie rozumiem wykresu, ponieważ nie ma adnotacji.

Czy ktoś może mi powiedzieć, dlaczego powinienem używać Thin lub Unicorn w porównaniu do Webrick? Czy są jakieś korzyści z używania Webrick do programowania? Używam Webricka, ponieważ jest dostarczany z szynami i myślę, że powinien być powód, dla którego jest domyślny.

Nawiasem mówiąc, używam Heroku.

Vlad
źródło
Jest powolny w porównaniu do innych, takich jak Mongrel.
uday
38
Ken, naprawdę nie zadałem tego pytania, żeby o czymkolwiek dyskutować. Naprawdę chcę poznać odpowiedź, ponieważ nie mogłem nigdzie znaleźć prawdziwych statystyk, kiedy wszyscy uważają za pewnik Webrick jest gorszy. Nie jestem związany z żadną z tych partii, a debaty, o których wspomniałeś, są pytaniami, które zadaję z prawdziwej ciekawości. Jak mogę przeformułować pytanie, aby nie wyglądało w ten sposób?
Vlad
24
To jest dobre pytanie.
justingordon
29
Takie pytania NIE powinny być zamykane. Są przydatne i pomocne. Cała samozwańcza policja treści powinna się wycofać.
Ken Smith
22
Znalazłem to, wpisując w Google „Dlaczego nie używać WEBrick w produkcji?” ponieważ jest to pytanie, na które chcę odpowiedzieć. Nie chcę używać WEBrick w produkcji, ale denerwuje mnie to, że wszyscy mówią: „Oczywiście, ponieważ nie jest to For Production®”. To naprawdę nie jest takie oczywiste - gdyby tak było, ludzie nie badaliby tego pytania, zanim w końcu zapytaliby o StackOverflow, jak wskazuje @Vlad. Przyjęta odpowiedź jest pomocna; przynajmniej wskazuje na brakujące funkcje. Stycznie, naleganie na zamknięcie pytania, ponieważ uważasz, że jest dyskusyjne bez podania własnej odpowiedzi, nie jest pomocne.
Justin Force,

Odpowiedzi:

42

Z kilku ważnych powodów

  1. jest napisany w Rubim (patrz http://github.com/ruby/ruby/tree/trunk/lib/webrick )
  2. Edytowany nie ma wielu funkcji, których zwykle potrzebuje strona produkcyjna, takich jak wielu pracowników (w szczególności pre-forking, zarządzanie cyklem życia, obsługa asynchroniczna itp.), Przekierowania, przepisywanie itp.

Kiedy wspominam o przekierowaniach / przepisaniach, mam na myśli fakt, że używając Webrick, musisz obsługiwać przeróbki na innej warstwie (Rack, Sinatra, Rails, niestandardowy kod Webrick, itp.). Wymaga to uruchomienia dodatkowych "handlerów" ruby, aby wykonać przepisany kod. W przypadku witryny o małym natężeniu ruchu może to być w porządku, ponieważ wstępnie rozgrzane procesy mogą już nic nie robić. Jednak w przypadku witryny o większym natężeniu ruchu jest to dodatkowe obciążenie serwera ze względu na coś, z czym serwery frontonu (Apache, Nginx itp.) Mogą sobie poradzić bez uruchamiania Ruby * i prawdopodobnie szybciej o rząd wielkości.

* na przykład, jeśli korzystasz z modułu równoważenia obciążenia, możesz skierować cały ruch związany z przepisywaniem do serwera, na którym nie ma zainstalowanego języka Ruby, i pozwolić głównym serwerom zarządzać tylko ruchem podstawowym. Ten ruch związany z przepisywaniem może wynikać ze zmian w witrynie pod kątem SEO lub czegoś podobnego. Innym przypadkiem byłaby strona, która ma wiele komponentów, a być może jedna sekcja to Rails, druga to PHP, a ponowne zapisanie jest potrzebne dla obu (tj. Przepisanie starych ścieżek PHP na Rails)

Jim Deville
źródło
Czy nie jest możliwe użycie delayed_job do obsługi wielu pracowników na Heroku, niezależnie od używanego serwera?
Vlad
Tak, delayed_job nie ma związku z Webrick, chyba że twoje zadania używają interfejsów API Webrick (co, szczerze mówiąc, pachnie kodem, gdy się łączy).
Jim Deville
Mam na myśli przekierowania poza stosem Ruby. Podobnie jak przekierowania w stylu mod_rewrite. Technicznie rzecz biorąc, możesz przekierować do Rack lub Rails, a może nawet Webrick (mogę się mylić), ale to wymaga uruchomienia ruby, który jest stosunkowo wolny w porównaniu z Apache lub Nginx
Jim Deville
1
@JimDeville - Unicorn jest również napisane w języku Ruby
Yarin
1
github.com/defunkt/unicorn/tree/master/ext/unicorn_http duża porcja Unicorn jest w C
Jim Deville
4

WEBrick nie radzi sobie również z dłuższymi identyfikatorami URI, jeśli przekroczą 2083 znaków, zobaczysz awarię. Cienki nie ma tych problemów, co czyni go lepszym - już w fazie rozwoju.

Michael Schmitz
źródło
Również Webrick stracił połączenie i automatycznie się wyłączył, gdy z mojego doświadczenia wynika, że ​​tworzę oprogramowanie i kiedy wybrałem WeBRICK w Heroku PaaS, automatyczne wyłączanie jest kompensowane przez dużą prędkość automatycznego włączania (uruchamiane przez automatycznie architekturę Heroku )
Daniel Antonio Nuñez Carhuayo
3

Nie lubię komplikować prostych rzeczy i przedwczesnej optymalizacji. WEBrick może być używany w produkcji, pod warunkiem, że jest to witryna o małym ruchu. Większość aplikacji jest.

Jeśli Twoja witryna robi coś, co wymaga czasu, np. Wysyła e-maile lub generuje pliki PDF, powinieneś uczynić WEBrick wielowątkowym . Chcesz obsługiwać wiele żądań jednocześnie.

Nowaker
źródło
1

W przeszłości miał pewne problemy z bezpieczeństwem, ale wydaje się, że głównym powodem jest to, że jest naprawdę wolny w porównaniu z serwerami przeznaczonymi do produkcji.

Brett Henning
źródło
4
Widziałeś porównanie statystyk? Słyszę też, jak ludzie to mówią (i prawdopodobnie jest to prawda), ale nie mogę znaleźć prawdziwego porównania statystyk w dowolnym miejscu w sieci ...
Vlad,
3
Nie sądzę, aby ktokolwiek naprawdę testował Webrick, ponieważ nie ma to być serwer produkcyjny. Unicorn, Thin lub Passenger są dobrze obsługiwane i znacznie lepsze opcje
Jim Deville
0

Największą słabością webricka działającego w trybie produkcyjnym jest to, że jest to jednowątkowy, jednoprocesowy serwer WWW, co oznacza, że ​​jest w stanie obsłużyć tylko jedno żądanie http na raz.

Artur Beljajev
źródło
Nie jest jednowątkowy. Lub jest w ten sam sposób, w jaki implementowany jest każdy nowoczesny język skryptowy (z GIL). Ale dostęp do baz danych i IO w Webrick są w pełni wielowątkowe.
Lothar