Tomcat 8 no se iniciará después de la instalación inicial

18

Estoy tratando de instalar Tomcat en una nueva máquina virtual CentOS 7. Instalé con éxito Apache httpd, y puedo obtener la página de prueba de Apache cuando escribo la dirección IP de la máquina virtual en un navegador web en otra computadora en la red. Pero recibo el siguiente mensaje de error cuando escribo systemctl start tomcat:

Job for tomcat.service failed. See 'systemctl status tomcat.service' and 'journalctl -xn' for details.  

Aquí está el historial completo de comandos en la instalación de java y tomcat:

Primero comencé instalando Java usando las instrucciones de este tutorial porque las instrucciones de Tomcat (segundo bloque a continuación) querían que usara OpenJDK, y necesito usar Java real:

//Install Java
# cd /opt/
# yum install wget
# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.tar.gz"

# tar xzf jdk-8u60-linux-x64.tar.gz

# cd /opt/jdk1.8.0_60/
# alternatives --install /usr/bin/java java /opt/jdk1.8.0_60/bin/java 2
# alternatives --config java
(Select the version you want)
# alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_60/bin/jar 2
# alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_60/bin/javac 2
# alternatives --set jar /opt/jdk1.8.0_60/bin/jar
# alternatives --set javac /opt/jdk1.8.0_60/bin/javac
# java -version (checks to see you install correct version)
# export JAVA_HOME=/opt/jdk1.8.0_60
# export JRE_HOME=/opt/jdk1.8.0_60/jre
# export PATH=$PATH:/opt/jdk1.8.0_60/bin:/opt/jdk1.8.0_60/jre/bin

Tenga en cuenta que el tutorial anterior no explica cómo colocar las variables de entorno /etc/environment, por lo que me detuve antes de ese comando.

Los siguientes comandos son de este otro tutorial . Comencé en el punto después de instalar Java:

//Install Tomcat
Login as sudo user, not root.
# sudo groupadd tomcat
# sudo useradd -M -s /bin/nologin -g tomcat -d /opt/tomcat tomcat
# cd ~
# wget http://mirrors.gigenet.com/apache/tomcat/tomcat-8/v8.0.27/bin/apache-tomcat-8.0.27.tar.gz
# sudo mkdir /opt/tomcat
# sudo tar xvf apache-tomcat-8*tar.gz -C /opt/tomcat --strip-components=1
# cd /opt/tomcat
# sudo chgrp -R tomcat conf
# sudo chmod g+rwx conf
# sudo chmod g+r conf/*
# sudo chown -R tomcat work/ temp/ logs/
# sudo vi /etc/systemd/system/tomcat.service
Cut and paste the following file contents:
##################################################
# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/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=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target
##################################################
# sudo systemctl daemon-reload

# sudo systemctl start tomcat
Job for tomcat.service failed. See 'systemctl status tomcat.service' and 'journalctl -xn' for details.
# sudo systemctl start tomcat.service

El trabajo para tomcat.service falló. Consulte 'systemctl status tomcat.service' y 'journalctl -xn' para más detalles. # sudo systemctl enable tomcat.service ln -s '/etc/systemd/system/tomcat.service' '/etc/systemd/system/multi-user.target.wants/tomcat.service' # sudo systemctl enable tomcat

# sudo systemctl status tomcat.service
tomcat.service - Apache Tomcat Web Application Container
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled)
   Active: failed (Result: exit-code) since Tue 2015-10-13 11:05:31 PDT; 47s ago

Oct 13 11:05:31 localhost.localdomain kill[20887]: -q, --queue <sig>      use sigqueue(2) rather than kill(2)
Oct 13 11:05:31 localhost.localdomain kill[20887]: -p, --pid              print pids without signaling them
Oct 13 11:05:31 localhost.localdomain kill[20887]: -l, --list [=<signal>] list signal names, or convert one to a name
Oct 13 11:05:31 localhost.localdomain kill[20887]: -L, --table            list signal names and numbers
Oct 13 11:05:31 localhost.localdomain kill[20887]: -h, --help     display this help and exit
Oct 13 11:05:31 localhost.localdomain kill[20887]: -V, --version  output version information and exit
Oct 13 11:05:31 localhost.localdomain kill[20887]: For more details see kill(1).
Oct 13 11:05:31 localhost.localdomain systemd[1]: tomcat.service: control process exited, code=exited status=1
Oct 13 11:05:31 localhost.localdomain systemd[1]: Failed to start Apache Tomcat Web Application Container.
Oct 13 11:05:31 localhost.localdomain systemd[1]: Unit tomcat.service entered failed state.

Hacer una yum localinstallactualización de jdk rpm, como se sugiere en esta otra publicación , no funcionó.


EDICIONES:


Según la sugerencia de @ Bram, cambié el archivo de configuración a lo siguiente, pero sigo recibiendo el mismo error:

# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/opt/jdk1.8.0_60
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=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

Además, según el comentario de @ JeffSchaller en el chat, pude hacer que tomcat se iniciara de forma nativa de la siguiente manera:

[user@localhost tomcat]$ sudo /opt/tomcat/bin/startup.sh
Using CATALINA_BASE: /opt/tomcat
Using CATALINA_HOME: /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME: /
Using CLASSPATH: /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
Tomcat started.
[user@localhost tomcat]$

Así, el problema en este PO parece estar relacionado con la configuración systemd. ¿Cómo puedo arreglarlo?

CodeMed
fuente
Cualquier error en el archivo de registro Tomcat? Si no recuerdo mal, el archivo se llama catalina.out o algo así.
Bram
Tomcat registros después de sudo systemctl start tomcat.serviceun montón de errores de permiso denegado que tienen cientos de líneas.
CodeMed

Respuestas:

16

Tuve el mismo problema, lo solucioné por:

  1. Tomcat dar la propiedad de usuario de todo el tomcatdirectorio:

    cd /opt && sudo chown -R tomcat tomcat/
    
  2. y comentando debajo de la línea en /etc/systemd/system/tomcat.service:

    Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
    
usuario2968675
fuente
1
¿Es seguro hacer que Tomcat sea el propietario de toda la carpeta? ¿Pensé que queríamos restringir el acceso tanto como sea posible?
user3203425
No tengo esta configuración para probar ahora, pero creo que el problema estaba en: "sudo chown -R tomcat work / temp / logs /". Yo diría que también necesita la propiedad de "bin /" al menos.
user2968675
Paso 1 solo lo hizo por mí, parece. ¿Qué hace exactamente la línea del paso 2?
Kimberly W
Tienes razón, el paso 1 es suficiente para solucionar este problema en particular. El paso 2 establece el tamaño de almacenamiento dinámico de Java y el tipo de recolección de basura. Lo necesitaba debido a las propiedades de mi entorno, pero la mayoría de la gente probablemente no lo hará.
usuario2968675
en mi caso solo cd /opt && sudo chown -R tomcat tomcat/funcionó. Porque cambié el propietario a usuario del sistema y olvidé volver a tomar Tomcat como propietario
imdzeeshan
2

Dado que instaló Java en una ubicación no deshabilitada, debe decirle a tomcat dónde encontrarlo.

En el archivo de la unidad informados JAVA_HOME se establece en / usr / lib / jvm / jre pero en la sección acerca de la instalación de Java JAVA_HOME es /opt/jdk1.8.0_60.

Si configura JAVA_HOME en el archivo de unidad systemcat de tomcat, creo que funcionará.

También el archivo unidad especifica Tomcat usuario. Pero cuando se inicia manualmente se inicia como root. El problema es probable que los intentos Tomcat para abrir un puerto privilegiado. ¿Se inicia la secuencia de comandos de inicio de Tomcat como root? ¿O se inicia procesos Tomcat como usuario? Eliminar el usuario y el grupo del archivo de la unidad debería desencadenar el mismo comportamiento de su intento de línea de comando.

Bram
fuente
Cómo corregir el siguiente error: El trabajo para tomcat8.service falló porque el proceso de control salió con el código de error. Consulte "systemctl status tomcat8.service" y "journalctl -xe" para más detalles. invoke-rc.d: tomcat8 initscript, la acción "Inicio" ha fallado. -> sudo nano / etc / default / tomcat8 -> Establecer JAVA_HOME JAVA_HOME = / usr / lib / jvm / java-8-oracle -> gist.github.com/alexislucena/89a046dc747123faf4496fb946c1fe79
Combine
1

Según los mensajes de error, creo que el problema proviene de ExecStop=/bin/kill -15 $MAINPIDdonde la variable no se reemplaza. De acuerdo con la documentación del servicio $MAINPIDse espera solo para el ExecReloadcomando. La pregunta sigue siendo: ¿por qué ExecStopse ejecuta cuando se activa start?

Es posible systemddirectorio de trabajo hojas proceso de JVM como /que no pueda ser pertinente para las aplicaciones implementadas.

Propongo que se mueve CATALINA_OPTSy JAVA_OPTSen /opt/tomcat/bin/setenv.shguión y pruebe primero con una configuración tan sencilla:

[Unit]
Description=Apache Tomcat
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/java/default
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat

WorkingDirectory=/opt/tomcat

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

User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

En cualquier caso, por favor informe journalctl -xny logs/catalina.outcontenido

Yves Martin
fuente