Muss Apache wirklich als Front-End für Glassfish / JBoss / Tomcat ausgeführt werden?

14

Ich bin in erster Linie ein Java-Entwickler, und ich komme zu Ihnen mit einer Frage, die die Kluft zwischen Entwicklern und Sysadmins überbrückt.

Vor Jahren, als es noch eine Neuheit war, Tomcat als App-Server zu betreiben, war es üblich, ihn mit Apache zu versehen. Soweit ich weiß, wurde dies getan, weil:

  1. Java galt als "langsam" und es war hilfreich, dass Apache statischen Inhalt direkt bereitstellt.
  2. Tomcat konnte die Ports 80/443 nur als Root überwachen, was gefährlich war.

Java wird nicht länger als langsam angesehen, und ich bezweifle, dass das Hinzufügen von Apache zum Mix tatsächlich dazu beitragen wird, die Dinge zu beschleunigen.

Was das Port-Problem betrifft, gibt es heutzutage wahrscheinlich einfachere Möglichkeiten, App-Server mit den Ports 80/443 zu verbinden.

Meine Frage ist also: Gibt es in diesen Tagen wirklich Vorteile, wenn Sie Java-Webanwendungen mit Apache konfrontieren? Wenn ja, ist Apache noch der richtige Weg? Soll ich mir Nginx ansehen? Anstelle von Tomcat verwende ich Glassfish, wenn das wichtig ist.

Koffein-Koma
quelle

Antworten:

8

Die meisten Leute werden sagen, dass Sie wegen statischer Dateien etwas brauchen.

Das ist etwas dumm, weil:

  • Sie können Tomcat so konfigurieren, dass es mit APR dasselbe E / A wie Apache verwendet
  • Sie sollten auf jeden Fall ein CDN (Content Delivery Network) verwenden.

Der wahre Grund, warum Sie etwas vor Tomcat / Jetty / JBoss benötigen, um den Lastausgleich und das Failover zu handhaben.

Ich empfehle, dass Sie nicht auf " ... Die Tomcat-Engine ist die Achillesferse der gesamten Ökosphäre ... " hören, da wir alle wissen, dass das nicht stimmt ... Ihre Datenbank und ihr Verbindungspooling werden das sein.

Adam Gent
quelle
Adam, verfolgen Sie mich von StackOverflow zu Serverfault? :-) Ich stimme deiner Antwort zu. Im Nachhinein hätte ich die Frage besser formulieren sollen, um die tatsächliche Situation widerzuspiegeln: Es gibt wirklich sehr wenig statischen Inhalt, da die DB an fast jedem Seitenaufruf beteiligt ist. Zu diesem Zeitpunkt (sehr frühe Startup-Exploration) brauchen wir keinen Lastausgleich, aber mit etwas Glück werden wir ihn in Zukunft brauchen.
Koffein Coma
@Caffeine Coma Ich sitze im selben Boot und es sieht so aus, als würden wir die gleiche Technologie verwenden, daher der Zufall, dass wir uns über Stackexchanges hinweg auf den gleichen Fäden befinden (ich schwöre, ich stalke nicht :)). Übrigens verwenden wir Nginx + Tomcat.
Adam Gent
4

Dies hängt vom Ökosystem Ihrer App ab. In einer Intranet-Umgebung benötigen Sie wahrscheinlich nichts vor Tomcat.

Wenn allein im Internet als öffentlich zugänglicher Dienst, kommt es darauf an. Apache ist nett zu den Modulen, die es wie mod_security bietet. Wenn Sie sich jedoch nicht mit der Konfiguration von Apache (oder ngix) auskennen, können Sie sich aufgrund von Konfigurationsfehlern noch MEHR Angriffen oder Fehlerquellen aussetzen.

Apache im Vordergrund ist praktisch, um Ausfallseiten bereitzustellen, wenn Sie die Webanwendung aktualisieren und auf einen Neustart warten müssen. Wenn die Neustarts jedoch selten oder zeitlich korrekt sind, ist dies ein weiterer Grund, sich für Tomcat als eigenständigen Computer zu entscheiden.

In den Tomcat-FAQ wird auch darüber gesprochen, wobei einige zusätzliche Punkte angesprochen werden: http://wiki.apache.org/tomcat/FAQ/Connectors#Q3

Tim Funk
quelle
1

Apache ist kein guter Kandidat für die Bereitstellung statischer Inhalte, da es sich um mehrere Prozesse handelt. Nginx ist besser geeignet, da es asynchrone E / A zur Verarbeitung von Anforderungen verwendet. Moderne Tomcats können auch asynchrone E / A (NIO in Java-Terminologie) verwenden. Beispielsweise sollten Sie das tomcat-nativePaket in Fedora installieren , damit Tomcat asynchrone E / A verwendet.

Alex
quelle
Ich versorge sowieso nicht viel statischen Inhalt. Meine Frage ist wirklich: Muss ich mich mit einem Apache / Nginx-Frontend beschäftigen oder gehe ich einfach mit reinem Glassfish? Vielen Dank.
Caffeine Coma
Tatsächlich ist das Problem umfassender als nur das Bereitstellen statischer Inhalte. Wenn Ihr Server keine asynchronen E / A-Clients mit langsamen Verbindungen verwendet, werden die Ausführungsthreads des Servers blockiert, bis der Inhalt vollständig verfügbar ist. Ein AIO-basiertes Frontend ist also in jedem Fall von Vorteil. Wie bereits erwähnt, verfügt Tomcat jedoch über AIO-Funktionen. Ich denke, das Standard-Glassfish-Paket enthält bereits eine AIO-Bibliothek, sodass Sie sich wahrscheinlich nicht darum kümmern sollten.
Alex
Apache ist nicht unbedingt Multi-Prozess. mpm worker ist seit einiger Zeit nicht mehr verfügbar. httpd.apache.org/docs/2.2/mod/worker.html und wir verwenden es in einer Produktionsumgebung für einen Multithread-Webserver.
dialt0ne
Nun, Multithread-Apache verwendet immer noch synchrone E / A. Ich sehe keinen großen Unterschied, wenn Threads, die keine Prozesse sind, von langsamen Clients auf einem Socket blockiert werden. Nginx ist als Single-Threaded-Single-Process-Finite-State-Maschine konzipiert (naja, nicht notwendiger Single-Process, die Anzahl der Prozesse sollte auf die Anzahl der CPU-Kerne in einem Multi-Core-System eingestellt sein).
Alex
1

Erstaunlich, einige dieser Antworten: Betreibt einer von Ihnen tatsächlich hochleistungsfähige Websites mit mehreren Ebenen und mehreren Servern, die von Tomcat unterstützt werden? OP, Ihre ursprüngliche Annahme, dass Tomcat nicht "langsam" ist ... wow. Der Tomcat-Motor ist die Achillesferse der gesamten Ökosphäre.

Ja, Sie möchten Apache im Vordergrund haben - es bietet in erster Linie mod_rewrite (haben Sie UrlRewriteFilter bereits in Ihrem Tomcat implementiert?) Sowie die htaccess-Dateien, die den Schutz eines Webservers so wichtig machen. Mit Apache können Sie Tomcat-Knoten dahinter ausgleichen, Ihren statischen Inhalt viel schneller bereitstellen und eine bessere Leistung von Tomcat erzielen, da Sie die Request-Pipe nicht mit Nicht-Java überladen (js / css / html / jpg / etc.) Dinge. Sie können Ihr SSL problemlos bei Apache auslagern (wenn Sie es nicht bei einem Hardware-LB auslagern) und müssen sich nicht einmal mit der als Java-Keystore bezeichneten Travestie befassen. Es gibt einfach so viele Gewinne - Sie können mod_jk auf Ihre Backend-Knoten abstimmen, um zu verhindern, dass Javas armes kleines Gehirn überrannt wird, da es normalerweise keinen massiven Datenverkehr mit einem durchschnittlichen Java-Codierer bewältigt. '

Hüten Sie sich vor jedem, der Ihnen sagt, dass Apache (oder Nginx usw. - aber Apaches Leistung wird Tomcat sowieso übertreffen, so dass es keine Rolle spielt) keine gute Idee vor Tomcat ist.

troyengel
quelle
4
Sie klingen sehr beleidigt.
Koffein Coma
Ich bin nur angewidert, dass die Leute so schlechte Ratschläge zu ServerFault geben.
Troyengel
Hüten Sie sich vor allen, die sich über solche Behauptungen lustig machen. Wenn Ihre Site hauptsächlich dynamisch ist, wird Direct Tomcat schneller sein. Die meisten Websites mit hohem Datenaufkommen verwenden heutzutage CDN (Content Delivery Network) für ihren statischen Inhalt, sodass es keinen Grund gibt, Apache für die Bereitstellung Ihres statischen Inhalts zu verwenden. Davon abgesehen sollten Sie noch etwas für Load Balancing / ssl vor sich haben.
Adam Gent
0

Wenn es bei der Verwendung von Tomcat nur darum geht, Berechtigungen für einen Port ohne Rootberechtigung zu binden, müssen Sie diesen nicht mit Apache httpd versehen. Tomcat wird standardmäßig mit jsvcdem Code ausgeliefert, den Sie kompilieren müssen.

jsvcist ein Java-Service-Wrapper zum Starten von Tomcat als Dienst. Dieser Dienst wird als root gestartet, aber Tomcat wird als normaler Benutzer gestartet. So können Sie Ihren Tomcat an privilegierte Ports binden.

Ich weiß nichts über Glassfish, aber stellen Sie sicher, dass es Lösungen gibt, und wenn nicht, können Sie sicher Portweiterleitungstechniken (iptables, etc ...) verwenden.

Ich denke, die Wahl, einen Anwendungsserver mit einem Webserver (beispielsweise Apache httpd) zu versehen, dient dem Lastenausgleich, dem Clustering oder der Bereitstellung statischer Ressourcen nur mit einem Webserver und dynamischer Ressourcen mit einem Anwendungsserver.

Laurent T
quelle