Este artigo explora os fundamentos do Apache Tomcat, um servidor de aplicações web de código aberto amplamente utilizado. Abordaremos sua arquitetura, procedimentos de implantação, configuração de hosts virtuais e parâmetros essenciais para otimização do desempenho.
Arquitetura e Componentes Principais
O Tomcat é um servidor leve para aplicações Java, servindo como um contêiner para Java Servlet e JSP (JavaServer Pages). Embora seja capaz de servir conteúdo estático, seu desempenho nessa tarefa é inferior a servidores web especializados como Nginx ou Apache HTTP Server.
A sua estrutura é baseada em componentes modulares. Os três principais são:
- Web Container: Implementa a funcionalidade de um servidor web.
- Servlet Container (Catalina): Responsável por carregar, instanciar e executar o código Servlet.
- JSP Container (Jasper): Converte páginas JSP em código Servlet compilado.
Um Servlet é uma classse Java que estende as capacidades de um servidor, processando requisições e gerando respostas dinâmicas. A tecnologia JSP permite criar conteúdo dinâmico inserindo código Java em páginas HTML usando tags especiais (<% ... %>).
No topo da hierarquia do Tomcat está o componente Server, que representa a instância completa do servidor. Dentro dele, um ou mais Services encapsulam a funcionalidade. Cada Service é composto por um ou mais Connectors (que gerenciam conexões de rede) e um único Container (que processa a lógica da aplicação).
O Container principal, chamado Engine, gerencia os Hosts (hosts virtuais). Cada Host pode hospedar múltiplos Contexts, que representam aplicações web individuais. Dentro de cada Context, múltiplos Wrappers encapsulam as definições e instâncias dos Servlets individuais.
O fluxo de uma requisição segue este caminho: uma requisição é recebida pelo Connector, que a encaminha ao Engine. O Engine roteia a requisição para o Host e Context apropriados, que, por sua vez, delega o processamento ao Wrapper do Servlet correspondente. A resposta segue o caminho inverso de volta ao cliente.
Procedimentos de Implantação
A instalação do Tomcat requer um Java Development Kit (JDK) previamente configurado. O processo básico inclui as seguintes etapas:
- Preparar o ambiente: Desativar temporariamente firewalls e módulos de segurança como o SELinux.
- Instalra o JDK: Utilizando o gerenciador de pacotes da distribuição Linux.
- Configurar variáveis de ambiente: Definir
JAVA_HOME,CLASSPATHe adicionar o diretóriobindo JDK aoPATH. - Instalar o Tomcat: Descompactar o arquivo de distribuição do Tomcat e movê-lo para um diretório apropriado, como
/usr/local/tomcat. - Iniciar o serviço: Executar o script
startup.shlocalizado no diretóriobindo Tomcat.
Para validar a instalação do JDK, pode-se compilar e executar um programa simples. O código abaixo demonstra um teste mínimo:
public class TesteAmbiente {
public static void main(String[] args) {
System.out.println("Ambiente JDK configurado com sucesso.");
}
}
Compilando e executando:
javac TesteAmbiente.java
java TesteAmbiente
O primeiro inicialização do Tomcat pode ser lenta. Uma otimização comum é alterar a fonte de entropia no arquivo de configuração de segurança do JDK (java.security), trocando file:/dev/random por file:/dev/urandom.
Configuração de Hosts Virtuais
Para hospedar múltiplos domínios ou aplicações em uma única instância do Tomcat, configura-se hosts virtuais. O exemplo abaixo demonstra como configurar dois domínios distintos:
- Criar diretórios de aplicação distintos para cada host virtual dentro de
webapps. - Editar o arquivo de configuração principal
conf/server.xml, adicionando elementos<Host>dentro do<Engine>.
Exemplo de configuração no server.xml:
<Host name="app.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context docBase="/caminho/para/app1" path="" reloadable="true" />
</Host>
<Host name="blog.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context docBase="/caminho/para/app2" path="" reloadable="true" />
</Host>
Após a configuração, é necessário reiniciar o Tomcat e garantir que os registros DNS ou o arquivo /etc/hosts local apontem os nomes de domínio para o endereço IP do servidor.
Otimização de Parâmetros
A configuração padrão do Tomcat é voltada para desenvolvimento e não para produção. Ajustes são necessários para alcançar estabilidade e desempenho. As otimizações envolvem parâmetros do sistema operacional, do JVM e do conector HTTP do Tomcat.
Parâmetros importantes a serem ajustados no conector HTTP definido em server.xml incluem:
- maxThreads: Número máximo de threads que o conector pode criar para processar requisições. O padrão (200) pode ser insuficiente para cargas altas.
- acceptCount: Tamanho da fila de requisições quando todas as threads estão ocupadas. Requisições acima desse limite são rejeitadas.
- connectionTimeout: Tempo de espera (em milissegundos) para uma conexão ser estabelecida após ser aceita.
- enableLookups: Se definido como
true, força uma consulta DNS reversa para cada conexão, o que é custoso. Em produção, deve serfalse. - compression: Ativa a compressão GZIP das respostas para reduzir o uso de banda.
Um exemplo de configuração otimizada do conector:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="400"
minSpareThreads="25"
acceptCount="300"
enableLookups="false"
compression="on"
compressionMinSize="1024"
compressableMimeType="text/html,text/xml,text/plain,text/css"
URIEncoding="UTF-8" />
Esta configuração aumanta a capacidade de processamento concorrente, desativa consultas DNS desnecessárias e habilita a compressão para reduzir o tamanho das respostas.