é realmente necessário executar o Apache como um front-end para o Glassfish / JBoss / Tomcat?

14

Sou principalmente um desenvolvedor Java e venho até você com uma pergunta que abrange a divisão entre desenvolvedores e administradores de sistemas.

Anos atrás, quando era uma coisa nova executar o Tomcat como um servidor de aplicativos, era costume enfrentá-lo com o Apache. Pelo que entendi, isso foi feito porque:

  1. Java era considerado "lento" e era útil fazer com que o Apache servisse conteúdo estático diretamente.
  2. O Tomcat não podia ouvir as portas 80/443 a menos que executasse como root, o que era perigoso.

O Java não é mais considerado lento, e duvido que adicionar o Apache à mistura realmente ajude a acelerar as coisas.

Quanto à questão das portas, provavelmente existem maneiras mais simples de conectar servidores de aplicativos às portas 80/443 atualmente.

Então, minha pergunta é: existe realmente algum benefício em fazer frente aos Java Webapps com Apache atualmente? Se sim, o Apache ainda é o caminho a percorrer? Devo olhar para o Nginx? Em vez do Tomcat, estou usando o Glassfish, se isso importa.

Coma de cafeína
fonte

Respostas:

8

A maioria das pessoas dirá que você precisa de algo na frente por causa de arquivos estáticos.

Isso é um tanto idiota porque:

  • Você pode configurar o Tomcat para usar o mesmo IO do apache com o APR
  • Você deve estar usando uma CDN (rede de entrega de conteúdo) de qualquer maneira.

O verdadeiro motivo pelo qual você precisa de algo na frente do tomcat / jetty / jboss para equilibrar a carga e lidar com o failover.

Eu recomendo que você não ouça " ... O mecanismo Tomcat é o calcanhar de Aquiles de toda a ecosfera ... ", como todos sabemos que isso não é verdade ... seu banco de dados e seu conjunto de conexões serão esse.

Adam Gent
fonte
Adam, você está me perseguindo do StackOverflow para o Serverfault? :-) Eu concordo com sua resposta. Em retrospecto, eu deveria ter formulado a pergunta melhor para refletir a situação real: há realmente muito pouco conteúdo estático para falar, uma vez que o banco de dados está envolvido em quase qualquer ocorrência de página. No momento (exploração inicial muito inicial), não precisamos de balanceamento de carga, mas, com sorte, precisaremos disso no futuro.
Caffeine Coma
@ Cafeína Coma Estou no mesmo barco e parece que estamos usando a mesma tecnologia, portanto, o acaso de estar nos mesmos segmentos nas Stackexchanges (juro que não estou perseguindo :)). BTW, estamos usando Nginx + Tomcat.
Adam Gent
5

Depende do ecossistema em torno do seu aplicativo. Em um ambiente de intranet - você provavelmente não precisa de nada na frente do Tomcat.

Se estiver sozinho na internet como um serviço público, depende. O Apache é interessante devido aos módulos que ele fornece, como mod_security. Mas se você não tiver conhecimento da configuração do apache (ou ngix) - poderá se expor a MAIS ataques ou pontos de falha devido a erros de configuração.

O Apache na frente é útil para servir páginas indisponíveis nos casos em que você precisa atualizar o aplicativo da Web e aguardar uma reinicialização. Mas se as reinicializações forem raras ou tiverem cronometrado corretamente - é outro motivo para tornar o Tomcat independente.

As perguntas frequentes do Tomcat também falam sobre isso, abordando alguns pontos adicionais: http://wiki.apache.org/tomcat/FAQ/Connectors#Q3

Tim Funk
fonte
1

O Apache não é um bom candidato para veicular conteúdo estático devido à sua natureza de múltiplos processos. O Nginx se adapta melhor, pois usa E / S assíncrona para processar solicitações. Os Tomcats modernos também podem usar E / S assíncrona (NIO na terminologia Java). Por exemplo, você deve instalar o tomcat-nativepacote no Fedora para fazer com que o Tomcat use E / S assíncrona.

Alex
fonte
Na verdade, não estou exibindo muito conteúdo estático. Minha pergunta é realmente: eu preciso me preocupar com um front-end Apache / Nginx ou apenas ir com o Glassfish direto? Obrigado.
Caffeine Coma
Na verdade, o problema é mais amplo do que apenas veicular conteúdo estático, porque se o servidor não usar clientes de E / S assíncronos com conexões lentas, os bloqueios de execução do servidor serão bloqueados até que o conteúdo seja total. Portanto, ter um front-end AIO é um benefício em qualquer caso. Mas, como eu já mencionei, o Tomcat possui recursos de AIO. Eu acho que o pacote Glassfish já inclui a biblioteca AIO, então você provavelmente não deve se preocupar.
21411 Alex
O apache não é necessariamente multiprocesso. O mpm worker está fora do ar há algum tempo httpd.apache.org/docs/2.2/mod/worker.html e estamos usando em um ambiente de produção para um servidor da web com vários threads.
Dialt0ne
Bem, o Apache multithread ainda usa E / S síncrona. Não vejo grande diferença se threads não processos serão bloqueados em um soquete por clientes lentos. O Nginx foi projetado como uma máquina de estado finito de processo único de thread único (bem, não é necessário um processo único; o número de processos deve ser definido como o número de núcleos da CPU em um sistema com vários núcleos).
21411 Alex
1

Surpreendente, algumas dessas respostas - algum de vocês, na verdade, administra sites de alto desempenho com vários níveis e com suporte a vários servidores Tomcat? OP, sua suposição original de que o Tomcat não é "lento" ... uau. O motor Tomcat é o calcanhar de Aquiles de toda a ecosfera.

Sim, você quer o Apache na frente - ele fornece primeiro e acima de tudo o mod_rewrite (você já implementou o UrlRewriteFilter no seu Tomcat?), Bem como os arquivos htaccess que tornam tão importante a proteção de um servidor da web. O Apache pode permitir que você carregue o equilíbrio dos nós do Tomcat por trás dele, atenda seu conteúdo estático muito mais rapidamente e obtenha melhor desempenho do Tomcat porque você não está sobrecarregando seu canal de solicitação com não-Java (js / css / html / jpg / etc.) coisas. Você pode descarregar seu SSL no Apache (se não estiver descarregando em um LB de hardware) com facilidade e nem precisar lidar com esse travesti chamado Java Keystore. Existem tantas vitórias - você pode ajustar o mod_jk aos nós de back-end para evitar a sobrecarga do pobre cérebro do Java, porque normalmente não pode lidar com tráfego maciço com o codificador Java comum '

Cuidado com quem lhe disser que o Apache (ou nginx, etc - mas o desempenho do Apache ofuscará o Tomcat de qualquer maneira, portanto não importa) não é uma boa ideia na frente do Tomcat.


fonte
4
Você parece muito ofendido.
Caffeine Coma
Apenas enojado que as pessoas ofereçam conselhos tão ruins no ServerFault.
Cuidado com quem discute sem números para apoiar essas reivindicações. Se seu site for principalmente dinâmico, o tomcat direto será mais rápido. Atualmente, a maioria dos sites de tráfego pesado usa CDN (rede de entrega de conteúdo) para seu conteúdo estático; portanto, não há motivo para usar o Apache para veicular seu conteúdo estático. Dito isto, você ainda deve ter algo na frente para balanceamento de carga / ssl.
Adam Gent
0

Se for apenas uma questão de vincular privilégios à porta sem ser root ao usar o Tomcat, você não precisará enfrentá-lo com o Apache httpd. Por padrão, o Tomcat é enviado com o jsvcqual você precisa compilar.

jsvcé um wrapper de serviço java para iniciar o Tomcat como um serviço. Este serviço inicia como root, mas inicia o Tomcat como um usuário normal. Portanto, você pode vincular seu Tomcat a portas privilegiadas.

Não conheço o Glassfish, mas tenha certeza de que existem soluções; caso contrário, você certamente pode usar técnicas de encaminhamento de porta (iptables, etc ...)

Eu acho que a escolha de fazer frente a um servidor de aplicativos com um servidor Web (Apache httpd, por exemplo) é para balanceamento de carga, armazenamento em cluster ou servir recursos estáticos apenas com um servidor Web e recursos dinâmicos com um servidor de aplicativos.

Laurent T
fonte