1. 程式人生 > >springboot部署到阿里雲,配置https,springboot專案同時支援http和https請求,阿里雲配置https

springboot部署到阿里雲,配置https,springboot專案同時支援http和https請求,阿里雲配置https

最近在學習springboot,感覺springboot開發後臺,提供api介面太方便了。簡直是傻瓜式開發,一直都是本地在跑springboot專案。夢想著有一天,專案能在阿里雲上跑。只有在阿里雲上跑才是真正的java伺服器專案。這裡就帶大家一起把springboot專案部署到阿里雲,並且支援https

準備工作

  • 阿里雲ecs一個
  • ca證書一份(用來支援https)
  • 本地打包好的springboot專案。我這裡用jar不用war

- ftp客戶端一個,用來把jar傳到阿里雲伺服器上,我用的是filezilla客戶端,可以百度下載。

一,購買阿里雲ecs配置安全組規則

  • 如果不配置安全組規則,我們將沒法訪問我們阿里雲伺服器 ,下圖中的80/80和443/443必須配置,因為只有這裡配置了才能支援http和https訪問我們的網站
    阿里雲安全組規則.png
  • 配置如下,授權物件哪裡最好填0.0.0.0/0
    新增安全組規則.png

二,買域名

至於域名怎麼買,我就不囉嗦了,不會的自行百度
30paotui.com我買的域名
域名.png

三,通過filezilla連線阿里雲伺服器,執行專案

ftp連線伺服器.png
我在我的伺服器home目錄下新建一個jar檔案,把打包好的springboot的jar包放到這裡,我的是qcl80.jar
home:jar.png
然後就可以通過 java -jar qcl80.jar 執行springboot專案
執行springboot專案.png
注意:這樣執行springboot專案,如果你關閉當前shell視窗,就會導致伺服器的springboot關閉。因為我們現在用的是springboot自帶的tomcat,不能在後臺執行。

springboot生成的jar在阿里雲的linux伺服器後臺執行,不會在shell客戶端關閉時關閉

後臺執行指令碼.png
通過建立stop.sh , start.sh ,run.sh這三個指令碼檔案來實現後臺長久執行springboot
這裡我把執行的qcl80.jar ,start .sh,stop.sh ,run.sh都放在home下的jar目錄下
1,建立stop.sh
vim stop.sh 建立檔案然後把下面內容複製進去,一定要把qcl80.jar替換成你的jar

#!/bin/bash
PID=$(ps -ef | grep qcl80.jar | grep -v grep | awk '{ print $2 }'
) if [ -z "$PID" ] then echo Application is already stopped else echo kill $PID kill $PID fi

2,建立start.sh,這裡我們用80埠,這樣可以直接通過ip訪問,不用再輸埠了
vim start.sh 輸入這個命令後然後把下面的內容複製進去

#!/bin/bash
nohup java -jar qcl80.jar --server.port=80 &

3,建立run.sh

整合了關閉和啟動的指令碼:run.sh,由於會先執行關閉應用,然後再啟動應用,這樣不會引起埠衝突等問題,適合在持續整合系統中進行反覆呼叫。
把下面內容複製進去,一定要注意複製時不能少東西

#!/bin/bash
echo stop application
source stop.sh
echo start application
source start.sh

4,start .sh,stop.sh ,run.sh都建立後
./run.sh 執行run.sh指令碼
如果遇到沒有許可權執行的問題,就在run.sh所在目錄下執行
chmod u+x *.sh 這樣就ok了。
執行完以後,我們可以去nohup.out檔案中檢視啟動的log
cat nohup.out 這個命令可以檢視jar啟動的log

run.sh啟動jar專案.png

到此我們的springboot專案就啟動了,可以通過你阿里雲的公網ip訪問你的網站了
ip訪問.png

https訪問.png
由於我配置了https,所以這裡用IP訪問會顯示不安全,接下來給大家講解怎麼配置https訪問。

四,配置https

1,申請阿里雲免費的ca證書,ca證書是實現https必不可少的

ca證書購買.png
ca免費購買.png
ca補全資訊.png
通常稽核10分鐘左右就行,如果資料不全或者不真實可能就久些。
- 購買完ca證書,並且稽核通過後,就去下載相應的ca證書,由於我們springboot內建的是tomcat,所以我們這裡下載tomcat對於的ca證書
下載證書.png

下載後解壓
pfx證書.png

然後在我們的springboot配置檔案中配置
ca配置.png

注意:214590826650132.pfx還需要在我們能阿里雲的home/jar目錄下放一份,即和我們的打包jar放在同一個目錄下
ca證書放到阿里雲.png

HTTP自動轉向HTTPS

package com.qcl;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SellApplication implements EmbeddedServletContainerCustomizer {

    public static void main(String[] args) {
        SpringApplication.run(SellApplication.class, args);
    }


    //攔截所有請求
    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }

    //配置http轉https
    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        //Connector監聽的http的埠號
        connector.setPort(80);
        connector.setSecure(false);
        //監聽到http的埠號後轉向到的https的埠號
        connector.setRedirectPort(443);
        return connector;
    }

    //這裡設定預設埠為443,即https的,如果這裡不設定,會https和http爭奪80埠
    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        container.setPort(443);
    }
}

至此,我們的springboot就可以在阿里雲上運行了,同時支援http和https的訪問
https.png