最近把客戶端的內測分發平臺使用Spring Boot+Kotlin重構了,之前是用Tomcat部署的,如今改用Jar包部署。因爲是比較簡單的單體應用,因此沒有使用持續集成框架Jenkins
,都是經過FTP上傳到Tomcat目錄,而後重啓Tomcat。java
獲取SSL的簽名這裏就不說了,Google搜索也有不少生成免費的簽名方案,我是把簽名文件放在resources
目錄linux
├── build.gradle
├── gradlew
├── settings.gradle
├── src
│ ├── main
│ │ ├── java
│ │ ├── kotlin
│ │ ├── resources
│ │ │ ├── application.properties
│ │ │ ├── keystore.p12
複製代碼
直接修改application.properties
web
# 端口
server.port=8443
# 簽名路徑
server.ssl.key-store=/Users/Wiki/BetaServer/src/main/resources/keystore.p12
server.ssl.key-store-password=123123
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias:tomcat
複製代碼
Spring自己就提供很是方便支持HTTPS的方式,直接修改application.properties
便可實現HTTPS,可是使用這種方式就不能直接使用HTTP了。apache
咱們在application.properties
自定義了幾個參數tomcat
#HTTP端口
server.port=8080
#配置模SSL
tomcat.ssl.enable=true
tomcat.ssl.key-store=keystore.p12
tomcat.ssl.key-store-password=123123
tomcat.ssl.keyStoreType=PKCS12
tomcat.ssl.port=8443
複製代碼
因爲我是打包成Jar格式文件而後放在服務器運行,意味着resources目錄下的文件沒法獲取到絕對路徑或者相對路徑,咱們換一個作法,咱們在啓動HTTPS的時候把resources的文件讀取出來,寫入到一個臨時的路徑,那麼就能夠解決這個問題。安全
@ConditionalOnExpression(value = "\${tomcat.ssl.enable:false}")
@Configuration
open class CustomTomcatSSLConfiguration {
@Value("\${tomcat.ssl.port:8443}")
private val tomcatSSLPort: Int = 0
@Value("\${tomcat.ssl.key-store:}")
private val tomcatSSLKeyStore: String? = null
@Value("\${tomcat.ssl.key-store-password:}")
private val keystorePassword: String? = null
@Value("\${tomcat.ssl.keyStoreType:PKCS12}")
private val keystoreType: String? = null
@Bean
open fun servletContainer(): ServletWebServerFactory {
val tomcat = TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createSSLConnector())
return tomcat;
}
open fun createSSLConnector(): Connector {
// 因爲下面須要填寫簽名的地址,若是咱們打包成Jar,這個地址就失效了,從 resources 讀取 簽名文件
val stream = javaClass.classLoader.getResourceAsStream(tomcatSSLKeyStore)
// 而後寫入當前應用運行的路徑
val file = File(tomcatSSLKeyStore)
file.writeBytes(stream.readBytes())
val connector = Connector("org.apache.coyote.http11.Http11NioProtocol")
connector.port = tomcatSSLPort;
connector.secure = true
connector.scheme = "https"
connector.setAttribute("SSLEnabled", true)
connector.setAttribute("sslProtocol", "TLS")
connector.setAttribute("protocol", "org.apache.coyote.http11.Http11Protocol")
connector.setAttribute("clientAuth", false)
// 使用臨時的前面文件路徑
connector.setAttribute("keystoreFile", file.absolutePath)
connector.setAttribute("keystoreType", keystoreType)
connector.setAttribute("keystorePass", keystorePassword)
connector.setAttribute("keyPass", keystorePassword)
return connector
}
}
複製代碼
個人使用Gradle來代替Maven,打包很是的方便,直接執行命令打包便可bash
./gradlew bootJar
複製代碼
因爲不是常常更新,因此沒有引入Jenkins
,後續會考慮引入。之前我都是經過FTP上傳war到服務器,而後重啓Tomcat來實現部署。最近我發現一個更加方便的作法,使用scp
命令,能夠實現把當前電腦的文件上傳到服務器。服務器
scp -P 22222 build/libs/BetaServer.jar apps@100.100.100.100:/home/apps/webapp/
複製代碼
咱們都知道Jar的啓動是能夠經過 java -jar BetaServer.jar
便可啓動,可是當咱們關閉命令窗口,這個進程就會被關閉致使服務也被關閉了,因此咱們須要讓這個服務後臺運行,關閉窗口也不受影響。app
nohup java -jar BetaServer.jar > log.txt &
複製代碼
記得不要把後面&
忽略了,整行都是須要的,log.txt
是原來命令行輸出的日誌,咱們把它寫到文件中,也方便咱們後續查看錯誤。框架
因爲上面咱們配置的HTTP是8080端口,HTTPS是8443端口,那麼咱們就能夠經過如下命令訪問
http://100.100.100.100:8080/index
https://100.100.100.100:8443/index
複製代碼
上面的訪問是帶有端口,可是咱們發佈出去的網頁,確定不能讓用戶也須要輸入端口,體驗太差了,咱們要把HTTP的端口改爲80、HTTPS改爲443,那麼理論上就能夠實現這樣訪問
http://100.100.100.100/index
https://100.100.100.100/index
複製代碼
在Linux的下面部署了應用,爲了安全咱們使用非root用戶進行啓動,非root用戶不能監聽1024如下的端口號,若是直接改爲80和443,會報安全性異常。
java.net.SocketException: Permission denied
複製代碼
因此這裏須要使用linux的端口轉發機制,把到80端口的服務請求都轉到8080端口上,443端口轉發到8443。 在root下面運行一下命令:
$ iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
$ iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
$ service iptables save
複製代碼
到這裏就大功告成啦。