SpringBoot Linux服務(wù)化部署

除了使用java -jar運行SpringBoot應(yīng)用程序之外,還可以為Unix系統(tǒng)創(chuàng)建可執(zhí)行的應(yīng)用程序坏晦÷茜瑁可執(zhí)行的jar可以其他 Unix 系統(tǒng)程序一樣運行嫁乘,也可以注冊到init.d或systemd。這使我們可以很方便的在生成應(yīng)用環(huán)境中安裝和管理SpringBoot應(yīng)用程序球碉。

提示

可執(zhí)行的jar是通過 jar 文件前面嵌入額外的腳本來工作蜓斧。目前,一些工具不接受這種格式睁冬,所以這種技術(shù)還不是完全穩(wěn)定的挎春。例如,jar -xf可能無法提取可執(zhí)行的jar或war豆拨。如果你不能確保此方式可行搂蜓,建議還是使用java -jar運行它或?qū)⑵洳渴鸬絪ervlet容器中。

使用Maven創(chuàng)建一個“可執(zhí)行”的jar辽装,插件配置:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

在Gradle中

bootJar {
    launchScript()
}

配置之后,就可以輸入./my-application.jar(my-application是打包的 jar 文件名稱)來運行SpringBoot程序了相味。jar所在目錄為應(yīng)用程序的work目錄拾积,相當于 classPath路徑。

支持操作系統(tǒng)

默認腳本支持大多數(shù)Linux發(fā)行版丰涉,并在CentOS和Ubuntu上進行了測試拓巧。其他平臺,如OS X和FreeBSD一死,需要使用定制的embeddedLaunchScript肛度。

Unix / Linux服務(wù)

通過使用init.d或systemd,可以輕松地將Spring引導(dǎo)應(yīng)用程序啟動為Unix/Linux服務(wù)投慈。

安裝為init.d服務(wù)

如果配置了Spring Boot的Maven或Gradle插件來生成一個可執(zhí)行的jar承耿,并且不使用自定義embeddedLaunchScript,那么可用將應(yīng)用程序配置為init.d服務(wù)伪煤。就可以支持標準的start加袋、stop、restart和status命令抱既。

該腳本支持以下功能:

  • 作為擁有jar文件的用戶啟動服務(wù)
  • 使用/var/run/<appname>/<appname>.pid跟蹤應(yīng)用程序的PID
  • 將控制臺日志寫入/var/log/<appname>.log

假設(shè)你的SpringBoot程序部署在/var/myapp路徑职烧,要將SpringBoot程序作為init.d服務(wù),需要創(chuàng)建一個軟鏈接防泵,如下:

$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp

安裝后蚀之,就可以按系統(tǒng)服務(wù)的方式啟動和停止。例如捷泞,在基于debian的系統(tǒng)上足删,可以使用以下命令啟動它:

$ service myapp start

如果應(yīng)用程序啟動失敗,可以在/var/log/<appname>.log日志文件中查找錯誤肚邢。

將程序標記為自動啟動壹堰。例如拭卿,在Debian上,可以使用以下命令:

$ update-rc.d myapp defaults <priority>

init.d服務(wù)安全

下面是一組關(guān)于如何保護以init.d形式運行的SpringBoot應(yīng)用程序的指導(dǎo)原則贱纠。注意峻厚,這里只是列出部分為增強應(yīng)用程序及其運行環(huán)境的安全性而應(yīng)該做的事情。

當以 root 身份執(zhí)行應(yīng)用程序谆焊,應(yīng)用程序的擁有者就是 root惠桃。而我們不應(yīng)該使用 root 用戶作為程序的擁有者,而是要創(chuàng)建一個特定的用戶辖试,并使用chown使其成為jar文件的所有者辜王,如下面的示例所示:

$ chown bootapp:bootapp your-app.jar

在這種情況下,程序?qū)⑹褂胋ootapp用戶運行罐孝。

為了減少應(yīng)用程序的用戶帳戶被破壞的可能性呐馆,應(yīng)該考慮阻止它使用shell登錄。例如莲兢,可以將帳戶的shell設(shè)置為/usr/sbin/nologin汹来。

防止應(yīng)用程序jar文件被篡改

首先,配置其權(quán)限改艇,使其不能被寫入收班,只能被其所有者讀取或執(zhí)行,如下例所示:

$ chmod 500 your-app.jar

其次谒兄,如果應(yīng)用程序或運行它的帳戶受到損害摔桦,應(yīng)該采取措施來限制損害。如果攻擊者確實獲得了訪問權(quán)承疲,他們可以篡改jar文件邻耕。防止這種情況發(fā)生的一種方法是使用chattr使其不可變,如下面的示例所示:

$ sudo chattr +i your-app.jar

這將阻止任何用戶(包括root)修改jar纪隙。

如果root用于控制應(yīng)用程序的服務(wù)赊豌,而程序是使用.conf文件自定義啟動配置,則root需要可以將讀取.conf文件绵咱。使用chmod使文件只能被所有者讀取碘饼,使用chown使root成為所有者,如下例所示:

$ chmod 400 your-app.conf
$ sudo chown root:root your-app.conf

安裝為systemd服務(wù)

systemd是System V init.d系統(tǒng)的繼承者悲伶,現(xiàn)在許多現(xiàn)代Linux發(fā)行版都在使用它艾恼。盡管你可以繼續(xù)使用init.d。通過systemd腳本麸锉,也可以使用systemd ' service '腳本啟動SpringBoot應(yīng)用程序钠绍。

假設(shè)在/var/myapp中部署了一個SpringBoot應(yīng)用程序,要將SpringBoot應(yīng)用程序安裝為systemd服務(wù)花沉,請創(chuàng)建一個名為myapp.service腳本柳爽,并將其放在/etc/systemd/system目錄中媳握。下面的腳本提供了一個例子:

[Unit]
Description=myapp
After=syslog.target

[Service]
User=myapp
ExecStart=/var/myapp/myapp.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

注意:請記住對應(yīng)更改應(yīng)用程序的描述、用戶和ExecStart字段為你運行的環(huán)境值

ExecStart字段不聲明腳本操作命令磷脯,這意味著默認情況下使用run命令蛾找。

注意,這與作為init.d運行時不同赵誓。init.d服務(wù)運行應(yīng)用程序的用戶打毛、PID文件和控制臺日志文件由systemd本身管理,因此必須通過在“service”腳本中使用適當?shù)淖侄芜M行配置俩功。有關(guān)詳細信息幻枉,請參閱服務(wù)單元配置手冊頁。

標記自動啟動诡蜓,請使用以下命令:

$ systemctl enable myapp.service

自定義啟動腳本

Maven或Gradle插件編寫的默認嵌入式啟動腳本可以通過多種方式定制熬甫。對于大多數(shù)人來說,使用默認腳本和一些定制通常就足夠了蔓罚。如果您發(fā)現(xiàn)無法定制需要的內(nèi)容罗珍,可以使用embeddedLaunchScript選項完全編寫自己的文件。

在編寫開始腳本時自定義它

在將開始腳本的元素寫入jar文件時脚粟,對其進行自定義通常是有意義的。例如,init.d腳本可以提供“描述”蘸朋。因為您已經(jīng)預(yù)先知道了描述(并且它不需要更改),所以最好在生成jar時提供它。

要自定義編寫的元素诸老,請使用Spring Boot Maven插件的embeddedLaunchScriptProperties選項或Spring Boot Gradle插件的launchScript的properties屬性群凶。

默認腳本支持以下屬性替換:

屬性名 說明 Gradle 默認值 Maven 默認值
mode The script mode. auto auto
initInfoProvides The Provides section of “INIT INFO” ${task.baseName} ${project.artifactId}
initInfoRequiredStart Required-Start section of “INIT INFO”. remote_fssyslog $network remote_fssyslog $network
initInfoRequiredStop Required-Stop section of “INIT INFO”. remote_fssyslog $network remote_fssyslog $network
initInfoDefaultStart Default-Start section of “INIT INFO”. 2 3 4 5 2 3 4 5
initInfoDefaultStop Default-Stop section of “INIT INFO”. 0 1 6 0 1 6
initInfoShortDescription Short-Description section of “INIT INFO”. Single-line version of {project.description} (falling back to{task.baseName}) ${project.name}
initInfoDescription Description section of “INIT INFO”. {project.description} (falling back to{task.baseName}) {project.description} (falling back to{project.name})
initInfoChkconfig chkconfig section of “INIT INFO” 2345 99 01 2345 99 01
confFolder The default value for CONF_FOLDER Folder containing the jar Folder containing the jar
inlinedConfScript Reference to a file script that should be inlined in the default launch script. This can be used to set environmental variables such as JAVA_OPTS before any external config files are loaded
logFolder Default value for LOG_FOLDER. Only valid for an init.d service
logFilename Default value for LOG_FILENAME. Only valid for an init.d service
pidFolder Default value for PID_FOLDER. Only valid for an init.d service
pidFilename Default value for the name of the PID file in PID_FOLDER. Only valid for an init.d service
useStartStopDaemon Whether the start-stop-daemon command, when it’s available, should be used to control the process true true
stopWaitTime Default value for STOP_WAIT_TIME in seconds. Only valid for an init.d service 60 60

在腳本運行時自定義腳本

對于在編寫jar之后需要定制的腳本項,可以使用環(huán)境變量或配置文件炼彪。

默認腳本支持以下環(huán)境屬性:

變量名 說明
MODE The “mode” of operation. The default depends on the way the jar was built but is usually auto (meaning it tries to guess if it is an init script by checking if it is a symlink in a directory called init.d). You can explicitly set it to service so that the stop start status restart commands work or to run if you want to run the script in the foreground.
USE_START_STOP_DAEMON Whether the start-stop-daemon command, when it’s available, should be used to control the process. Defaults to true.
PID_FOLDER The root name of the pid folder (/var/run by default).
LOG_FOLDER The name of the folder in which to put log files (/var/log by default).
CONF_FOLDER The name of the folder from which to read .conf files (same folder as jar-file by default).
LOG_FILENAME The name of the log file in the LOG_FOLDER (<appname>.log by default).
APP_NAME The name of the app. If the jar is run from a symlink, the script guesses the app name. If it is not a symlink or you want to explicitly set the app name, this can be useful.
RUN_ARGS The arguments to pass to the program (the Spring Boot app).
JAVA_HOME The location of the java executable is discovered by using the PATH by default, but you can set it explicitly if there is an executable file at $JAVA_HOME/bin/java.
JAVA_OPTS Options that are passed to the JVM when it is launched.
JARFILE The explicit location of the jar file, in case the script is being used to launch a jar that it is not actually embedded.
DEBUG If not empty, sets the -x flag on the shell process, making it easy to see the logic in the script.
STOP_WAIT_TIME The time in seconds to wait when stopping the application before forcing a shutdown (60 by default).

PID_FOLDER吐根、LOG_FOLDER和LOG_FILENAME變量僅對init.d 方式有效。對于systemd辐马,通過使用“service”腳本進行相同的定制拷橘。

除了JARFILE和APP_NAME之外,可以使用.conf文件配置上一節(jié)中列出的設(shè)置喜爷。這個文件應(yīng)該和 jar 文件在同級目錄中冗疮,并且名字和 jar 文件名字一致。但是后綴是.conf而不是.jar檩帐。例如术幔,名為/var/myapp/myapp.jar使用名為/var/myapp/myapp的配置文件。conf湃密,如下例所示:

myapp.conf

JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log/folder

如果不喜歡將配置文件放在jar文件旁邊诅挑,可以設(shè)置CONF_FOLDER環(huán)境變量來定制配置文件的位置四敞。

本文翻譯原地址:https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拔妥,隨后出現(xiàn)的幾起案子忿危,更是在濱河造成了極大的恐慌,老刑警劉巖毒嫡,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癌蚁,死亡現(xiàn)場離奇詭異,居然都是意外死亡兜畸,警方通過查閱死者的電腦和手機努释,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咬摇,“玉大人伐蒂,你說我怎么就攤上這事「嘏簦” “怎么了逸邦?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長在扰。 經(jīng)常有香客問我缕减,道長,這世上最難降的妖魔是什么芒珠? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任桥狡,我火速辦了婚禮,結(jié)果婚禮上皱卓,老公的妹妹穿的比我還像新娘裹芝。我一直安慰自己,他們只是感情好娜汁,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布嫂易。 她就那樣靜靜地躺著,像睡著了一般掐禁。 火紅的嫁衣襯著肌膚如雪怜械。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天傅事,我揣著相機與錄音宫盔,去河邊找鬼。 笑死享完,一個胖子當著我的面吹牛灼芭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播般又,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼彼绷,長吁一口氣:“原來是場噩夢啊……” “哼巍佑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寄悯,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤萤衰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后猜旬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脆栋,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年洒擦,在試婚紗的時候發(fā)現(xiàn)自己被綠了椿争。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡熟嫩,死狀恐怖秦踪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掸茅,我是刑警寧澤椅邓,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站昧狮,受9級特大地震影響景馁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逗鸣,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一裁僧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慕购,春花似錦、人聲如沸茬底。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阱表。三九已至殿如,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間最爬,已是汗流浹背涉馁。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爱致,地道東北人烤送。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像糠悯,于是被迫代替她去往敵國和親帮坚。 傳聞我的和親對象是個殘疾皇子妻往,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 最近在研究Docker的源碼.讀到ApiServer的啟動過程時,發(fā)現(xiàn)其有一個新的概念,叫做service act...
    AlstonWilliams閱讀 1,124評論 1 4
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,720評論 0 10
  • 當我們使用Spring Boot完成應(yīng)用開發(fā)時试和,我們可以在命令行使用java -jar .jar來啟動我們的應(yīng)用...
    倔強的小亮閱讀 1,200評論 0 1
  • feisky云計算讯泣、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,815評論 0 5
  • 近看了7-11創(chuàng)始人鈴木敏文在零售流通行業(yè)里面浸漬了近50年的心得體會,確實頗具想法阅悍,從一手創(chuàng)辦7-11開始好渠,到不...
    ROYO閱讀 241評論 0 0