web-dev-qa-db-fra.com

Pourquoi utiliser Apache Web Server devant Glassfish ou Tomcat?

Est-ce une bonne idée d'utiliser Apache Webserver devant GF ou Tomcat? Cela améliore-t-il les performances/la sécurité?

Ou il n'y a aucune raison d'utiliser Apache Web Server avec GF?

54
Nav

Tiré de http://wiki.Apache.org/Tomcat/FAQ/Connectors#Q

  • Regroupement. En utilisant Apache HTTP comme frontal, vous pouvez laisser Apache HTTP agir comme une porte d'entrée pour votre contenu vers plusieurs instances Apache Tomcat. Si l'un de vos Apache Tomcats échoue, Apache HTTP l'ignore et votre Sysadmin peut dormir toute la nuit. Ce point peut être ignoré si vous utilisez un équilibreur de charge matériel et les capacités de clustering d'Apache Tomcat.
  • Clustering/Sécurité. Vous pouvez également utiliser Apache comme porte d'entrée vers différents Apache Tomcats pour différents espaces de noms d'URL (/ app1 /,/app2 /,/app3/ou hôtes virtuels). Les Apache Tomcats peuvent alors être chacun dans une zone protégée et d'un point de vue sécurité, vous n'avez qu'à vous soucier du serveur HTTP Apache. Essentiellement, Apache devient un serveur proxy intelligent.
  • Sécurité. Ce sujet peut influencer d'une façon ou d'une autre. Java a le gestionnaire de sécurité tandis qu'Apache a une plus grande part d'esprit et plus de trucs en matière de sécurité. Je n'entrerai pas dans les détails, mais laissez Google être votre ami. Selon votre scénario , l'un pourrait être meilleur que l'autre. Mais gardez également à l'esprit que si vous exécutez Apache avec Tomcat - vous avez deux systèmes à défendre, pas un.
  • Modules complémentaires. Ajout sur CGI, Perl, PHP est très naturel pour Apache. C'est plus lent et plus compliqué pour Tomcat. Apache HTTP a également des centaines de modules qui peuvent être branchés à volonté. Apache Tomcat peut ont cette capacité, mais le code n'a pas encore été écrit.
  • Décorateurs! Avec Apache HTTP devant Apache Tomcat, vous pouvez exécuter n'importe quel nombre de décorateurs qu'Apache Tomcat ne prend pas en charge ou n'a pas le support de code immédiat. Par exemple, mod_headers, mod_rewrite et mod_alias pourraient être écrits pour Apache Tomcat, mais pourquoi réinventer la roue alors qu'Apache HTTP l'a si bien fait?
  • La vitesse. Apache HTTP offre un contenu statique plus rapide que Apache Tomcat. Mais à moins d'avoir un site très fréquenté, ce point est inutile. Mais dans certains scénarios, Apache Tomcat peut être plus rapide que Apache httpd. Alors comparez VOTRE site. Apache Tomcat peut fonctionner à des vitesses httpd lors de l'utilisation du connecteur approprié (APR avec sendFile activé). La vitesse ne doit pas être considérée comme un facteur lors du choix entre Apache httpd et Tomcat
  • Manipulation des prises/stabilité du système. Apache HTTP a une meilleure gestion des sockets en ce qui concerne les conditions d'erreur qu'Apache Tomcat. La raison principale est qu'Apache Tomcat doit effectuer toute sa gestion de socket via la JVM qui doit être multiplateforme. Le problème est que l'optimisation des sockets est une épreuve spécifique à la plate-forme. La plupart du temps, le code Java Java est correct, mais lorsque vous êtes également bombardé de connexions abandonnées, de paquets invalides, de demandes invalides d'adresses IP invalides, Apache HTTP fait un meilleur travail pour supprimer ces conditions d'erreur que Programme basé sur JVM. (YMMV)
67
Amir Raminfar

Puisque tout le monde vous a donné des raisons de mettre Apache devant Tomcat, laissez-moi vous donner quelques raisons pour lesquelles ne pas :

  • Le connecteur AJP ne prend pas en charge et ne prend pas en charge les E/S avancées signifie non Comète , Websockets , etc.
  • Si vous n'utilisez pas AJP, j'ai remarqué qu'il y a une surcharge de proxy assez importante lors de l'utilisation de mod_proxy pour Apache. Donc, si vous recherchez un Apache à faible latence en face, ce ne serait pas bien.
  • Apache a une empreinte assez grande par rapport à Nginx ou Lighttpd etc.

Mettre Apache devant [~ # ~] pas [~ # ~] :

Ce qu'Apache vous donne, c'est plus de plugins et vous permet d'exécuter différentes technologies Web.

Si vous n'avez besoin que de Tomcat, vous seriez mieux placé pour utiliser un HAProxy ou Nginx comme équilibreur de charge.

45
Adam Gent
  • Évolutivité - Comme l'ont souligné Amir et user384706, vous pouvez équilibrer la charge de plusieurs instances de votre application derrière Apache. Cela vous permettra de gérer plus de volume et d'augmenter la stabilité au cas où l'une de vos instances tomberait en panne.

  • Sécurité - Apache, Tomcat et Glassfish prennent tous en charge SSL, mais si vous décidez d'utiliser Apache, c'est probablement là que vous devez le configurer. Si vous souhaitez une protection supplémentaire contre les attaques (DoS, XSS, injection SQL, etc.), vous pouvez installer le pare-feu d'application Web mod_security .

  • Fonctionnalités supplémentaires - Apache a un tas de modules Nice disponibles pour la réécriture d'URL, l'interfaçage avec d'autres langages de programmation, l'authentification et une tonne d'autres choses.

  • Performances - Si vous avez beaucoup de contenu statique, le servir avec Apache améliorera vos performances. Si la plupart de votre contenu est dynamique, l'utilisation de Tomcat ou Glassfish seul sera tout aussi rapide (probablement plus rapide).(comme le soulignent les réponses à cette question , ce n'est plus vrai.)

8
dbyrne

Une des raisons pour placer Apache devant Tomcat serait pour l'équilibrage de charge.
Les requêtes atteignent le serveur Apache en avant et sont distribuées au backend Tomcat conteneurs selon la charge et la disponibilité.
Les clients ne connaissent qu'une seule IP (Apache) mais les demandes sont réparties sur plusieurs conteneurs.
C'est donc dans le cas où vous déployez une sorte d'application Web distribuée et que vous en avez besoin robuste.
Si votre question concerne une application Web simple, voir la réponse de dbyrne

1
Cratylus

Si vous exécutez une pile LAMP, vous pouvez exécuter des trucs PHP/Ruby depuis Apache et transmettre des trucs Java à Tomcat avec mod_jk.

0
stixn