Explicamos cómo montar un servidor web con Apache Tomcat 9 en un equipo con sistema operativo Linux CentOS 7 (Minimal). Mostramos cómo hacer una configuración básica de Tomcat y cómo desplegar alguna aplicación JSP, fichero WAR (Web Application Resource).
Requisitos para montar servidor web con Apache Tomcat 9 sobre Linux CentOS 7
Para poder montar un servidor web (o contenedor de aplicaciones) con Apache Tomcat necesitaremos los siguientes requisitos:
- Un equipo físico o máquina virtual con sistema operativo Linux CentOS 7.
- Usuario y contraseña con permisos suficientes para instalar software en el equipo Linux CentOS.
- Acceso mediante SSH, dado que es una distribución Minimal y no lleva modo gráfico haremos todo el proceso por consola (comandos).
- Para conectarnos al servidor Linux usaremos PuTTY y el protocolo SSH. Por lo tanto deberemos disponer de un equipo que esté en la misma red que el Linux CentOS y que tenga acceso mediante SSH. O bien accederemos directamente a la consola del equipo Linux.
- El equipo Linux CentOS debe tener conexión a Internet (descargaremos los paquetes de instalación de Tomcat, así como otros dependientes).
Antes de iniciar la instalación es recomendable asegurarnos de que tenemos todos los paquetes a la última versión. Esto podemos hacerlo ejecutando el comando:
yum -y update
Instalar Apache Tomcat 9 en Linux CentOS 7
En primer lugar instalaremos algunos paquetes necesarios, como Open JDK. Para ello ejecutaremos el siguiente comando:
yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
Nos solicitará confirmación para descargar e instalar los paquetes, pulsaremos y (yes).
Si el proceso ha concluido correctamente nos lo indicará con «¡Listo!». Ahora podremos ver la versión de java que tenemos instalada, con el comando:
java -versión
Que nos devolverá algo así:
Con el texto:
[root@SRVLINUX~]# java -version
openjdk version «1.8.0_191»
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
Descargamos ahora el paquete que contiene los archivos de Apache Tomcat 9. Para saber la URL lo mejor es visitar la web oficial de Apache Tomcat y buscar la URL de la descarga de la versión que queramos instalar, en nuestro caso la última disponible 9.0.12.
Nos posicionaremos en la carpeta /tmp para realizar la descarga, con el comando:
cd /tmp
Y descargaremos el fichero zip de Apache Tomcat con:
wget http://apache.uvigo.es/tomcat/tomcat-9/v9.0.12/bin/apache-tomcat-9.0.12.zip
(la URL será la que hayamos obtenido de la web oficial de Tomcat para la versión que deseemos)
Descomprimimos el fichero zip con el comando:
unzip apache-tomcat-9.0.12.zip
Nos habrá creado la carpeta /tmp/apache-tomcat-9.0.12. La moveremos a la carpeta /opt con el nombre tomcat:
cd /tmp/apache-tomcat-9.0.12
mv apache-tomcat-9.0.12 /opt/tomcat
De forma que quede la carpeta tomcat dentro de la carpeta /opt:
Añadiremos ahora una variable de entorno (environment variable) llamada CATALINA_HOME, con la carpeta de los ficheros de Apache Tomcat, para ello ejecutaremos el comando:
echo «export CATALINA_HOME=’/opt/tomcat/'» >> ~/.bashrc
Y este otro comando:
source ~/.bashrc
Crearemos un grupo y un usuario que será con el que iniciaremos el demonio de Tomcat, ejecutando los comandos:
groupadd tomcat
useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
Haremos propietario de la carpeta de Tomcat (/opt/tomcat) al grupo tomcat:
chgrp -R tomcat /opt/tomcat
Y estableceremos los permisos particulares por carpetas con los siguientes comandos:
chmod -R g+r /opt/tomcat/conf
chmod g+x /opt/tomcat/conf
chown -R tomcat /opt/tomcat/webapps/ /opt/tomcat/work/ /opt/tomcat/temp/ /opt/tomcat/logs/
Estableceremos los permisos de ejecución para todos los script .sh del directorio bin, para ello ejecutaremos el comando:
chmod +x /opt/tomcat/bin/*.sh
Por último configuraremos el sistema para que arranque el demonio (servicio) de Tomcat cuando arranque el equipo. Para ello crearemos el fichero tomcat.service en la carpeta /etc/systemd/system con el siguiente comando:
nano /etc/systemd/system/tomcat.service
Y el siguiente contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
[Unit] Description=Apache Tomcat 9 After=network.target [Service] Type=forking Environment=JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk/jre 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 |
Guardaremos los cambios en el editor nano pulsando Control + O y cerraremos pulsando Control + X:
Teniendo en cuenta que debe existir la carpeta de Java JRE:
/usr/lib/jvm/java-1.8.0-openjdk/jre
Si la tenemos instalada en otra carpeta deberemos cambiar la ruta en el fichero anterior.
Si no podemos o queremos reiniciar el servidor podremos recargar los servicios del sistema con el comando:
systemctl daemon-reload
Habilitareremos el servicio (demonio) de tomcat para que se cargue en el inicio con el comando:
systemctl enable tomcat
Y lo iniciaremos con el comando:
systemctl start tomcat
Por último, si queremos que haya acceso externo al servidor de aplicaciones web Apache Tomcat deberemos abrir el puerto 8080 (el de defecto de Tomcat) en el cortafuegos de Linux Centos, para ello usaremos los siguientes comandos:
firewall-cmd –permanent –add-port=8080/tcp
firewall-cmd –reload
Si todo el proceso ha sido correcto podremos probar el servidor de aplicaciones web Tomcat abriendo un navegador desde cualquier equipo de la red e introduciendo la URL:
http://IP_Servidor_Tomcat:8080
Cambiando IP_Servidor_Tomcat por la IP o el nombre DNS del equipo con Linux CentOS y Apache Tomcat.
Si todo es correcto mostrará la página de bienvenida de Apache Tomcat:
En la URL http://IP_Servidor_Tomcat:8080/examples/servlets/ podremos comprobar que los ejemplos JSP del servidor Tomcat funcionan correctamente:
Configuración básica de Apache Tomcat 9
Es muy recomendable realizar una configuración básica en Apache Tomcat antes de que sea un servidor de producción. Una de las cosas más importantes es establecer un usuario y contraseña con permisos para acceso a la administración de Tomcat, para ello editaremos el fichero
Añadiremos, antes de la línea </tomcat-users> lo siguiente:
1 2 |
<user username="ges_app" password="0000" roles="manager-gui"/> <user username="admin_tomcat" password="aaaa" roles="admin-script,admin-gui"/> |
Con las líneas anteriores habremos creado dos usuarios, uno para acceso a la consola de administración web de las aplicaciones Tomcat, llamado «ges_app» y con contraseña «0000» y otro administrador con acceso la alplicación host-manager, llamado «admin_tomcat«, con la contraseña «aaaa»:
Guardaremos los cambios con Control + O y cerraremos con Control + X. Los cambios se aplicarán directamente, no es necesario reiniciar el servicio de Tomcat.
Además de crear los usuarios debemos establecer los permisos de acceso a las aplicaciones de gestión de Tomcat. Para establecer los permisos de acceso a la aplicación Gestor de Aplicaciones Web de Tomcat editaremos el fichero /opt/tomcat/webapps/manager/META-INF/context.xml:
nano /opt/tomcat/webapps/manager/META-INF/context.xml
Modificaremos la línea:
<Valve className=»org.apache.catalina.valves.RemoteAddrValve»
allow=»127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1″ />
Que es la que establece los permisos de acceso a la aplicación «manager», y por defecto solo permite el acceso desde el propio equipo local. Si queremos que se pueda acceder desde cualquier equipo de la red cambiaremos allow=»127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1″ por allow=».*»:
<Context antiResourceLocking=»false» privileged=»true» >
<Valve className=»org.apache.catalina.valves.RemoteAddrValve»
allow=».*» />
<Manager sessionAttributeValueClassNameFilter=»java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?$
</Context>
Procederemos de la misma forma para la aplicación:
nano /opt/tomcat/webapps/host-manager/META-INF/context.xml
Editando la misma línea y modificando allow=».*».
Una vez realizados estos cambios reiniciaremos el servicio de Apache Tomcat para que se apliquen:
systemctl restart tomcat
A partir de ahora podremos acceder a las aplicaciónes Manager App y Host Manager con estos dos usuarios:
Nos solicitará usuario y contraseña para acceder (debe tener el rol manager-gui). En el caso de Manager App podremos acceder con el usuario «ges_app«, al que le hemos dado permisos para ello:
Nos mostrará la aplicación Gestor de Aplicaciones Web de Tomcat, desde la que podremos ver el estado de despliegue de las aplicaciones que tenemos instaladas, pararlas, recargarlas, replegarlas y también podremos desplegar nuevas aplicaciones:
Para el caso de Manager host (Gestor de Máquina Virtual de Tomcat) también nos solicitará usuario y contraseña (debe tener los rolesadmin-script y admin-gui), en nuestro caso usaremos «admin_tomcat«:
También podremos comprobar el estado del servidor Tomcat (Server Status):
Desplegar aplicación JSP (fichero WAR) en servidor Apache Tomcat 9
Para desplegar una apliación JSP (fichero WAR), una vez que tengamos compilado el fichero .war de nuestra aplicación accederemos a Manage App y pulsaremos en «Seleccionar archivo» en «Archivo WAR a desplegar»:
Pulsaremos en «Desplegar». Si todo es correcto nos aparecerá la nueva aplicación en la lista de aplicaciones:
Y la tendremos disponible accediendo desde el navegador a la URL asignada:
http://IP_Servidor_Tomcat:8080/HolaMundo
Cómo comprobar estado del servicio de Tomcat y errores típicos
Si al intentar iniciar el servicio de Tomcat con systemctl start tomcat nos devuelve algún error podremos comprobar el detalle del mismo ejecutando:
journalctl -xe
(también se puede obtener información, aunque menos detallada, con systemctl status tomcat).
Un ejemplo de salida de este comando:
— Unit tomcat.service has begun starting up.
oct 24 15:11:31 SRVLINUX systemd[1956]: Failed at step EXEC spawning /opt/tomcat/bin/startup.sh: Permission denied
— Subject: Process /opt/tomcat/bin/startup.sh could not be executed
— Defined-By: systemd
— Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
—
— The process /opt/tomcat/bin/startup.sh could not be executed and failed.
—
— The error number returned by this process is 13.
oct 24 15:11:31 SRVLINUX systemd[1]: tomcat.service: control process exited, code=exited status=203
oct 24 15:11:31 SRVLINUX systemd[1]: Failed to start Apache Tomcat 9.
— Subject: Unit tomcat.service has failed
— Defined-By: systemd
— Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
—
— Unit tomcat.service has failed.
—
— The result is failed.
oct 24 15:11:31 SRVLINUX systemd[1]: Unit tomcat.service entered failed state.
oct 24 15:11:31 SRVLINUX systemd[1]: tomcat.service failed.
Este error suele ser debido a que no hemos establecido los permisos de ejecución al los ficheros .sh de script de la carpeta /bin de Tomcat. Indicamos cómo se establecen estos permisos en el proceso de instalación de Tomcat.
Otro error típico es al intentar acceder a las aplicaciones de administración web de Tomcat:
403 Access Denied
You are not authorized to view this page.
By default the Host Manager is only accessible from a browser running on the same machine as Tomcat. If you wish to modify this restriction, you’ll need to edit the Host Manager’s context.xml file.
If you have already configured the Host Manager application to allow access and you have used your browsers back button, used a saved book-mark or similar then you may have triggered the cross-site request forgery (CSRF) protection that has been enabled for the HTML interface of the Host Manager application. You will need to reset this protection by returning to the main Host Manager page. Once you return to this page, you will be able to continue using the Host Manager application’s HTML interface normally. If you continue to see this access denied message, check that you have the necessary permissions to access this application.
If you have not changed any configuration files, please examine the file conf/tomcat-users.xml in your installation. That file must contain the credentials to let you use this webapp.
For example, to add the admin-gui role to a user named tomcat with a password of s3cret, add the following to the config file listed above.
<role rolename=»admin-gui»/>
<user username=»tomcat» password=»s3cret» roles=»admin-gui»/>
Note that for Tomcat 7 onwards, the roles required to use the host manager application were changed from the single admin role to the following two roles. You will need to assign the role(s) required for the functionality you wish to access.
admin-gui – allows access to the HTML GUI
admin-script – allows access to the text interface
The HTML interface is protected against CSRF but the text interface is not. To maintain the CSRF protection:
Users with the admin-gui role should not be granted the admin-script role.
If the text interface is accessed through a browser (e.g. for testing since this interface is intended for tools not humans) then the browser must be closed afterwards to terminate the session.
En el error, claramente, nos indica que tenemos que configurar el fichero conf/tomcat-users.xml para añadir algún usuario con permisos y también el fichero context.xml de cada aplicación para permitir el acceso desde equipos de la red diferentes al local de Tomcat.
Anexo
- Contenido completo original (por defecto) del fichero /opt/tomcat/webapps/manager/META-INF/context.xml de Apache Tomcat 9:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <Context antiResourceLocking="false" privileged="true" > <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?$ </Context> |
- Contenido completo original (por defecto) del fichero /opt/tomcat/conf/tomcat-users.xml de Apache Tomcat 9:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <tomcat-users xmlns="http://tomcat.apache.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd" version="1.0"> <!-- NOTE: By default, no user is included in the "manager-gui" role required to operate the "/manager/html" web application. If you wish to use this app, you must define such a user - the username and password are arbitrary. It is strongly recommended that you do NOT use one of the users in the commented out section below since they are intended for use with the examples web application. --> <!-- NOTE: The sample user and role entries below are intended for use with the examples web application. They are wrapped in a comment and thus are ignored when reading this file. If you wish to configure these users for use with the examples web application, do not forget to remove the <!.. ..> that surrounds them. You will also need to set the passwords to something appropriate. --> <role rolename="tomcat"/> <role rolename="role1"/> <user username="tomcat" password="<must-be-changed>" roles="tomcat"/> <user username="both" password="<must-be-changed>" roles="tomcat,role1"/> <user username="role1" password="<must-be-changed>" roles="role1"/> </tomcat-users> |
- Contenido completo original (por defecto) del fichero /opt/tomcat/webapps/host-manager/META-INF/context.xml de Apache Tomcat 9:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <Context antiResourceLocking="false" privileged="true" > <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?$ </Context> |