czy naprawdę konieczne jest uruchomienie Apache jako interfejsu do Glassfish / JBoss / Tomcat?

14

Jestem przede wszystkim programistą Java i przychodzę do ciebie z pytaniem, które łączy przepaść między programistami i administratorami.

Wiele lat temu, kiedy nowością było uruchamianie Tomcat jako serwera aplikacji, zwykle stosowano go w Apache. Jak rozumiem, zrobiono to, ponieważ:

  1. Java została uznana za „powolną” i pomocne było bezpośrednie udostępnianie przez Apache zawartości statycznej.
  2. Tomcat nie mógł nasłuchiwać portów 80/443, chyba że działałby jako root, co było niebezpieczne.

Java nie jest już uważana za powolną i wątpię, aby dodanie Apache do tego miksu faktycznie przyspieszyło.

Jeśli chodzi o problem z portami, obecnie prawdopodobnie istnieją prostsze sposoby łączenia serwerów aplikacji z portami 80/443.

Więc moje pytanie brzmi - czy naprawdę jest jakaś korzyść z przestawiania Java Webapps na Apache? Jeśli tak, to czy Apache wciąż jest do zrobienia? Czy powinienem spojrzeć na Nginx? Zamiast Tomcat używam Glassfish, jeśli to ma znaczenie.

Śpiączka kofeinowa
źródło

Odpowiedzi:

8

Większość ludzi mówi, że potrzebujesz czegoś z przodu z powodu plików statycznych.

Jest to trochę głupie, ponieważ:

  • Możesz skonfigurować Tomcat, aby używał tego samego We / Wy jako apache z APR
  • Tak czy inaczej powinieneś korzystać z sieci CDN (Content Delivery Network).

Prawdziwy powód, dla którego potrzebujesz czegoś przed tomcat / jetty / jboss, aby uzyskać równoważenie obciążenia i obsługę trybu failover.

Polecam, aby nie słuchać „ ... Silnik Tomcat jest piętą achillesową całej ekosfery ... ”, ponieważ wszyscy wiemy, że to nieprawda ... twoja baza danych i pula połączeń będą takie.

Adam Gent
źródło
Adam, prześladujesz mnie od StackOverflow do Serverfault? :-) Zgadzam się z twoją odpowiedzią. Z perspektywy czasu powinienem był sformułować to pytanie lepiej, aby odzwierciedlić rzeczywistą sytuację: naprawdę niewiele jest statycznych treści do omówienia, ponieważ DB bierze udział w prawie każdym wyświetleniu strony. W tej chwili (bardzo wczesne badanie uruchamiania) nie potrzebujemy równoważenia obciążenia, ale przy odrobinie szczęścia będziemy go potrzebować w przyszłości.
Caffeine Coma
@Caffeine Coma Jestem na tej samej łodzi i wygląda na to, że używamy tej samej technologii, stąd nieoczekiwany kontakt z tymi samymi wątkami na Stackexchanges (przysięgam, że nie prześladuję :)). BTW używamy Nginx + Tomcat.
Adam Gent
5

To zależy od ekosystemu wokół Twojej aplikacji. W środowisku intranetowym - prawdopodobnie nie potrzebujesz niczego przed Tomcat.

Jeśli sam w Internecie jako usługa publiczna, to zależy. Apache jest fajny, ponieważ zapewnia moduły, takie jak mod_security. Ale jeśli nie znasz się na konfiguracji apache (lub ngix) - możesz narazić się na WIĘCEJ ataków lub punktów awarii z powodu błędnej konfiguracji.

Apache z przodu przydaje się do wyświetlania stron wyłączających w przypadkach, gdy musisz zaktualizować aplikację internetową i poczekać na ponowne uruchomienie. Ale jeśli ponowne uruchomienia są rzadkie lub są ustawione w odpowiednim czasie - to kolejny powód, aby przejść do Tomcat samodzielnie.

Tomcat FAQ również o tym mówi, co dotyczy kilku dodatkowych punktów: http://wiki.apache.org/tomcat/FAQ/Connectors#Q3

Tim Funk
źródło
1

Apache nie jest dobrym kandydatem do udostępniania treści statycznych ze względu na jego wieloprocesowy charakter. Nginx lepiej pasuje, ponieważ wykorzystuje asynchroniczne operacje we / wy do przetwarzania żądań. Nowoczesne Tomcats mogą również wykorzystywać asynchroniczne operacje we / wy (NIO w terminologii Java). Na przykład powinieneś zainstalować tomcat-nativepakiet w Fedorze, aby Tomcat używał asynchronicznego We / Wy.

Alex
źródło
Zresztą tak naprawdę nie podam zbyt wiele statycznych treści. Moje pytanie jest naprawdę: czy muszę zawracać sobie głowę interfejsem Apache / Nginx, czy po prostu wybrać proste Glassfish? Dzięki.
Caffeine Coma
W rzeczywistości problem jest szerszy niż tylko serwowanie treści statycznych, ponieważ jeśli serwer nie używa asynchronicznych klientów we / wy z powolnymi połączeniami, zablokuje wątki wykonania serwera, dopóki zawartość nie zostanie w pełni wypełniona. Tak więc posiadanie frontendu opartego na AIO jest zaletą w każdym przypadku. Ale, jak już wspomniałem, Tomcat ma możliwości AIO. Myślę, że zapasowy pakiet Glassfish zawiera już bibliotekę AIO, więc prawdopodobnie nie powinieneś się tym przejmować.
Alex
apache niekoniecznie musi być wieloprocesowy. Pracownik mpm był przez jakiś czas niedostępny httpd.apache.org/docs/2.2/mod/worker.html, a my używamy w środowisku produkcyjnym wielowątkowego serwera WWW.
dialt0ne
Cóż, wielowątkowy serwer Apache nadal używa synchronicznych operacji we / wy. Nie widzę dużej różnicy, czy wątki, które nie przetwarzają procesów, będą blokowane w gnieździe przez powolnych klientów. Nginx jest zaprojektowany jako jednowątkowy jednoprocesowy automat stanów skończonych (cóż, niepotrzebny jednoprocesowy, liczba procesów powinna być ustawiona na liczbę rdzeni procesora w systemie wielordzeniowym).
Alex
1

Niesamowite, niektóre z tych odpowiedzi - czy któryś z was faktycznie prowadzi wysokowydajne, wielopoziomowe i wspierane przez wiele serwerów strony Tomcat? OP, twoje oryginalne przypuszczenie, że Tomcat nie jest „wolny” ... wow. Silnik Tomcat to pięta achillesowa całej ekosfery.

Tak, chcesz Apache z przodu - zapewnia on przede wszystkim mod_rewrite (czy już zaimplementowałeś UrlRewriteFilter w swoim Tomcat?), A także pliki htaccess, które sprawiają, że ochrona serwera WWW jest tak ważna. Apache umożliwia ładowanie równoważących węzłów Tomcat za nim, szybsze dostarczanie zawartości statycznej i uzyskanie lepszej wydajności z Tomcat, ponieważ nie przeciążasz potoku żądań innymi niż Java (js / css / html / jpg / etc.) rzeczy Możesz z łatwością rozładować swój SSL w Apache (jeśli nie odciążasz sprzętowego LB) z łatwością i nawet nie musisz radzić sobie z tą parodią zwaną Java Keystore. Jest tyle zwycięstw - możesz dostroić mod_jk do swoich węzłów zaplecza, aby nie dopuścić do przekroczenia słabego mózgu Javy, ponieważ zazwyczaj nie jest w stanie obsłużyć ogromnego ruchu za pomocą przeciętnego programisty Java ”

Uważaj na każdego, kto powie ci, że Apache (lub nginx itp. - ale wydajność Apache'a i tak przewyższy Tomcata, więc to nie ma znaczenia) nie jest dobrym pomysłem przed Tomcat.


źródło
4
Brzmisz bardzo obrażony.
Caffeine Coma
Po prostu zniesmaczony, że ludzie oferują tak złe porady na temat ServerFault.
Uważajcie na każdego, kto narzeka na jakiekolwiek roszczenia bez żadnych liczb. Jeśli Twoja strona jest w większości dynamiczna, bezpośredni tomcat będzie szybszy. Obecnie większość witryn o dużym natężeniu ruchu używa CDN (sieci dostarczania treści) ze względu na ich zawartość statyczną, więc nie ma powodu, aby używać Apache do obsługi treści statycznych. Biorąc to pod uwagę, nadal powinieneś mieć coś do przodu w zakresie równoważenia obciążenia / ssl.
Adam Gent
0

Jeśli jest to tylko kwestia powiązania portu uprawnień bez konieczności rootowania podczas korzystania z Tomcat, nie trzeba go przestawiać za pomocą Apache httpd. Tomcat domyślnie jest dostarczany z jsvctym, co musisz skompilować.

jsvcto opakowanie usługi Java do uruchamiania usługi Tomcat jako usługi. Ta usługa zaczyna się jako root, ale uruchamia Tomcat jako zwykły użytkownik. Możesz więc powiązać urządzenie Tomcat z uprzywilejowanymi portami.

Nie wiem o Glassfish, ale upewnij się, że istnieją rozwiązania, a jeśli nie, z pewnością możesz użyć technik przekierowania portów (iptables itp.)

Myślę, że wybór frontowania serwera aplikacji za pomocą serwera WWW (na przykład Apache httpd) dotyczy równoważenia obciążenia, klastrowania lub udostępniania zasobów statycznych tylko za pomocą serwera WWW i zasobów dynamicznych za pomocą serwera aplikacji.

Laurent T.
źródło