Jak ładnie skonfigurować aplikację Spring Boot spakowaną jako plik wykonywalny jako usługa w systemie Linux? Czy to zalecane podejście, czy powinienem przekonwertować tę aplikację na wojnę i zainstalować ją w Tomcat?
Obecnie mogę uruchomić aplikację Spring boot z screen
sesji, co jest miłe, ale wymaga ręcznego uruchomienia po ponownym uruchomieniu serwera.
Co szukam jest ogólne porady / kierunek lub przykładowy init.d
scenariusz, jeśli moje podejście z wykonywalnego słoika jest właściwa.
service
startup
init.d
spring-boot
Mariusz S.
źródło
źródło
Odpowiedzi:
Następujące działa dla Springboot 1.3 i nowszych:
Jako usługa init.d
Plik wykonywalny ma zwykle komendy start, stop, restart i status. Skonfiguruje również plik PID w zwykłym katalogu / var / run i domyślnie zaloguje się w zwykłym katalogu / var / log.
Musisz tylko symlinkować słoik do /etc/init.d
LUB
Następnie możesz zrobić to, co zwykle
Następnie skonfiguruj łącze na dowolnym poziomie uruchamiania, jeśli chcesz, aby aplikacja uruchamiała się / zatrzymywała podczas rozruchu, jeśli jest to pożądane.
Jako usługa systemowa
Aby uruchomić aplikację Spring Boot zainstalowaną w var / myapp, możesz dodać następujący skrypt w /etc/systemd/system/myapp.service:
Uwaga: jeśli używasz tej metody, nie zapomnij, aby sam plik jar był wykonywalny (z chmod + x), w przeciwnym razie wystąpi błąd z błędem „Odmowa zezwolenia”.
Odniesienie
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service
źródło
<executable>true</executable>
do mojegopom.xml
, ale spakowany plik JAR nie wykonuje się (...../myapp.jar ... cannot execute binary file
)-Dspring.profiles.active=prod
te usługi? Pytanie - stackoverflow.com/questions/31242291/…/etc/init.d stop
nie zatrzymuje aplikacji, próbuje ją uruchomić ponownie.Poniżej przedstawiono najprostszy sposób instalacji aplikacji Java jako usługi systemowej w systemie Linux.
Załóżmy, że używasz
systemd
(co obecnie robi każda współczesna dystrybucja):Najpierw utwórz plik usługi o
/etc/systemd/system
nazwie np.javaservice.service
Z tą zawartością:Po drugie, powiadom
systemd
o nowym pliku usługi:i włącz go, aby działał podczas rozruchu:
W końcu możesz użyć następujących poleceń, aby uruchomić / zatrzymać nową usługę:
Pod warunkiem, że używasz
systemd
, jest to najbardziej nieinwazyjny i czysty sposób na skonfigurowanie aplikacji Java jako usługi systemowej.Szczególnie podoba mi się w tym rozwiązaniu to, że nie trzeba instalować ani konfigurować żadnego innego oprogramowania. Dostarczony
systemd
wykonuje całą pracę za Ciebie, a Twoja usługa zachowuje się jak każda inna usługa systemowa. Używam go od dłuższego czasu w produkcji, na różnych dystrybucjach i działa tak, jak można się spodziewać.Kolejnym plusem jest to, że za pomocą
/usr/bin/java
można łatwo dodawaćjvm
parametry, takie jak-Xmx256m
.Przeczytaj także
systemd
część oficjalnej dokumentacji Spring Boot: http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.htmlźródło
[Unit]
sekcji, na przykładAfter=mysql.service
,Before=apache2.service
.Możesz także użyć supervisora, który jest bardzo przydatnym demonem, którego można użyć do łatwego kontrolowania usług. Usługi te są zdefiniowane przez proste pliki konfiguracyjne określające, co wykonać z którym użytkownikiem, w którym katalogu i tak dalej, istnieją opcje zillion. supervisord ma bardzo prostą składnię, więc stanowi bardzo dobrą alternatywę dla pisania skryptów inicjujących SysV.
Oto prosty supervisord plik konfiguracyjny dla programu, który próbujesz uruchomić / kontroli. (włóż to do /etc/supervisor/conf.d/yourapp.conf )
/etc/supervisor/conf.d/yourapp.conf
Aby kontrolować aplikację, musisz wykonać supervisorctl , który wyświetli monit, w którym możesz zacząć, zatrzymać, status swojej aplikacji.
CLI
Jeśli
supervisord
demon już działa i dodałeś konfigurację dla swojego serwisu bez ponownego uruchamiania demona, możesz po prostu wykonać poleceniereread
iupdate
wsupervisorctl
powłoce.To naprawdę daje ci wszystkie elastyczne opcje, które miałbyś przy użyciu skryptów SysV Init, ale łatwe w użyciu i kontrolowaniu. Spójrz na dokumentację .
źródło
systemd
, co wbudowane w większość obecnych dystrybucji Linuksa.Właśnie zacząłem to robić sam, więc do tej pory jestem pod względem skryptu kontrolera usługi init.d CentOS. Do tej pory działa całkiem nieźle, ale nie jestem hakerem Bash, więc jestem pewien, że jest miejsce na ulepszenia, więc myśli o ulepszeniu go są mile widziane.
Przede wszystkim mam krótki skrypt konfiguracyjny
/data/svcmgmt/conf/my-spring-boot-api.sh
dla każdej usługi, który konfiguruje zmienne środowiskowe.Korzystam z CentOS, więc aby upewnić się, że moje usługi zostaną uruchomione po ponownym uruchomieniu serwera, mam skrypt kontroli usługi w
/etc/init.d/my-spring-boot-api
:Jak widać, wywołuje on skrypt początkowej konfiguracji, aby skonfigurować zmienne środowiskowe, a następnie wywołuje skrypt udostępniony, którego używam do ponownego uruchomienia wszystkich moich usług Spring Boot. Ten wspólny skrypt jest miejscem, w którym można znaleźć całe to wszystko:
Podczas zatrzymywania spróbuje użyć Spring Boot Actuator do wykonania kontrolowanego wyłączenia. Jednak w przypadku, gdy siłownik nie zostanie skonfigurowany lub nie zamknie się w rozsądnym czasie (daję mu 5 sekund, co jest naprawdę trochę krótkie), proces zostanie zabity.
Ponadto skrypt przyjmuje założenie, że proces Java uruchamiający aplikację będzie jedynym, który zawiera tekst „my-spring-boot-api.jar” w tekście szczegółów procesu. Jest to bezpieczne założenie w moim środowisku i oznacza, że nie muszę śledzić PID.
źródło
java -jar
. Reszta skryptu jest nadal potrzebna.Jeśli chcesz używać Spring Boot 1.2.5 z Spring Boot Maven Plugin 1.3.0.M2, oto nasze rozwiązanie:
Następnie skompiluj jako ususal:
mvn clean package
utwórz dowiązanie symboliczneln -s /.../myapp.jar /etc/init.d/myapp
,chmod +x /etc/init.d/myapp
uruchom go i uruchomservice myapp start
(z Ubuntu Server)źródło
1.3.0.M2
, ale przy próbie dostałem błąd1.3.0.RC1
.springBoot { executable = true }
bloku.Wiem, że to starsze pytanie, ale chciałem przedstawić jeszcze jeden sposób, jakim jest plugin appassembler-maven-plug . Oto odpowiednia część z mojej POM, która zawiera wiele dodatkowych wartości opcji, które uznaliśmy za przydatne:
źródło
JAKO USŁUGA WINDOWS
Jeśli chcesz, aby działało to w systemie Windows, pobierz plik winsw.exe z
Następnie zmień nazwę pliku na jar (np. Twoja aplikacja .jar)
Teraz utwórz plik xml twoja-app.xml i skopiuj do niego następującą treść
Upewnij się, że exe i xml wraz ze słoikiem w tym samym folderze.
Po otwarciu wiersza polecenia w Administratorze uprzedzić i zainstalować go w usłudze systemu Windows.
Jeśli to się nie powiedzie
Następnie spróbuj wykonać następujące czynności:
Otóż to :) .
Aby odinstalować usługę w systemie Windows
Aby zobaczyć / uruchomić / zatrzymać usługę: win + r i wpisz Narzędzia administracyjne, a następnie wybierz usługę z tego. Następnie kliknij prawym przyciskiem myszy wybierz opcję - uruchom / zatrzymaj
źródło
Mój skrypt SysVInit dla Centos 6 / RHEL (jeszcze nie idealny). Ten skrypt wymaga ApplicationPidListener .
Źródło
/etc/init.d/app
Przykładowy plik konfiguracyjny
/etc/sysconfig/app
:źródło
Oto skrypt, który wdraża wykonywalny jar jako usługę systemową.
Tworzy użytkownika dla usługi i pliku .service, umieszcza plik jar w katalogu / var i dokonuje podstawowej blokady uprawnień.
Przykład:
źródło
Próbuję utworzyć aplikacje Springboot, które są prezentowane jako skrypt powłoki w stylu „init.d” ze skompresowaną aplikacją Java na końcu
Poprzez symlinkowanie tych skryptów z /etc/init.d/spring-app do /opt/spring-app.jar i chmod'ing jar, aby był wykonywalny, możliwe jest uruchomienie "/etc/init.d/spring-app „” /etc/init.d/spring-app stop ”i inne możliwości, takie jak praca statusu
Przypuszczalnie skoro skrypty w stylu init.d z springboot wyglądają, że mają niezbędne magiczne łańcuchy (jak
# Default-Start: 2 3 4 5
), chkconfig mógłby dodać je jako „usługę”Ale chciałem, aby działało z systememd
Aby to zadziałało, wypróbowałem wiele przepisów z innych powyższych odpowiedzi, ale żadna z nich nie działała dla mnie w Centos 7.2 z Springboot 1.3. W większości uruchomiliby usługę, ale nie byli w stanie śledzić pid
W końcu okazało się, że następujące działało dla mnie, kiedy również istniał link /etc/init.d. Plik podobny do poniższego powinien zostać zainstalowany jako
/usr/lib/systemd/system/spring-app.service
źródło
Skończyło się na usłudze systemowej dla układu WAR / JAR
Nazywam java -jar, ponieważ jest bardziej elastyczny. Próbowałem również umieścić ExecStart = spring-mvc.war, ale mimo że jest wykonywalny, dostałem „Błąd formatu Exec”
W każdym razie systemd jest obecny na wszystkich dystrybucjach i oferuje dobre rozwiązanie do przekierowywania dzienników (syserr jest ważny, gdy usługa nawet się nie uruchamia, lokalizacja pliku log4j będzie pusta :)).
rsyslog - przekieruj dane wejściowe syslog z aplikacji do określonego folderu / pliku
logrotate
logrotate gc
źródło
W tym pytaniu odpowiedź od @PbxMan powinna zacząć:
Uruchom aplikację Java jako usługę w systemie Linux
Edytować:
Istnieje inny, mniej przyjemny sposób na uruchomienie procesu przy ponownym uruchomieniu, za pomocą crona:
Działa to, ale nie zapewnia przyjemnego interfejsu start / stop dla twojej aplikacji. W
kill
każdym razie możesz po prostu to po prostu …źródło
Nie znam „standardowego” sposobu, w jaki można to zrobić za pomocą aplikacji Java, ale zdecydowanie jest to dobry pomysł (jeśli chcesz skorzystać z możliwości utrzymania i monitorowania systemu operacyjnego, jeśli są dostępne) . W planie jest dostarczenie czegoś z obsługi narzędzia Spring Boot (maven i gradle), ale na razie prawdopodobnie będziesz musiał rzucić własne. Najlepszym rozwiązaniem, jakie znam obecnie, jest Foreman , który ma deklaratywne podejście i jednowierszowe polecenia do pakowania skryptów inicjujących dla różnych standardowych formatów systemu operacyjnego (monitor, sys V, upstart itp.). Istnieją również dowody na to, że ludzie ustawiali różne stopnie (np. Tutaj ).
źródło
Czy używasz Maven? Następnie powinieneś wypróbować wtyczkę AppAssembler:
Zobacz: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/index.html
źródło
Następująca konfiguracja jest wymagana w pliku build.gradle w projektach Spring Boot.
build.gradle
Jest to wymagane do utworzenia w pełni wykonywalnego jar w systemie Unix (Centos i Ubuntu)
Utwórz plik .conf
Jeśli chcesz skonfigurować niestandardowe właściwości JVM lub argumenty uruchamiania aplikacji Spring Boot, możesz utworzyć plik .conf o tej samej nazwie co nazwa aplikacji Spring Boot i umieścić go równolegle do pliku jar.
Biorąc pod uwagę, że twoja-app.jar jest nazwą twojej aplikacji Spring Boot, możesz utworzyć następujący plik.
Ta konfiguracja ustawi 64 MB pamięci RAM dla aplikacji Spring Boot i aktywuje profil prod.
Utwórz nowego użytkownika w systemie Linux
Aby zwiększyć bezpieczeństwo, musimy utworzyć konkretnego użytkownika, aby uruchomić aplikację Spring Boot jako usługę.
Utwórz nowego użytkownika
W systemie Ubuntu / Debian zmodyfikuj powyższe polecenie w następujący sposób:
Ustaw hasło
Ustaw Springboot właścicielem pliku wykonywalnego
Zapobiegaj modyfikacji pliku jar
Spowoduje to skonfigurowanie uprawnień jar tak, że nie będzie można go zapisać i będzie można go odczytać lub wykonać tylko przez springboot właściciela.
Opcjonalnie możesz ustawić plik jar jako niezmienny za pomocą polecenia zmiany atrybutu (chattr).
Należy również ustawić odpowiednie uprawnienia dla odpowiedniego pliku .conf. .conf wymaga tylko dostępu do odczytu (Octal 400) zamiast dostępu do odczytu + wykonania (Octal 500)
Utwórz usługę Systemd
/etc/systemd/system/your-app.service
Automatycznie uruchom ponownie proces, jeśli zostanie zabity przez system operacyjny
Dodaj poniższe dwa atrybuty (Restart i RestartSec), aby automatycznie ponownie uruchomić proces w przypadku awarii.
/etc/systemd/system/your-app.service
Zmiana spowoduje ponowne uruchomienie aplikacji Spring Boot w przypadku awarii z opóźnieniem 30 sekund. Jeśli zatrzymasz usługę za pomocą polecenia systemctl, ponowne uruchomienie nie nastąpi.
Zaplanuj usługę przy uruchomieniu systemu
Aby oflagować aplikację, aby uruchamiała się automatycznie podczas rozruchu systemu, użyj następującego polecenia:
Włącz aplikację Spring Boot podczas uruchamiania systemu
Uruchom usługę Zatrzymaj usługę
Systemctl może być używany w Ubuntu 16.04 LTS i 18.04 LTS do uruchamiania i zatrzymywania procesu.
Rozpocznij proces
Zatrzymaj proces
Bibliografia
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
źródło
Po otrzymaniu doskonałej odpowiedzi Chada, jeśli pojawi się błąd „Błąd: nie można znaleźć lub załadować klasy głównej” - i poświęcasz kilka godzin na próby rozwiązania tego problemu, niezależnie od tego, czy wykonujesz skrypt powłoki, który uruchamia aplikację Java, czy ją uruchamia z samego systemd - i wiesz, że twoja ścieżka klasy jest w 100% poprawna, np. ręczne uruchamianie skryptu powłoki działa tak samo, jak uruchamianie tego, co masz w systemst execart. Upewnij się, że działasz jako właściwy użytkownik! W moim przypadku próbowałem różnych użytkowników, po dłuższym czasie rozwiązywania problemów - w końcu miałem przeczucie, ustawiłem root jako użytkownik - voila, aplikacja uruchomiła się poprawnie. Po ustaleniu, że to zły problem dla użytkownika, ja
chown -R user:user
że folder i podfoldery oraz aplikacja działały poprawnie jako określony użytkownik i grupa, więc nie trzeba już uruchamiać go jako root (złe bezpieczeństwo).źródło
W plikach jednostek systemowych możesz ustawić katalog zmiennych środowiskowych lub poprzez
EnvironmentFile
. Proponuję robić to w ten sposób, ponieważ wydaje się, że jest to najmniej tarcie.Przykładowy plik jednostki
Następnie skonfiguruj plik, pod
/etc/sysconfig/hello-world
którym znajdują się wielkie litery zmiennych Spring Boot. Na przykład zmienna o nazwieserver.port
będzie miała postaćSERVER_PORT
zmiennej środowiskowej:Mechanizm wykorzystywany tutaj polega na tym, że aplikacje Spring Boot biorą listę właściwości, a następnie tłumaczą je, robiąc wszystko dużymi literami i zamieniając kropki na podkreślenia. Gdy aplikacja Spring Boot przejdzie ten proces, następnie szuka pasujących zmiennych środowiskowych i odpowiednio wykorzystuje znalezione zmienne.
Zostało to bardziej szczegółowo uwypuklone w tym pytaniu SO zatytułowanym: Jak ustawić właściwość Spring Boot ze znakiem podkreślenia w jej nazwie poprzez Zmienne środowiskowe?
Bibliografia
źródło
Można to zrobić za pomocą usługi Systemd w Ubuntu
Możesz skorzystać z tego linku, aby uzyskać bardziej szczegółowy opis i różne sposoby na zrobienie tego. http://www.baeldung.com/spring-boot-app-as-a-service
źródło
Utwórz skrypt o nazwie twoja-app.service (rest-app.service). Powinniśmy umieścić ten skrypt w katalogu / etc / systemd / system. Oto przykładowa zawartość skryptu
Kolejny:
Bibliografia
wprowadź opis linku tutaj
źródło