Instalación, configuración e despregamento de aplicacións web en Apache Tomcat 10

De MediaWiki
Ir a la navegación Ir a la búsqueda
Apache-tomcat-banner.JPG

Sumario

Introdución

O servidor Apache Tomcat é un contenedor de servlets de código aberto baseado en Java creado para executar aplicacións web con servlets e JavaServer Pages (JSP).

Servlet
Módulo escrito en Java que serve para extender as capacidades dun servidor web agregando funcionalidades a este.

E importante ter en conta que as versións de Apache Tomcat están asociadas a distintas tecnoloxías e versións das mesmas. Podes consultar esa relación actualizada.

No momento de elaborar este artigo, as dúas últimas versions de apache:

Versións de Tomcat e compatibilidade coas tecnoloxías
Tomcat version Java version Servlet spec JSP spec
11.0.x 17 e posterior 6.1 4.0
10.1.X 11 e posterior 6.0 3.1

Que é Apache Tomcat?

Apache Tomcat funciona como unha ponte entre os servidores web e as aplicacións Java. É un contedor de servlets de código aberto que permite executar aplicacións web en Java de maneira eficiente.

Función principal

Pensa en Tomcat como un motor especializado para aplicacións Java. Mentres que os servidores web convencionais manexan contidos estáticos como imaxes ou ficheiros HTML, Tomcat procesa servlets Java e páxinas JavaServer Pages (JSP) para crear contido web dinámico. Ofrece o entorno de execución necesario para que as túas aplicacións Java xestionen solicitudes web e xeren respostas.

Componentes clave

A arquitectura de Tomcat inclúe:

  • Catalina: o contedor de servlets que procesa as túas aplicacións Java.
  • Coyote: o conector HTTP que xestiona as solicitudes web.
  • Jasper: o motor JSP que converte as túas páxinas en servlets.

Por que elixir Tomcat?

Como servidor de aplicacións de código aberto, Tomcat ofrece:

  • Rendemento lixeiro que non sobrecarga os teus recursos.
  • Funcións de seguridade integradas para as túas aplicacións.
  • Excelente soporte da comunidade.
  • Fácil integración con outros servidores web.

Funcións clave de Apache Tomcat

Apache Tomcat vén equipado con capacidades que o fan unha opción popular para aloxar aplicacións Java en servidores HTTP Apache. Vexamos as súas características máis importantes.

Capacidades principais

  • Procesamento de servlets: Xestiona eficazmente solicitudes e respostas web, permitindo procesar múltiples solicitudes de xeito simultáneo.
  • Compatibilidade con JSP: Procesamento integrado de páxinas JavaServer Pages (JSP) para crear contido dinámico con facilidade.
  • Conector HTTP: O conector Coyote xestiona as conexións HTTP entrantes e ofrece:
  • Xestión eficiente de solicitudes.
  • Agrupamento de conexións.
  • Melloras de protocolo.
  • Cifrado SSL/TLS para Tomcat.

Funcións de desenvolvemento

  • Despregamento en quente: Permite despregar ficheiros WAR sen reiniciar o servidor.
  • Xestión de recursos: Xestiona eficientemente os recursos da JVM, como:
  • Agrupamento de conexións.
  • Xestión de memoria.
  • Optimización de fíos de execución.
  • Xestión de sesións.

Preparado para empresas

Tomcat inclúe funcións para aplicacións empresariais:

  • Soporte para clustering.
  • Reinos de seguridade para autenticación.
  • Capacidades de aloxamento virtual.
  • Rexistro e monitorización extensivos.

Apache Tomcat fronte a outros servidores de aplicacións Java

Comprender como Tomcat se compara con alternativas pode axudarche a confirmar que estás a usar a ferramenta axeitada para as túas necesidades. Vexamos como se compara Tomcat con outras opcións populares.

Comparación de servidores de aplicacións Java

Característica Tomcat JBoss/WildFly GlassFish Jetty
Tempo de inicio Rápido Máis lento Medio Moi rápido
Uso de memoria Lixeiro Elevado Medio Lixeiro
Configuración Sinxela Complexa Media Sinxela
Compatibilidade completa con JEE Non Si Si Non
Curva de aprendizaxe Baixa Alta Media Baixa

Cando escoller Tomcat

Tomcat é máis axeitado cando necesitas:

  • Un contedor de servlets lixeiro.
  • Tempos de inicio rápidos.
  • Un proceso de despregamento sinxelo.
  • Baixos requisitos de memoria.
  • Soporte básico para aplicacións web en Java.

Cando considerar alternativas

Deberías considerar outras opcións cando precises:

  • Funcións completas de Java Enterprise Edition (JEE).
  • Clustering integrado.
  • Ferramentas avanzadas de xestión.
  • Interfaces de administración a nivel empresarial.

Requisitos previos para instalar Apache Tomcat

Antes de instalar, asegúrate de ter todo o necesario para un proceso de configuración do servidor sen problemas.

Requisitos do sistema

  • Hardware:
  • 2 GB de RAM mínimo para desenvolvemento; 4 GB ou máis para produción.
  • Espazo libre en disco: mínimo 1 GB.
  • Procesador: 1 núcleo mínimo, recomendados 2.
  • Sistema operativo:
  • Linux (recomendado para servidores).
  • Windows Server.
  • macOS (principalmente para desenvolvemento).

Requisitos de software

  • Contorna Java:
  • Necesítase un JDK ou JRE (versión 8 ou máis recente).
  • Configurar a variable de entorno JAVA_HOME.
  • Dispoñibilidade de Java no PATH do sistema.
  • Requisitos de rede:
  • Portos necesarios: 8080 (HTTP), 8443 (HTTPS), 8005 (comandos de apagado), 8009 (AJP).
  • Ferramentas adicionais recomendables:
  • Un editor de texto para ficheiros de configuración (vim, nano, notepad,...) .
  • Ferramentas para xestionar ficheiros WAR (IDEs).
  • Ferramentas de monitorización para contornas de produción.

Instalación

En Linux

Prerrequitos: Java e apertura do porto

Neste caso levarase a cabo a instalación en Debian 10 dun Tomcat 9 e OpenJDK 11.

Poderíase instalar JRE de non contar con el:

apt install default-jre

Para coñecer versión de Java instalada e ruta:

update-java-alternatives -l
INTERESANTE. 
Tes información detallada para instalar e configurar as diferentes versións de java

E sempre será preciso abrir o porto 8080 (porto por defecto de tomcat) do firewall e recargar regras:

ufw allow 8080
ufw reload

Instalación con binarios

É aconsellable facer a instalación cun usuario propio e non o root por cuestions de seguridade. Podemos seguir estes pasos: groupadd tomcat useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat

Co último parámetro ese usuario tomcat non poderá executar consola con shell, estará no grupo tomcat.

 mkdir /opt/tomcat
 cd /opt/tomcat
 wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz
 tar xzvf apache-tomcat-9.0.65.tar.gz -C /opt/tomcat --strip-components=1
 rm apache-tomcat-9.0.65.tar.gz
 cd /opt/tomcat
 chgrp -R tomcat /opt/tomcat
 chmod -R g+r conf
 chmod -R g+x conf 
 chown -R tomcat webapps/ temp/ work/ logs/

Arrancaremos el servicio al inicio

sudo nano /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

Reiniciamos el demonio:

systemctl daemon-reload

Le indicamos que ya arranque tomcat:

systemctl start tomcat

Y comprobamos ha arrancado correctamente:

systemctl status tomcat

Instalación con apt install

Esta opción é menos recomendable, coma aquí se sinala:

These packages work fine and are easy to install for a normal single-instance case, but they make it more difficult for more specific use cases, and more difficult for people on the Tomcat User mailing list to help you. That is because each of these packages distributes the files of Tomcat in different places on the disk, sets different environment variables, sets different links from one directory to the other in the filesystem, etc.. Moreover, some of those packages are notably outdated.

So it would be better to install a "standard" tomcat downloaded from the website https://tomcat.apache.org/, to some directory like /opt/tomcat, and follow the instructions that are given in the "RUNNING.txt" file.

En todo caso, os pasos serían máis sinxelos. A instalación:

apt install tomcat9 tomcat9-admin tomcat9-docs tomcat9-user tomcat9-examples
  • tomcat9-docs: este paquete inclúe unha aplicación web que permite navegar na documentación de Tomcat 9
  • tomcat9-examples: este paquete inclúe unha aplicación web que permite acceder a exemplos de Tomcat 9 Servlet e JSP
  • tomcat9-admin: este paquete instala dúas aplicacións web que poden axudar a manexar a instancia de Tomcat.
    • o manager webapp
    • o host-manager webapp

Na miña instalación, feita nun VPS contratado por min:

Para acceder o manager webabb é o host-manager, debemos dar pemisos:

cd /opt/tomcat/conf
nano tomcat-users.xml

Nalgunhas distros esta ruta será outra:

cd /etc/tomcat9/
nano tomcat-users.xml

En calquera caso engadir esta liña o ficheiro, gardar, e reiniciar tomcat:

<user username="useradmin" password="useradmin" roles="admin-gui,manager-gui,manager-status"/>

Reiniciamos o servizo:

systemctl restart tomcat

En Windows

É prerrequisito ter a JDK instalada (nuhna versión de JDK compatible coa de Tomcat).

E configurar a variable de entorno, por interfaz gráfica, facendo clic no botón dereito en sistema, e chegando a opción coma se ve na captura:

JAVA_HOME variable de entoron

Ou comando powershell:

[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-18.0.2", "Machine")

Neste caso levarase a cabo a instalación nun Windows 10 Home, con JDK 18.0.2 e Tomcat 10.0.23.

Por sinxelez descargarei e executarei o ficheiro de tomcat Windows Service Installer, porque así guiaranos un asistente.

Con docker

Se non está instalado docker:

sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker

Facer pull da imaxe:

# Pull official Tomcat image
docker pull tomcat:9.0

Correr o contenedor con mapeo de portos:

# Run container with port mapping
docker run -d \
    --name tomcat \
    -p 8080:8080 \
    -v tomcat-data:/usr/local/tomcat/webapps \
    tomcat:9.0

Verificar o estado do contenedor:

# Check if container is running
docker ps

# View container logs
docker logs tomcat

# Access container shell
docker exec -it tomcat bash

Postinstalación: validación e troubleshooting de posibles erros

Configurar e arrancar o servizo

Crear un ficheiro de servizo systemd(Linux):

sudo nano /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Type=forking
User=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk"
Environment="CATALINA_HOME=/opt/tomcat"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

Arrancar o servizo correctamente:

# Linux
sudo systemctl start tomcat

# Windows
net start tomcat9
Check Service Status
sudo systemctl status tomcat

Verificar acceso web

Comprobando cun navegador:

Erros frecuentes na instalación

  • Port 8080 already in use: Comproba se o porto está en uso, e de ser así cambia o porto no ficheiro server.xml
  • # Check if ports are already in use
  • sudo netstat -tulpn | grep LISTEN
  • Java not found: Verifica java está instalado e a variable de entorno JAVA_HOME
  • # Verify Java installation
  • java -version
  • Permission denied: Comproba permisos do directorio
  • Servizo non arranca: Comproba logs en /var/log/tomcat
  • # Check Tomcat logs
  • tail -f /opt/tomcat/logs/catalina.out

Outros erros

  • Cuestións de memoria: Se Tomcat para inesperadamete, pode ser que esté agotando a memoria
  • # Check memory usage
  • ps aux | grep tomcat
  • # Review garbage collection logs
  • tail -f /opt/tomcat/logs/gc.log
  • Cuestións de rendemento: con tempos de resposta lentos pode ser:
  • Uso elevado da memoria
  • Demasiadas conexións concurrentes
  • Consultas (queries) contra a base de datos non optimizadas
  • Tamaño do pool de fíos insufciente
  • # Check system resources
  • top -u tomcat
  • # View active connections
  • netstat -an | grep 8080 | wc -l
  • Erros de aplicación: Algúns erros e a sua solución
  • 404 Errors: Revisa a ruta de despregamento e de contexto
  • 503 Errors: Revisa o agotamento de recursos
  • ClassNotFound: Verifica que as librerías se atopan en WEB-INF/lib
  • Cuestións relacionadas coa memoria
  • # Check Tomcat's memory usage
  • ps aux | grep tomcat
  • Erros relacionados con permisos
  • # View current permissions
  • ls -l /opt/tomcat/webapps/your-application
  • # Fix permissions if needed
  • chown -R tomcat:tomcat /opt/tomcat/webapps/your-application

Creación dun virtual host

Despregamento dunha aplicación web

Estrutura das aplicacións a despregar

As aplicacións despregadas seguen esta estrutura:

/webapps/
    └── your-application/
        ├── WEB-INF/
        │   ├── web.xml
        │   ├── classes/
        │   └── lib/
        └── resources/

Alternativas para despregamento

Hai varios xeitos de despregar unha aplicacion web en Tomcat.

Colleremos un dos exemplos que facilita a documentación de tomcat, un Hello World:

E seguiremos algunha das alternativas:

Detallaremos dous dos máis comúns.

Despregamento co Application Manager

Coma se ve na imaxe, facer deploy cargando o ficheiro a través do manager, e acceder a mesma:

Para usar a aplicación Manager, requírese configurar o acceso en tomcat-users.xml:

<tomcat-users>
    <role rolename="manager-gui"/>
    <user username="admin" password="secure_password" roles="manager-gui"/>
</tomcat-users>

E acceder co navegador a http://your-server:8080/manager/html

Desde a interface gráfica poderemos:

  • Subir e despregar ficheiros WAR
  • Arrancar e parar aplicacións
  • Ver o estado dos despregamentos
  • Monitorizar recursos

Despregamento en quente copiando na ruta webapps

O xeito máis habitual para os administradores e empregando ficheiros WAR files copiadas na ruta webapps:

# Copy WAR file to webapps directory
cp sample.war /opt/tomcat/webapps/

# Watch deployment in logs
tail -f /opt/tomcat/logs/catalina.out

E para un container docker:

sudo docker cp /home/osboxes/Desktop/sample.war tomcat:/usr/local/tomcat/webapps/ ”

Por defecto Tomcat automaticadamente desempaqueta e desga os ficheiros WAR localizados na ruta webapps.

Esa despregamento "en quente" e como ter una tenda aberta 24 por 7; alta disponibilidade xa que podes actualizar as aplicacións sen ter que reiniciar o servidor. A configuración realizase no ficheiro server.xml:

<Host name="localhost" appBase="webapps"
      unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" 
           directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="%h %l %u %t "%r" %s %b" />
</Host>

Para contornas en produción:

  • unpackWARs=”true”: Dille a Tomcat que descomprima os paquetes da aplicación automáticamente
  • autoDeploy=”true”: Vixía na procura de novas aplicacións ou actualizacións e as instala automáticamente

Para aplicacións de negocio críticas, pode ser recomendable deixar autodeploy en false para manter mais control sobre as actualizacións.es.

Securizando o teu servidor Tomcat

A seguridade non é opcional ao executar aplicacións web. A continuación, detállanse algúns pasos esenciais para mellorar a seguridade en Apache Tomcat.

Eliminar aplicacións predeterminadas

Primeiro, elimina as aplicacións predeterminadas innecesarias:

cd $CATALINA_HOME/webapps 
rm -rf docs examples manager host-manager ROOT

Pensa nisto como eliminar chaves de reposto escondidas baixo o felpudo: menos puntos de entrada significan mellor seguridade.

Protexer a interface de xestión

Crea credenciais seguras para a interface de xestión no ficheiro tomcat-users.xml:

<tomcat-users>
    <role rolename="manager-gui"/>
    <role rolename="admin-gui"/>
    <user username="admin" 
          password="your_strong_password_here" 
          roles="manager-gui,admin-gui"/>
</tomcat-users>

Configurar o acceso remoto

Limita o acceso ao xestor a enderezos IP específicos en context.xml:

<Context antiResourceLocking="false">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
           allow="127\.0\.0\.1|192\.168\.1\.*"/>
</Context>

Configuración de SSL/TLS

Habilita HTTPS para cifrar a transmisión de datos:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                     type="RSA" />
    </SSLHostConfig>
</Connector>

Pensa en SSL como enviar cartas en sobres selados en lugar de postais: mantén os teus datos privados durante a transmisión.

INTERESANTE.
Tes unha guía con información detallada de SSL e como xestionar os certificados.

En contornas de desenvolvmento, podes empregar certificados autoasinados:

Cabeceiras de seguridade

Engade cabeceiras de seguridade en web.xml para protexerte contra vulnerabilidades web comúns:

<filter>
    <filter-name>httpHeaderSecurity</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
</filter>

Configuración de Apache Tomcat para un rendemento óptimo

Optimizemos a túa instalación de Tomcat para xestionar aplicacións web de forma eficiente. Pensa nisto como axustar un coche: pequenos cambios poden marcar unha gran diferenza no rendemento.

Configuración da memoria

Así como o teu ordenador necesita suficiente RAM para funcionar ben, Tomcat precisa dunha asignación axeitada de memoria. Configúrase nos ficheiros catalina.sh ou setenv.sh:

export CATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx1024m -XX:MaxPermSize=256m"

O significado destas opcións:

Xms
Memoria inicial (como o nivel mínimo de combustible).
Xmx
Memoria máxima (a capacidade total do depósito).
MaxPermSize
Espazo para clases de Java (o espazo de traballo do motor).

Para aplicacións pequenas ou medianas, comezar con 512MB e permitir o crecemento ata 1GB funciona ben.

Optimización do grupo de fíos (Thread Pool)

Os fíos son como traballadores de servizo: necesitas suficientes para xestionar solicitudes, pero non tantos que interfiran uns cos outros.

Modifica o ficheiro server.xml:

<Connector port="8080" protocol="HTTP/1.1"
           maxThreads="400"
           minSpareThreads="25"
           maxSpareThreads="75"
           acceptCount="100"
           connectionTimeout="20000"
           enableLookups="false" />

Que controlan estas configuracións:

maxThreads
Número máximo de usuarios simultáneos (como as caixas dun supermercado).
minSpareThreads
Traballadores sempre dispoñibles para respostas rápidas.
acceptCount
Lonxitude da cola antes de rexeitar novas solicitudes.
connectionTimeout
Tempo de espera antes de pechar conexións inactivas.

Configuración de compresión

Igual que comprimir ficheiros antes de envialos por correo electrónico, Tomcat pode comprimir datos para aforrar ancho de banda:

<Connector port="8080" protocol="HTTP/1.1"
           compression="on"
           compressionMinSize="2048"
           compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript" />

Isto axuda ao teu servidor a enviar información máis rápido, especialmente útil para usuarios con conexións máis lentas.

Configuración da caché

A caché é como ter elementos frecuentemente usados ao alcance da man, en vez de ir ao almacén cada vez:

<Context>
    <Resources cachingAllowed="true" cacheMaxSize="100000" />
</Context>

Isto indica a Tomcat que manteña dispoñibles ficheiros frecuentemente accedidos, acelerando os tempos de resposta para os usuarios.

Mellores prácticas para xestionar Apache Tomcat

Para manter o teu servidor funcionando de forma óptima, segue estas prácticas recomendadas para a xestión de Tomcat:

Mantemento regular

  • Actualizar regularmente: Mantén actualizadas as versións de Tomcat e Java para garantir a seguridade e o rendemento.
  • Monitorizar rexistros: Configura a rotación de rexistros e revísaos periodicamente para detectar problemas.
  • Realizar copias de seguridade: Programa copias de seguridade regulares da configuración de Tomcat e das túas aplicacións.

Configuración do contexto

Pensa no ficheiro context.xml como o arquivo de configuración específico da túa aplicación. Nel almacénase información importante, como conexións á base de datos e configuracións específicas do entorno:

<Context>
    <!-- Configuración da conexión á base de datos -->
    <Environment name="dbUrl" 
                 value="jdbc:mysql://localhost:3306/mydb"
                 type="java.lang.String" override="false"/>
</Context>

Este enfoque axuda a manter a configuración organizada e facilita a actualización dos parámetros sen necesidade de modificar o código da aplicación.

Axuste de rendemento

  • Optimizar a JVM: Axusta os parámetros de memoria en función das necesidades da túa aplicación e dos recursos do servidor.
  • Usar agrupamento de conexións: Implementa pools de conexións á base de datos para mellorar a eficiencia.
  • Habilitar caché: Utiliza os mecanismos de caché de Tomcat para contido estático.

E convinte realizar probas de carga con ferramentas coma Apache JMeter ou AB Apache Benchmark

Mellores prácticas de seguridade

  • Usar HTTPS: Sempre cifra o tráfico entre os clientes e o teu servidor.
  • Implementar controis de acceso: Restrinxe o acceso ás aplicacións Manager e Host Manager.
  • Mantelo simple: Elimina aplicacións e servizos innecesarios para reducir o espazo de ataque.
INTERESANTE.
Podes atopar ferrmamentas para monitorizar e testear a seguridade

Monitorización e alertas

  • Configurar a monitorización: Usa ferramentas como JavaMelody ou New Relic para seguir as métricas de rendemento do servidor Tomcat.
  • Configurar alertas: Establece notificacións para eventos críticos, como uso elevado de memoria ou erros nas aplicacións.

Ao seguir estas prácticas, manterás un entorno Tomcat robusto, seguro e eficiente para as túas aplicacións.

Ampliación

Referencias

Instalación

Despregamento dunha app

Troubleshooting