é 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.

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, 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


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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.