tomcat 8 nie uruchomi się po pierwszej instalacji

18

Próbuję zainstalować tomcat na nowej maszynie wirtualnej CentOS 7. Pomyślnie zainstalowałem apache httpd i jestem w stanie uzyskać stronę testową apache, gdy wpisuję ip maszyny wirtualnej do przeglądarki internetowej na innym komputerze w sieci. Ale podczas pisania pojawia się następujący komunikat o błędzie systemctl start tomcat:

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

Oto pełna historia poleceń w instalacji Java i Tomcat:

Najpierw zacząłem od zainstalowania Java przy użyciu instrukcji z tego samouczka, ponieważ instrukcje tomcat (drugi blok poniżej) chciały, żebym używał openjdk i muszę użyć prawdziwej Java:

//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

Zauważ, że poprzedni samouczek nie wyjaśnia, jak wstawiać zmienne środowiskowe /etc/environment, więc zatrzymałem się przed tym poleceniem.

Poniższe polecenia pochodzą z tego drugiego samouczka . Zacząłem w punkcie po zainstalowaniu 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

Zadanie dla tomcat.service nie powiodło się. Aby uzyskać szczegółowe informacje, zobacz „systemctl status tomcat.service” i „journalctl -xn”. # 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.

Wykonanie yum localinstallzaktualizowanego jdk rpm, jak zasugerowano w tym innym poście , nie działało.


EDYCJE:


Zgodnie z sugestią @ Bram zmieniłem plik konfiguracyjny na następujący, ale wciąż pojawia się ten sam błąd:

# 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

Ponadto, zgodnie z komentarzem @ JeffSchaller na czacie, udało mi się sprawić, aby tomcat zaczął natywnie zacząć w następujący sposób:

[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]$

Tak więc problem w tym OP wydaje się dotyczyć konfiguracji systemowej. Jak mogę to naprawić?

CodeMed
źródło
Jakieś błędy w pliku dziennika tomcat? Jeśli dobrze pamiętam, plik nazywa się catalina.out lub coś w tym rodzaju.
Bram
Kolejne dzienniki Tomcat sudo systemctl start tomcat.serviceto kilka odmów uprawnień, które zabierają setki wierszy.
CodeMed

Odpowiedzi:

16

Miałem ten sam problem, naprawiłem go przez:

  1. przyznanie użytkownikowi tomcat prawa własności do całego tomcatkatalogu:

    cd /opt && sudo chown -R tomcat tomcat/
    
  2. i komentowanie poniżej linii w /etc/systemd/system/tomcat.service:

    Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
    
użytkownik2968675
źródło
1
Czy bezpiecznie jest uczynić tomcat właścicielem całego folderu? Myślałem, że chcemy jak najbardziej ograniczyć dostęp?
user3203425,
Nie mam teraz tej konfiguracji do przetestowania, ale myślę, że problem polegał na: „sudo chown -R tomcat work / temp / logs /”. Powiedziałbym, że potrzebuje również własności „bin /”.
user2968675,
Wygląda na to, że sam krok 1 zrobił to dla mnie. Co dokładnie robi wiersz w kroku 2?
Kimberly W
Masz rację, krok 1 wystarczy, aby rozwiązać ten konkretny problem. Krok 2 ustawia rozmiar sterty Java i typ czyszczenia pamięci. Potrzebowałem tego ze względu na moje właściwości środowiska, ale większość ludzi prawdopodobnie nie będzie.
user2968675,
w moim przypadku cd /opt && sudo chown -R tomcat tomcat/działało tylko . Ponieważ zmieniłem właściciela na użytkownika systemu i zapomniałem uczynić z niego
kocica
2

Ponieważ zainstalowałeś Javę w niezabezpieczonej lokalizacji, musisz powiedzieć tomcat, gdzie ją znaleźć.

W opublikowanym pliku jednostkowym JAVA_HOME jest ustawiony na / usr / lib / jvm / jre, ale w sekcji dotyczącej instalacji Javy JAVA_HOME to /opt/jdk1.8.0_60.

Jeśli ustawisz JAVA_HOME w pliku jednostki systemd tomcat, wierzę, że to zadziała.

Plik jednostkowy określa także użytkownika tomcat. Ale kiedy uruchomisz go ręcznie, uruchomisz go jako root. Problem prawdopodobnie polega na tym, że tomcat próbuje otworzyć uprzywilejowany port. Czy skrypt startowy uruchamia tomcat jako root? Czy też uruchamia procesy jako użytkownik tomcat? Usunięcie użytkownika i grupy z pliku jednostki powinno wyzwalać to samo zachowanie, co próba wiersza poleceń.

Bram
źródło
Jak naprawić następujący błąd: Zadanie dla tomcat8.service nie powiodło się, ponieważ proces kontroli zakończył się z kodem błędu. Aby uzyskać szczegółowe informacje, zobacz „systemctl status tomcat8.service” i „journalctl -xe”. invoke-rc.d: initscript tomcat8, działanie „start” nie powiodło się. -> sudo nano / etc / default / tomcat8 -> Ustaw JAVA_HOME JAVA_HOME = / usr / lib / jvm / java-8-oracle -> gist.github.com/alexislucena/89a046dc747123faf4496fb946c1fe79
Połącz
1

Według komunikatów o błędach myślę, że problem pochodzi z tego, ExecStop=/bin/kill -15 $MAINPIDże zmienna nie jest zastępowana. Zgodnie z dokumentacją serwisową $MAINPIDoczekuje się tylko na ExecReloadpolecenie. Pozostaje pytanie: dlaczego ExecStopuruchamiany jest po uruchomieniu start?

Możliwe jest systemdpozostawienie katalogu roboczego procesu JVM, ponieważ /może nie być odpowiedni dla wdrożonych aplikacji.

Proponuję przenieść CATALINA_OPTSi JAVA_OPTSdo /opt/tomcat/bin/setenv.shskryptu i spróbuj najpierw z tak prostej konfiguracji:

[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

W każdym razie prosimy o raport journalctl -xni logs/catalina.outtreść

Yves Martin
źródło