Servidor web Apache e Tomcat: Execução de várias aplicações Web tomcat e da aplicação apache webserver ao mesmo tempo

3

Nós temos um servidor Debian X64 que atualmente tem uma instância de tomcat onde temos 3 webapps em WAR file ofcourse. Além disso, temos um servidor web Apache, que possui um sistema CMS em execução. E um projeto final é o Maintenance webapp, que é mostrado quando estamos trabalhando no servidor e o serviço não está disponível.

Os problemas que enfrentamos são:

  1. Apenas um servidor web Tomcat ou Apache está sendo executado ativamente na porta 80 o tempo todo.
  2. Para os aplicativos do Tomcat, os aplicativos precisam ser acessados por seus caminhos de contexto que são diferentes.
  3. Não podemos executar tudo em vários nomes de domínio, mas em um único servidor.

O que estou tentando fazer em longo prazo:

  1. Use o Tomcat (preferido) ou o servidor da Web Apache como um balanceador de carga, que transmitirá solicitações com base em nomes de domínio. Portanto, se alguém estiver chamando url www.xyz.com , deverá invocar o XYZ webapp que temos. O mesmo nome de webapp e nome de domínio é puramente coincidente.
  2. Vincule o Maintenance webapp à grade inteira, que será chamada quando qualquer domínio não estiver ativo ou não estiver respondendo ou ocupado.

Eu criei uma imagem (uma horrível .. :-(), que explica a tarefa um pouco mais ilustrativa.

Como você pode ver agora na arquitetura, aqui estão minhas perguntas.

  1. Essa é uma boa abordagem? Se não, gentilmente me diga onde e o que eu posso fazer melhor.
  2. A tarefa que estou tentando fazer, como é chamado? Grid-config, balanceamento de carga?
  3. Como vincular todos os aplicativos da Web, sites juntos, que podem ser encaminhados por meio de URLs diferentes, mas apontará para o aplicativo ou site da Web correto.
  4. Tenho uma boa compreensão do Apache tomcat e da administração do Linux, não tanto do servidor web Apache. Alguém pode me ajudar em como proceder com este problema, algum planejamento e o que eu exigiria, para que eu possa executá-lo.

Por favor, note que temos nomes de domínio registrados no DNS para todos os webapps e websites baseados no site.

Espero ter adicionado informações suficientes, se houver algo necessário, por favor me avise. Qualquer ajuda seria boa. Muito obrigado. : -)

    
por We are Borg 03.12.2015 / 14:48

2 respostas

2

Eu finalmente consegui resolver esse problema alterando-o para a seguinte configuração:

server.xml do Tomcat:

 <Connector port="8080" proxyPort="80" redirectPort="443" protocol="HTTP/1.1" compression="force" compressionMinSize="1024" 
               connectionTimeout="20000"  maxPostSize="5242880"
               URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"/>


 <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"  maxPostSize="5242880" SSLEnabled="true" maxThreads="200" compr$
              compressionMinSize="1024" scheme="https" secure="true" clientAuth="false"  sslProtocol="TLS"
               keystoreFile="keystore.jks" keystorePass="PASSWORD" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"/>

  <Connector port="8010" protocol="AJP/1.3" redirectPort="80" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
/>
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat">
   // Multiple webapps hosted
    </Engine>

Adicionado no jk.conf:

<IfModule jk_module>
        JkWorkersFile   /PATH/to/workers.properties
        JkLogFile       /var/log/apache2/mod_jk.log
        JkLogLevel      notice
        JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
        JkOptions       +ForwardURIProxy
        JkMountFile     /path/to/uriworkermap.properties
</IfModule>

workers.properties:

 worker.list = worker_app1
worker.worker_app1.type = lb
worker.worker_app1.balance_workers = app1_instance1
worker.worker_app1.sticky_session = true
worker.worker_app1.sticky_session_force = false
worker.worker_app1.method = busyness

worker.app1_instance1.type = ajp13
worker.app1_instance1.host = 127.0.0.1
worker.app1_instance1.port = 8010
worker.app1_instance1.host = localhost
worker.app1_instance1.lbfactor = 1
worker.app1_instance1.socket_timeout = 40
worker.app1_instance1.socket_keepalive = true
worker.app1_instance1.reply_timeout = 30000

uriworkermap.properties:

/|/* = worker_app1;

Adicionou isto a 000-default in sites-enabled

// This is the tomcat domain. 
<VirtualHost *:80>
ServerName www.domain_tomcat_webapp.de
ServerAlias domain_tomcat_webapp.de
ProxyRequests on
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

<Location / >
Order allow,deny
Allow from all
</Location>
</VirtualHost>

E é isso. Eu então iniciei o tomcat e reiniciei o servidor web Apache, ele funciona agora.

    
por 08.12.2015 / 09:31
3

Considerando que você tem apenas um IP e um servidor, gostaria de:

Coloque uma instância do apache Listening na porta 80 com hospedagem virtual baseada em nome (como você tem apenas um IP, cuidado com eventuais problemas SSL se você planeja usar HTTPS, confira aqui: link )

Então você terá um host virtual para cada subdomínio, digamos que seu domínio seja example.com, você terá:

www.app1.com
[...]
www.appN.com

cms.example.com
maintenance.example.com

No host virtual que gerencia os subdomínios do aplicativo, você pode configurar um proxy reverso, seja com mod_jk, mod_proxy_ajp ou mod_proxy_http, como desejar. Eu escolheria mod_jk para o tomcat.

Com isso, você tem seus 3 problemas cobertos.

Isso também cobre seu primeiro plano de longo prazo, pelo segundo:

Tie up the Maintenance webapp to the whole grid, which will be called when any domain is not-alive or not responding or busy.

Você pode fazer isso de várias maneiras. Por exemplo, usando uma página de erro personalizada no Apache para erros 500/503 que redireciona para o seu maintenace.example.com. Isso pode ser uma questão de sua própria

Quanto às suas últimas perguntas:

1 Is this a good approach? If not, kindly tell me where and what I can do better.

Acho que também falei disso

2 The task I am trying to do, what is it called? Grid-config, load-balancing?

Virtual Hosting (com eventual balanceamento de carga, veja mais adiante)

3 How to tie all the webapps, websites together which can be referred via different URL's, but will point to the correct webapp or website.

Isso é feito a partir dos hosts virtuais do Apache e do proxy. Você pode até mesmo reescrever para que você não precise usar o caminho do contexto na URL. Isso pode ser uma questão também.

4 I have a good understanding of Apache tomcat and Linux administration , not so much of Apache webserver. Can anyone help me in how to proceed with this problem, some planning and what I would require, so I can execute it.

Acho que também falei disso.

Um sidenote, eu usaria pelo menos dois gatos, mas melhor, dois gatos por app. Pelo menos dois, então você está coberto em caso de tomcat morre. Dois por aplicativo, para que você possa ter seus aplicativos isolados uns dos outros (executando em diferentes JVMs). Isso é muito útil para apontar para um aplicativo específico em caso de problemas ecc.

Espero que isso ajude.

    
por 03.12.2015 / 16:25