Este guia detalha o processo de atualização do Apache Tomcat para ultima versão (9.0.87) em um ambiente Red Hat Enterprise Linux (RHEL) 9.4 (Plow), abordando desafios específicos encontrados em julho de 2025. A motivação para este artigo surgiu de falhas de memória na área survival da JVM em aplicações Java críticas, que causavam travamentos mesmo com poucos usuários conectados.
Escolhemos o Tomcat para hospedar o ORDS/APEX e outras aplicações em java.
Após algumas inciativas como atualização do Java 8 para o Java 21 e monitoramento constante via jstat, o memory leak persistia. O suporte da Red Hat recomendou atualizar o Tomcat para uma versão mantida nos repositórios AppStream.
1. Pré-requisitos
Antes de iniciar, verifique as seguintes condições:
- Sistema operacional: RHEL 9.4 com repositórios AppStream configurados (recomenda-se o uso do
dnf
). - Permissões de superusuário (
sudo
). - JDK instalado e atualizado, compatível com a versão do Tomcat (mínimo Java 8 para Tomcat 9).
2. Preparação do Ambiente
2.1. Backup da Instalação Atual
Realize um backup completo da instalação do Tomcat, preservando permissões, links simbólicos e metadados:
sudo cp -rp --preserve=all /opt/tomcat /backup_path/tomcat/ -v
Nota: A opção
--preserve=all
mantém links simbólicos, proprietários, grupos e permissões.
2.2. Remoção de Versões Antigas
Remova pacotes e arquivos residuais do Tomcat:
sudo dnf remove 'tomcat*' -y
sudo rm -f /etc/systemd/system/tomcat.service
Confirme a remoção completa:
rpm -ql tomcat | less
sudo ls -lha /etc/tomcat/
sudo ls -lha /usr/share/tomcat/
3. Instalação do Tomcat 9 via AppStream
3.1. Atualização e Instalação
Atualize o sistema e instale o Tomcat e seus módulos:
sudo dnf update -y
sudo dnf install tomcat tomcat-webapps tomcat-admin-webapps -y
3.2. Ativação do Serviço
Habilite e inicie o serviço do Tomcat:
sudo systemctl enable --now tomcat
sudo systemctl daemon-reload
3.3. Configuração do Firewall
Libere a porta 8080, se necessário:
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
4. Estrutura de Diretórios
A tabela abaixo compara os caminhos do Tomcat instalado via AppStream com a instalação clássica:
Categoria | Caminho (AppStream - RHEL) | Caminho (Clássico) |
---|---|---|
Configuração | /etc/tomcat |
[TOMCAT_HOME]/conf |
Aplicações | /var/lib/tomcat/webapps |
[TOMCAT_HOME]/webapps |
Logs | /var/log/tomcat |
[TOMCAT_HOME]/logs |
Binários | /usr/share/tomcat |
[TOMCAT_HOME]/bin |
5. Configurações e Deploy de Aplicações
5.1. Restauração de Configurações
Faça backup do arquivo de configuração padrão e restaure configurações anteriores:
sudo mv /etc/tomcat/tomcat-users.xml /etc/tomcat/tomcat-users.xml.bkp
sudo cp /backup_path/tomcat/conf/tomcat-users.xml /etc/tomcat/tomcat-users.xml
sudo cp /backup_path/tomcat/webapps/manager/META-INF/context.xml /usr/share/tomcat/webapps/manager/META-INF/context.xml
5.2. Deploy de Aplicações
Copie os arquivos .war
e configurações de contexto do backup:
sudo cp /backup_path/tomcat/webapps/*.war /usr/share/tomcat/webapps/
sudo cp /backup_path/tomcat/conf/Catalina/localhost/*.xml /etc/tomcat/Catalina/localhost/
sudo chown root:tomcat /usr/share/tomcat/webapps/*.war
sudo chmod 644 /usr/share/tomcat/webapps/*.war
sudo chown root:tomcat /etc/tomcat/Catalina/localhost/*.xml
sudo chmod 644 /etc/tomcat/Catalina/localhost/*.xml
5.3. Reiniciar o Tomcat
Atualize e reinicie o serviço:
sudo systemctl daemon-reload
sudo systemctl restart tomcat
6. Ajustes de Memória (CATALINA_OPTS)
6.1. Recomendações Iniciais
Existe uma calculadora que a Redhat oferta para o auxilio da configuração dos parâmetros da JVM muito interessante:
Este aplicativo permite especificar vários parâmetros para o ambiente e a JVM específicos, gerando opções otimizadas para a JVM. Ele também explica por que cada opção é gerada e fornece um link para a base de conhecimento da Red Hat para problemas e soluções conhecidos.
E neste artigo há um bom conteúdo para a compressão da alocação de Memória da JVM
6.2. Configuração do Systemd
Edite o override do serviço Tomcat:
sudo systemctl edit tomcat
Adicione o seguinte conteúdo:
[Service]
Environment="CATALINA_OPTS=
-Xms20G -Xmx20G -server \
-XX:+UseG1GC \
-XX:+ExplicitGCInvokesConcurrent \
-XX:MaxGCPauseMillis=500 \
-Xlog:gc*:file=/var/log/tomcat/gc.log:time,uptime,level,tags:filecount=5,filesize=10M \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/"
ou assim
[Service]
Environment="CATALINA_OPTS=-Xms20G -Xmx20G -server -XX:+UseG1GC -XX:+ExplicitGCInvokesConcurrent -XX:MaxGCPauseMillis=500 -Xlog:gc*:file=/var/log/tomcat/gc.log:time,uptime,level,tags:filecount=5,filesize=10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/"
Nota: Se houver problemas com o formato (ocorre na hora do start do tomcat), dependendo da sua paciencia em acertar a diagramação correta, escolha a segunda opção.
6.3. Permissões de Logs
Ajuste as permissões do diretório de logs:
sudo chown -R tomcat:tomcat /var/log/tomcat
sudo chmod 750 /var/log/tomcat
6.4. Reiniciar e Validar
Reinicie e verifique o serviço:
sudo systemctl restart tomcat
sudo systemctl status tomcat --no-pager
sudo systemctl show tomcat | grep CATALINA_OPTS
Por que usar
--no-pager
?
- Exibe a saída completa no terminal.
- Facilita redirecionamento ou processamento por outros comandos.
- Evita travamentos em scripts automatizados.
6.5. Escolha do Garbage Collector
Evite conflitos entre coletores de lixo. Escolha apenas um:
- Para G1GC (recomendado para Java recente):
-XX:+UseG1GC
- Para ParallelGC:
-XX:+UseParallelGC
7. Problemas com Bibliotecas (commons-dbcp)
7.1. Contexto do Problema
Algumas aplicações falharam no deploy devido à ausência da biblioteca commons-dbcp
. A Red Hat empacota o Tomcat de forma minimalista, excluindo bibliotecas legadas como commons-dbcp 1.4
.
Confirme a indisponibilidade:
sudo dnf search dbcp
7.2. Solução: Instalação Manual
Passo 1: Criar Diretório Temporário
mkdir -p ~/downloads/missing_libs_dnf_tomcat/
cd ~/downloads/missing_libs_dnf_tomcat/
Passo 2: Baixar Bibliotecas
wget https://archive.apache.org/dist/commons/dbcp/binaries/commons-dbcp-1.4-bin.zip
wget https://archive.apache.org/dist/commons/pool/binaries/commons-pool-1.6-bin.zip
Passo 3: Descompactar e Copiar
unzip commons-dbcp-1.4-bin.zip
unzip commons-pool-1.6-bin.zip
sudo cp commons-dbcp-1.4/commons-dbcp-1.4.jar /usr/share/tomcat/lib/
sudo cp commons-pool-1.6/commons-pool-1.6.jar /usr/share/tomcat/lib/
Passo 4: Ajustar catalina.properties
(Opcional)
Se houver erros de JNDI, comente a linha referente ao DataSource.Factory
:
sudo vi /etc/tomcat/catalina.properties
Localize e comente:
#javax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory
Passo 5: Reiniciar o Tomcat
sudo systemctl restart tomcat
Conclusão
Este guia documenta a solução para falhas de memória na JVM em um ambiente RHEL 9.4, resolvidas pela atualização do Java e do Tomcat 9 via AppStream. O processo incluiu backup, remoção de versões antigas, instalação, configuração de memória e resolução de problemas com bibliotecas legadas. Esperamos que este conteúdo, registrado em julho de 2025, auxilie outros profissionais enfrentando desafios semelhantes.
Por Tarcisio Freitas
Oracle DBA, Oracle APEX Architect, Senior APEX Developer.
English version:
https://dev.to/tarcisiogf/updating-apache-tomcat-on-rhel-via-appstream-challenges-and-solutions-28d0
header_image/credit:https://www.novoshore.com/2025/01/28/ords-24-4-http-removal