前言:
我的后端項目是Java寫的,用的Springboot框架。在部署服務器並配置https訪問過程中,因為做了一些令人窒息的操作(事后發現),所以老是不能成功。
不成功具體點說就是:域名地址可以正常訪問(http/https均可),而部署在服務器上的API仍然只能通過http訪問,通過https訪問會顯示不安全連接!
通過提交工單,得到阿里雲工作人員的幫助,他們給出了答案:
然后我想,我好像知道是咋回事了呢。
1. Springboot框架是內嵌有tomcat的!!我只是把項目打成Jar包放到了我配置在服務器上的tomcat的webapps下,然后手動通過命令來運行程序。所以我用的還是內嵌的tomcat。
2. 我從阿里雲上下載的SSL證書直接配置在服務器的tomcat上,所以它自然而然就跟我寫的接口沒啥關系了。
問題解決:
先思考一個問題:到底准備用Springboot內嵌的tomcat還是用服務器上的外部tomcat?
所以我無外乎兩條路走:
1. 內嵌tomcat:在Springboot項目中直接配置SSL證書,使其可以通過https被訪問;項目依然以Jar形式在服務器被運行。
2. 外部tomcat:剔除Springboot項目中的內嵌tomcat,修改項目相關配置,將其打成War包放到服務器的tomcat下加載運行。
實踐:
前提:
- 無論哪種方式,都需要先在服務器上下載安裝好Java環境哦(⊙o⊙);
- 准備好SSL證書!阿里雲買域名就送了免費的證書,下載tomcat對應的證書文件!
方式一:使用內嵌tomcat部署程序 -- Jar包方式運行
參考文章:部署到阿里雲,配置https,springboot項目同時支持http和https請求,阿里雲配置https
1. 將在阿里雲下載好的SSL證書文件(.pfx格式)和密碼文件,先放到src/main/resource文件夾下,再在項目下application.properties文件中配置證書信息。
2. 在Springboot啟動程序中修改增加一些信息,如下:
1 import org.apache.catalina.Context; 2 import org.apache.catalina.connector.Connector; 3 import org.apache.coyote.http11.Http11NioProtocol; 4 import org.apache.tomcat.jni.File; 5 import org.apache.tomcat.util.descriptor.web.SecurityCollection; 6 import org.apache.tomcat.util.descriptor.web.SecurityConstraint; 7 import org.springframework.boot.SpringApplication; 8 import org.springframework.boot.autoconfigure.SpringBootApplication; 9 import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; 10 import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; 11 import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; 12 import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; 13 import org.springframework.context.annotation.Bean; 14 import org.springframework.core.io.ClassPathResource; 15 16 @SpringBootApplication 17 public class HappyseatApplication implements EmbeddedServletContainerCustomizer { 18 19 public static void main(String[] args) { 20 SpringApplication.run(HappyseatApplication.class, args); 21 } 22 23 // 根據spring boot 1.5.X以下版本,添加這個!注意,版本不同添加的不一樣↓↓↓↓ 24 @Bean 25 //攔截所有請求 26 public EmbeddedServletContainerFactory servletContainer() { 27 TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); 28 tomcat.addAdditionalTomcatConnectors(httpConnector()); // 添加http 29 return tomcat; 30 } 31 // 根據spring boot 1.5.X以下版本,添加這個!注意,版本不同添加此方法有所不同 ↑↑↑↑ 32 33 //配置http轉https 34 @Bean 35 public Connector httpConnector() { 36 Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL); 37 connector.setScheme("http"); 38 //Connector監聽的http的端口號 39 connector.setPort(80); 40 connector.setSecure(false); 41 //監聽到http的端口號后轉向到的https的端口號 42 connector.setRedirectPort(443); 43 return connector; 44 } 45 46 //這里設置默認端口為443,即https的,如果這里不設置,會https和http爭奪80端口 47 @Override 48 public void customize(ConfigurableEmbeddedServletContainer container) { 49 container.setPort(443); 50 } 51 52 53 }
3. 直接用 eclipse生成Jar包😀
4. 上傳服務器:將Jar包和證書文件傳到新建的/home/myapp目錄下,如圖:(ps:使用rz工具包可以傳本地文件到服務器上,但需要在本地的遠程連接工具中使用才可行)
5. 啟動程序!使用命令 nohup java -jar happyseat.jar >runlog.txt 2>&1 & 啟動程序,加上nohup是為了讓程序在shell窗口關閉后依舊運行在后台。
6. 使用命令 netstat -atunlp 查看有關接口情況:發現剛剛啟動的程序停止了,而443端口在運行的進程也不是剛剛啟動得到的進程號。
7. 查看日志也可以發現是說443端口已經被占用了,所以我就直接 kill 1907 ,再重新啟動了我的程序。正常加載運行了~
8. 接下來在瀏覽器中測試 https + 域名 + /hello,發現成功啦!
9. 不過我很憂桑地發現,訪問域名不能正常加載之前的頁面了。。。因為之前的域名對應的網站是WordPress里的網站信息,我試着登網站也登不上了。
然后我嘗試把我自己程序的端口改了,443端口也沒有被占用,可是還是不行orz...tomcat日志里還是Address already in use.可能是配置文件出毛病了,回頭再試試吧。。
后續:修改了訪問接口的端口號,在項目文件中,第二步的配置信息都刪了(( ╯□╰ ))。然后重啟服務器后Wordpress站點和接口都可以了。
我特意看了一下端口對應的進程情況,正常的時候443端口和80端口是有httpd服務在運行,所以還是建議換端口哦(⊙o⊙)。
方式二:用服務器上安裝的外部tomcat自動加載程序包--War包加載運行
(大前提:服務器上安裝了項目對應的tomcat版本喏!
按照網上很多方案試過,暫時還沒成功,成功了更。。