歡迎加群交流(Spring Boot技術交流):490788638
Part V. Spring Boot Actuator: 生產准備功能
Spring Boot包括一些額外的功能,可幫助您在應用程序推送到生產環境時對其進行監控和管理。 您可以選擇使用HTTP端點,JMX或甚至遠程shell(SSH或Telnet)來管理和監視應用程序。 審計,健康和指標收集可以自動應用於您的應用程序。
執行器HTTP端點僅適用於基於Spring MVC的應用程序。 特別是,除了啟用Spring MVC之外,它也不適用於Jersey。
59. 安裝Spring Boot應用程序
除了使用java -jar運行Spring Boot應用程序外,還可以為Unix系統打包完全可執行的應用程序。 這使得在常見的生產環境中安裝和管理Spring Boot應用程序非常容易。
要使用Maven創建“完全可執行”的jar,請使用以下插件配置:
1
2
3
4
5
6
7
|
<plugin>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-maven-plugin
</artifactId>
<configuration>
<executable>true
</executable>
</configuration>
</plugin>
|
使用Gradle:
1
2
3
|
springBoot {
executable = true
}
|
然后,您可以通過鍵入./my-application.jar(其中my-application是您工程的artifact的名稱)來運行應用程序。
完全可執行的jar通過在文件的前面嵌入一個額外的腳本來工作。 並不是所有的工具目前都接受這種格式,所以你可能並不總是能夠使用這種技術。
默認腳本支持大多數Linux發行版,並在CentOS和Ubuntu上進行了測試。 其他平台,如OS X和FreeBSD,將需要使用自定義的embeddedLaunchScript。
當運行完全可執行的jar時,它將使用jar的目錄作為工作目錄。
59.1 Unix/Linux 服務
Spring Boot應用程序可以使用init.d或systemd輕松地作為Unix / Linux服務啟動。
59.1.1 作為init.d服務進行安裝(System V)
如果您配置了Spring Boot的Maven或Gradle插件來生成完全可執行的jar,並且您沒有使用自定義的embeddedLaunchScript,那么您的應用程序可以用作init.d服務。 簡單地將jar鏈接到init.d以支持標准的start,stop,restart和status命令。
該腳本支持以下功能:
- 以擁有該jar文件的用戶啟動服務
- 使用/var/run//.pid跟蹤應用程序的PID
- 將控制台日志寫入/var/log/.log
假設你有一個Spring Boot應用程序安裝在 /var/myapp 中,安裝Spring Boot應用程序作為init.d服務只需創建一個符號鏈接:
1
|
sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp
|
一旦安裝,您可以按照Linux系統常用的方式啟動和停止服務。 例如,在基於Debian的系統上:
1
|
$ service myapp start
|
如果您的應用程序無法啟動,請檢查寫入/var/log/.log的日志文件是否有錯誤日志。
您還可以將應用程序標記為使用標准操作系統工具自動啟動。 例如Debian:
1
|
$ update-rc.d myapp defaults <priority>
|
保護init.d服務
以下是關於如何保護作為init.d服務運行的Spring Boot應用程序的一組指導。 它並不是為了強化應用程序和運行環境而應該做的所有事情的詳盡列表。
當以root身份執行時,如使用root用於啟動init.d服務的情況,默認可執行腳本將以擁有該jar文件的用戶身份運行應用程序。 您不應該以root身份運行Spring Boot應用程序,因此您的應用程序的jar文件不應該由root擁有。 相反,創建一個特定的用戶來運行應用程序,並使用chown將其作為jar文件的所有者。 例如:
1
|
$ chown bootapp:bootapp your-app.jar
|
在這種情況下,默認的可執行腳本將作為bootapp用戶運行應用程序。
為了減少應用程序的用戶帳戶遭到入侵的機會,您應該考慮防止其使用登錄shell。 例如,將帳戶的shell設置為 /usr/sbin/nologin 。
您還應該采取措施來阻止修改jar文件。 首先,配置其權限,使其不能被寫入,並且只能由其所有者讀取或執行:
1
|
$ chmod 500 your-app.jar
|
其次,如果您的應用程序或運行它的帳戶被泄露,您還應該采取措施限制jar包被損壞。如果攻擊者獲得訪問權限,他們可以使jar文件可寫,並更改其內容。防止這種情況的一種方法是使用chattr使其變得不可變:
1
|
$ sudo chattr +i your-app.jar
|
這將阻止任何用戶(包括root)修改該jar。
如果使用root來控制應用程序的服務,並且使用.conf文件來自定義其啟動,那么root用戶將讀取和評估該.conf文件。 應該保證相應的安全。 使用chmod,以便該文件只能由所有者讀取,並使用chown使root成為所有者:
1
2
|
$ chmod 400 your-app.conf
$ sudo chown root:root your-app.conf
|
59.1.2 作為systemd服務進行安裝
Systemd是System V init系統的后繼者,現在被許多現代Linux發行版使用。盡管您可以繼續使用systemd的init.d腳本,但也可以使用systemd’service’腳本啟動Spring Boot應用程序。
假設您在 /var/myapp 中安裝了一個Spring Boot應用程序,要將Spring Boot應用作為系統服務安裝為使用以下示例創建名為myapp.service的腳本,並將其放在 /etc/systemd/system 目錄中:
1
2
3
4
5
6
7
8
9
10
11
|
[Unit]
Description=myapp
After=syslog.target
[Service]
User=myapp
ExecStart=/var/myapp/myapp.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
|
請記住更改應用程序的Description,User 和ExecStart 字段。
請注意,ExecStart字段不聲明腳本操作命令,這意味着默認情況下使用run命令。
請注意,與運行init.d服務不同,運行應用程序,PID文件和控制台日志文件的用戶由systemd本身管理,因此必須使用“service”腳本中的相應字段進行配置。 有關詳細信息,請參閱服務單元配置手冊頁。
請注意,與運行init.d服務不同,運行應用程序,PID文件和控制台日志文件的用戶由systemd本身管理,因此必須使用“service”腳本中的相應字段進行配置。 有關詳細信息,請參閱服務單元配置手冊頁。
要將應用程序標記為在系統啟動時自動啟動,請使用以下命令:
1
|
$ systemctl enable myapp.service
|
有關詳細信息,請參閱man systemctl。
59.1.3 自定義啟動腳本
由Maven或Gradle插件編寫的默認嵌入式啟動腳本可以通過多種方式進行自定義。 對於大多數人來說,使用默認腳本以及一些自定義項通常就足夠了。 如果您發現無法自定義需要的內容,則可以隨時使用embeddedLaunchScript選項來完全編寫自己的文件。
編寫自定義腳本
在將起始腳本寫入jar文件時,自定義元素是很有意義的。 例如,init.d腳本可以提供一個“描述”,因為你知道這一點(它不會改變),你可以在生成jar時提供它。