記一次Spring Boot項目部署,同時支持HTTP與HTTPS、80與443權限問題

最近把客戶端的內測分發平臺使用Spring Boot+Kotlin重構了,之前是用Tomcat部署的,如今改用Jar包部署。因爲是比較簡單的單體應用,因此沒有使用持續集成框架Jenkins,都是經過FTP上傳到Tomcat目錄,而後重啓Tomcat。java

同時支持HTTP與HTTPS

獲取SSL的簽名這裏就不說了,Google搜索也有不少生成免費的簽名方案,我是把簽名文件放在resources目錄linux

├── build.gradle
├── gradlew
├── settings.gradle
├── src
│   ├── main
│   │   ├── java
│   │   ├── kotlin
│   │   ├── resources
│   │   │   ├── application.properties
│   │   │   ├── keystore.p12
方案一(不推薦,不沒法兼容HTTPS和HTTP)

直接修改application.propertiesweb

# 端口
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

方案二(兼容HTTPS和HTTP)

咱們在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
    }
}
打包Jar

個人使用Gradle來代替Maven,打包很是的方便,直接執行命令打包便可服務器

./gradlew bootJar
上傳Jar到Linux服務器

因爲不是常常更新,因此沒有引入Jenkins,後續會考慮引入。之前我都是經過FTP上傳war到服務器,而後重啓Tomcat來實現部署。最近我發現一個更加方便的作法,使用scp命令,能夠實現把當前電腦的文件上傳到服務器。app

scp -P 22222 build/libs/BetaServer.jar  apps@100.100.100.100:/home/apps/webapp/
啓動Jar

咱們都知道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

到這裏就大功告成啦。

相關文章
相關標籤/搜索