Bagaimana cara mengkonfigurasi aplikasi Spring Boot yang dikemas sebagai jar yang dapat dieksekusi sebagai Layanan dalam sistem linux? Apakah ini pendekatan yang disarankan, atau haruskah saya mengubah aplikasi ini untuk berperang dan menginstal ke Tomcat?
Saat ini saya dapat menjalankan aplikasi boot Spring dari screen
sesi, apa yang baik, tetapi memerlukan mulai manual setelah server reboot.
Apa yang saya cari adalah saran / arahan umum atau init.d
skrip sampel , jika pendekatan saya dengan jar yang dapat dieksekusi tepat.
service
startup
init.d
spring-boot
MariuszS
sumber
sumber
Jawaban:
Karya-karya berikut untuk springboot 1.3 dan di atasnya:
Sebagai layanan init.d
Jar yang dapat dieksekusi memiliki perintah mulai, berhenti, restart, dan status yang biasa. Ini juga akan mengatur file PID di direktori / var / run biasa dan masuk ke direktori / var / log biasa secara default.
Anda hanya perlu menghubungkan botol Anda ke /etc/init.d seperti itu
ATAU
Setelah itu Anda bisa melakukan hal yang biasa
Kemudian siapkan tautan di mana pun runlevel yang Anda inginkan aplikasi mulai / berhenti saat boot jika diinginkan.
Sebagai layanan systemd
Untuk menjalankan aplikasi Spring Boot yang terinstal di var / myapp Anda dapat menambahkan skrip berikut di /etc/systemd/system/myapp.service:
NB: jika Anda menggunakan metode ini, jangan lupa untuk membuat file jar sendiri dapat dieksekusi (dengan chmod + x) jika tidak maka akan gagal dengan kesalahan "Izin ditolak".
Referensi
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service
sumber
<executable>true</executable>
ke sayapom.xml
, tetapi file JAR yang dipaket tidak menjalankan (...../myapp.jar ... cannot execute binary file
)-Dspring.profiles.active=prod
ke layanan ini? Pertanyaan - stackoverflow.com/questions/31242291/…/etc/init.d stop
tidak menghentikan aplikasi, itu mencoba untuk memulainya lagi.Berikut ini adalah cara termudah untuk menginstal aplikasi Java sebagai layanan sistem di Linux.
Mari kita asumsikan Anda menggunakan
systemd
(yang dilakukan oleh distro modern mana pun saat ini):Pertama, buat file layanan dengan
/etc/systemd/system
nama misalnyajavaservice.service
dengan konten ini:Kedua, beri tahu
systemd
file layanan baru:dan aktifkan, sehingga berjalan saat boot:
Akhirnya, Anda dapat menggunakan perintah berikut untuk memulai / menghentikan layanan baru Anda:
Asalkan Anda menggunakan
systemd
, ini adalah cara yang paling tidak mengganggu dan bersih untuk mengatur aplikasi Java sebagai layanan sistem.Apa yang saya sukai terutama tentang solusi ini adalah kenyataan bahwa Anda tidak perlu menginstal dan mengkonfigurasi perangkat lunak lain. Dikirim
systemd
mengerjakan semua pekerjaan untuk Anda, dan layanan Anda berperilaku seperti layanan sistem lainnya. Saya menggunakannya dalam produksi untuk sementara waktu sekarang, pada distro yang berbeda, dan hanya berfungsi seperti yang Anda harapkan.Kelebihan lainnya adalah, dengan menggunakan
/usr/bin/java
, Anda dapat dengan mudah menambahkanjvm
parameter seperti-Xmx256m
.Baca juga
systemd
bagian dalam dokumentasi Boot Musim Semi resmi: http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.htmlsumber
[Unit]
bagian, misalnyaAfter=mysql.service
,Before=apache2.service
.Anda juga dapat menggunakan supervisord yang merupakan daemon yang sangat berguna, yang dapat digunakan untuk mengontrol layanan dengan mudah. Layanan ini ditentukan oleh file konfigurasi sederhana yang menentukan apa yang harus dijalankan dengan pengguna mana di direktori mana dan sebagainya, ada banyak pilihan. supervisord memiliki sintaks yang sangat sederhana, jadi itu membuat alternatif yang sangat baik untuk menulis skrip init SysV.
Di sini file konfigurasi supervisord sederhana untuk program yang Anda coba jalankan / kontrol. (masukkan ini ke /etc/supervisor/conf.d/yapp.conf Anda )
/etc/supervisor/conf.d/yappapp.conf Anda
Untuk mengontrol aplikasi, Anda perlu menjalankan supervisorctl , yang akan memberi Anda prompt di mana Anda bisa memulai, menghentikan, status aplikasi Anda.
CLI
Jika
supervisord
daemon sudah berjalan dan Anda telah menambahkan konfigurasi untuk serivce Anda tanpa me-restart daemon, Anda cukup melakukanreread
danupdate
memerintahkan disupervisorctl
shell.Ini benar-benar memberi Anda semua flexibilites yang Anda miliki menggunakan skrip SysV Init, tetapi mudah digunakan dan dikontrol. Lihatlah dokumentasinya .
sumber
systemd
, yang dibangun di sebagian besar distro Linux saat ini.Saya baru saja melakukan ini sendiri, jadi berikut ini adalah di mana saya sejauh ini dalam hal script pengontrol layanan CentOS init.d. Sejauh ini bekerja dengan baik, tapi saya bukan hacker Bash, jadi saya yakin ada ruang untuk perbaikan, jadi pemikiran untuk memperbaikinya dipersilahkan.
Pertama-tama, saya memiliki skrip konfigurasi pendek
/data/svcmgmt/conf/my-spring-boot-api.sh
untuk setiap layanan, yang mengatur variabel lingkungan.Saya menggunakan CentOS, jadi untuk memastikan bahwa layanan saya dimulai setelah server restart, saya memiliki skrip kontrol layanan di
/etc/init.d/my-spring-boot-api
:Seperti yang Anda lihat, itu memanggil skrip konfigurasi awal untuk mengatur variabel lingkungan dan kemudian memanggil skrip bersama yang saya gunakan untuk memulai kembali semua layanan Boot Musim Semi saya. Naskah yang dibagikan itu adalah tempat dagingnya semuanya dapat ditemukan:
Saat berhenti, ia akan mencoba menggunakan Spring Boot Actuator untuk melakukan shutdown yang terkontrol. Namun, jika Actuator tidak dikonfigurasi atau gagal dimatikan dalam kerangka waktu yang masuk akal (saya berikan 5 detik, yang sebenarnya agak pendek), prosesnya akan mati.
Selain itu, skrip membuat asumsi bahwa proses java menjalankan aplikasi akan menjadi satu-satunya dengan "my-spring-boot-api.jar" dalam teks rincian proses. Ini adalah asumsi yang aman di lingkungan saya dan berarti bahwa saya tidak perlu melacak PID.
sumber
java -jar
. Sisa skrip masih diperlukan.Jika Anda ingin menggunakan Spring Boot 1.2.5 dengan Spring Boot Maven Plugin 1.3.0.M2, berikut solusinya:
Kemudian kompilasi sebagai ususal:
mvn clean package
buat symlinkln -s /.../myapp.jar /etc/init.d/myapp
, buat itu dapat dieksekusi,chmod +x /etc/init.d/myapp
dan jalankanservice myapp start
(dengan Ubuntu Server)sumber
1.3.0.M2
, tetapi saya mendapat kesalahan ketika saya mencoba1.3.0.RC1
.springBoot { executable = true }
blok.Saya tahu ini adalah pertanyaan yang lebih lama, tetapi saya ingin menyajikan cara lain yaitu appassembler-maven-plugin . Inilah bagian yang relevan dari POM saya yang mencakup banyak nilai opsi tambahan yang kami temukan berguna:
sumber
SEBAGAI LAYANAN WINDOWS
Jika Anda ingin ini dijalankan di mesin windows, unduh winsw.exe dari
Setelah itu ganti namanya menjadi toples nama file (mis .: aplikasi-Anda .jar)
Sekarang buat file xml -app.xml Anda dan salin konten berikut ke sana
Pastikan bahwa exe dan xml bersama dengan toples di folder yang sama.
Setelah perintah terbuka ini muncul di Administrator previlege dan instal ke layanan windows.
Jika gagal dengan
Kemudian coba yang berikut ini:
itu dia :) .
Untuk menghapus layanan di windows
Untuk melihat / menjalankan / menghentikan layanan: win + r dan ketik Alat administratif kemudian pilih layanan dari itu. Kemudian klik kanan pilih opsi - run / stop
sumber
Skrip SysVInit saya untuk Centos 6 / RHEL (belum ideal). Script ini membutuhkan ApplicationPidListener .
Sumber dari
/etc/init.d/app
Contoh file konfigurasi
/etc/sysconfig/app
:sumber
Berikut ini adalah skrip yang menggunakan jar yang dapat dieksekusi sebagai layanan systemd.
Itu menciptakan pengguna untuk layanan dan file .service, dan menempatkan file jar di bawah / var, dan membuat beberapa kunci dasar hak istimewa.
Contoh:
sumber
Saya mencoba membuat aplikasi springboot yang disajikan sebagai skrip shell gaya "init.d" dengan aplikasi java terkompresi yang ditempel di bagian akhir
Dengan menyinkronkan skrip-skrip ini dari /etc/init.d/spring-app ke /opt/spring-app.jar dan chmod'ing jar agar dapat dieksekusi, dimungkinkan untuk membuat "/etc/init.d/spring-app mulai "" /etc/init.d/spring-app stop "dan kemungkinan lain seperti pekerjaan status
Agaknya, sebagai skrip gaya init.d dari springboot terlihat bahwa mereka memiliki string ajaib yang diperlukan (seperti
# Default-Start: 2 3 4 5
) chkconfig akan dapat menambahkannya sebagai "layanan"Tetapi saya ingin membuatnya bekerja dengan systemd
Untuk membuat ini berhasil, saya mencoba banyak penerima di jawaban lain di atas tetapi tidak ada yang bekerja untuk saya di Centos 7.2 dengan Springboot 1.3 Sebagian besar mereka akan memulai layanan tetapi tidak dapat melacak pid
Pada akhirnya saya menemukan hal berikut ini berfungsi untuk saya, ketika tautan /etc/init.d berada di tempat juga. File yang mirip dengan yang di bawah ini harus diinstal sebagai
/usr/lib/systemd/system/spring-app.service
sumber
Saya akhirnya melakukan layanan systemd untuk tata letak WAR / JAR
Saya memanggil java -jar karena lebih fleksibel. Mencoba juga meletakkan ExecStart = spring-mvc.war tetapi meskipun dapat dieksekusi, saya mendapat 'Exec format error'
Pokoknya hari ini, systemd hadir di semua distro, dan menawarkan solusi yang bagus untuk mengarahkan ulang log (syserr penting ketika layanan Anda bahkan tidak memulai lokasi file log4j akan kosong :)).
rsyslog - redirect input syslog dari aplikasi ke folder / file tertentu
logrotate
logrotate gc
sumber
Dalam pertanyaan ini, jawaban dari @PbxMan akan membantu Anda memulai:
Jalankan Aplikasi Java sebagai Layanan di Linux
Edit:
Ada cara lain yang kurang bagus untuk memulai proses reboot, menggunakan cron:
Ini berfungsi, tetapi tidak memberi Anda antarmuka awal / berhenti yang bagus untuk aplikasi Anda. Anda masih bisa tetap
kill
melakukannya ...sumber
Saya tidak tahu cara "standar" untuk melakukan itu dengan aplikasi Java, tapi itu ide yang bagus (Anda ingin mendapat manfaat dari kemampuan sistem operasi yang tetap hidup dan pemantauan jika ada) . Ada di peta jalan untuk memberikan sesuatu dari dukungan alat Boot Spring (pakar dan gradasi), tetapi untuk sekarang Anda mungkin harus memutar sendiri. Solusi terbaik yang saya tahu saat ini adalah Foreman , yang memiliki pendekatan deklaratif dan perintah satu baris untuk mengemas skrip init untuk berbagai format OS standar (monit, sys V, pemula dll). Ada juga bukti orang-orang telah mengatur barang-barang dengan gradle (misalnya di sini ).
sumber
Apakah Anda menggunakan Maven? Maka Anda harus mencoba Plugin AppAssembler:
Lihat: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/index.html
sumber
Konfigurasi berikut diperlukan dalam file build.gradle di proyek Boot Spring.
build.gradle
Ini diperlukan untuk membuat jar yang sepenuhnya dapat dieksekusi pada sistem unix (Centos dan Ubuntu)
Buat file .conf
Jika Anda ingin mengkonfigurasi properti JVM kustom atau argumen menjalankan aplikasi Boot Spring, maka Anda dapat membuat file .conf dengan nama yang sama dengan nama aplikasi Boot Spring dan menempatkannya sejajar dengan file jar.
Mengingat app-jar Anda adalah nama aplikasi Boot Musim Semi Anda, maka Anda dapat membuat file berikut.
Konfigurasi ini akan mengatur ram 64 MB untuk aplikasi Spring Boot dan mengaktifkan profil prod.
Buat pengguna baru di linux
Untuk meningkatkan keamanan, kita harus membuat pengguna tertentu untuk menjalankan aplikasi Spring Boot sebagai layanan.
Buat pengguna baru
Di Ubuntu / Debian, modifikasi perintah di atas sebagai berikut:
Setel kata sandi
Buat pemilik springboot dari file yang dapat dieksekusi
Cegah modifikasi file jar
Ini akan mengonfigurasi izin jar sehingga tidak dapat ditulis dan hanya dapat dibaca atau dieksekusi oleh springboot pemiliknya.
Secara opsional Anda dapat membuat file jar Anda sebagai tidak dapat diubah menggunakan perintah ubah atribut (chattr).
Izin yang tepat juga harus ditetapkan untuk file .conf yang sesuai. .conf membutuhkan akses hanya baca (Oktal 400) alih-alih akses baca + eksekusi (Oktal 500)
Buat layanan Systemd
/etc/systemd/system/your-app.service
Mulai ulang proses secara otomatis jika terbunuh oleh OS
Tambahkan dua atribut di bawah ini (Restart dan RestartSec) untuk memulai kembali proses kegagalan secara otomatis.
/etc/systemd/system/your-app.service
Perubahan ini akan membuat aplikasi Spring Boot restart jika terjadi kegagalan dengan penundaan 30 detik. Jika Anda menghentikan layanan menggunakan perintah systemctl maka restart tidak akan terjadi.
Jadwalkan layanan di startup sistem
Untuk menandai aplikasi agar mulai secara otomatis saat boot sistem, gunakan perintah berikut:
Aktifkan aplikasi Spring Boot saat startup sistem
Mulai Stop Layanan
systemctl dapat digunakan di Ubuntu 16.04 LTS dan 18.04 LTS untuk memulai dan menghentikan proses.
Mulai prosesnya
Hentikan prosesnya
Referensi
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
sumber
Menindaklanjuti jawaban Chad yang sangat baik, jika Anda mendapatkan kesalahan "Kesalahan: Tidak dapat menemukan atau memuat kelas utama" - dan Anda menghabiskan beberapa jam mencoba memecahkan masalah, apakah Anda menjalankan skrip shell yang memulai aplikasi java Anda atau memulainya dari systemd sendiri - dan Anda tahu classpath Anda 100% benar, misalnya menjalankan skrip shell secara manual dan menjalankan apa yang Anda miliki di systemd execstart. Pastikan Anda menjalankan sesuatu sebagai pengguna yang benar! Dalam kasus saya, saya telah mencoba pengguna yang berbeda, setelah beberapa saat pemecahan masalah - saya akhirnya punya firasat, meletakkan root sebagai pengguna - voila, aplikasi dimulai dengan benar. Setelah menentukan itu adalah masalah pengguna yang salah, saya
chown -R user:user
folder dan subfolder dan aplikasi berjalan dengan benar sebagai pengguna dan grup yang ditentukan sehingga tidak perlu lagi menjalankannya sebagai root (keamanan buruk).sumber
Dalam file unit systemd Anda dapat mengatur direktori variabel lingkungan atau melalui
EnvironmentFile
. Saya akan mengusulkan melakukan hal-hal seperti ini karena tampaknya merupakan jumlah gesekan paling sedikit.File unit sampel
Kemudian, atur file
/etc/sysconfig/hello-world
yang menyertakan nama huruf besar dari variabel Boot Spring Anda. Misalnya, variabel yang dipanggilserver.port
akan mengikuti formulirSERVER_PORT
sebagai variabel lingkungan:Mekanisme yang dieksploitasi di sini adalah bahwa aplikasi Boot Spring akan mengambil daftar properti dan kemudian menerjemahkannya, membuat semuanya huruf besar, dan mengganti titik-titik dengan garis bawah. Setelah aplikasi Boot Spring melewati proses ini, ia kemudian mencari variabel lingkungan yang cocok, dan menggunakan yang ditemukan sesuai.
Ini disorot secara lebih rinci dalam T&J SO yang berjudul: Bagaimana mengatur properti Spring Boot dengan garis bawah pada namanya melalui Variabel Lingkungan?
Referensi
sumber
Itu dapat dilakukan dengan menggunakan layanan Systemd di Ubuntu
Anda dapat mengikuti tautan ini untuk deskripsi yang lebih terperinci dan berbagai cara untuk melakukannya. http://www.baeldung.com/spring-boot-app-as-a-service
sumber
Buat skrip dengan nama your-app.service (rest-app.service). Kita harus menempatkan skrip ini di direktori / etc / systemd / system. Berikut adalah contoh konten skrip
Lanjut:
Referensi
masukkan deskripsi tautan di sini
sumber