最近把客戶端的內測分發平臺使用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,打包很是的方便,直接執行命令打包便可服務器
./gradlew bootJar
因爲不是常常更新,因此沒有引入Jenkins
,後續會考慮引入。之前我都是經過FTP上傳war到服務器,而後重啓Tomcat來實現部署。最近我發現一個更加方便的作法,使用scp
命令,能夠實現把當前電腦的文件上傳到服務器。app
scp -P 22222 build/libs/BetaServer.jar apps@100.100.100.100:/home/apps/webapp/
咱們都知道Jar的啓動是能夠經過 java -jar BetaServer.jar
便可啓動,可是當咱們關閉命令窗口,這個進程就會被關閉致使服務也被關閉了,因此咱們須要讓這個服務後臺運行,關閉窗口也不受影響。框架
nohup java -jar BetaServer.jar > log.txt &
記得不要把後面&
忽略了,整行都是須要的,log.txt
是原來命令行輸出的日誌,咱們把它寫到文件中,也方便咱們後續查看錯誤。webapp
因爲上面咱們配置的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
到這裏就大功告成啦。