war包部署到騰訊雲中報404的排錯經歷
專案完成了部分功能,需要把專案放到公網上,方便演示討論。本來以為挺簡單的,直接將war包放到騰訊雲伺服器tomcat中,結果報錯404,第一次碰到這種情況,於是想辦法解決,花了一天的時間,終於解決了問題,和大家分享一下解決的過程,希望對大家有所幫助。解決的途徑還是靠百度以及參考資料,分析可能的原因,然後不斷測試,直到問題解決。
一 問題描述
專案使用的開發工具是IntelliJ IDEA,執行web專案程式,在本地進行測試,頁面能夠正常開啟並且測試結果符合預期。將web專案程式打成了war包,放到區域網伺服器的tomcat的webapps目錄中,然後重新啟動伺服器的tomcat,再進行程式功能測試,頁面能夠正常開啟並且測試結果符合預期。將war包放到騰訊雲伺服器的tomcat的webapps目錄中,重新啟動tomcat,再進行測試,發現404錯誤,不能正常定位到程式頁面。
二 問題分析
由於同一個war包在本地和區域網都能正常執行,而在騰訊雲中不能正常執行,所以分析本機、區域網伺服器和騰訊雲伺服器之間的區別,查詢不同點。首先是考慮是不是騰訊雲的安全機制,對於訪問的埠有限制,騰訊雲伺服器確實有埠訪問控制,可以設定開放某些常用埠,比如web服務埠(80,443,8080),SSH登入埠(22),mysql埠(3306)等,埠放開後,問題依然沒有解決。第二考慮是不是jdk,tomcat的版本問題,jdk使用的版本都是jdk8,具體版本有點差別,修改為統一的版本。Tomcat的版本情況類似,也修改為統一的版本。版本統一後,測試,問題依舊存在。第三,考慮作業系統的不同對程式的影響,本地和區域網都是在windows環境中,tomcat啟動時,都能實時看到tomcat的日誌資訊,有什麼問題一目瞭然。而騰訊雲用的是centos7,linux作業系統,tomcat啟動後,實時日誌資訊不能看到,也就不知道tomcat在啟動過程中是否發生了錯誤,為了實時檢視tomcat的日誌資訊,在重啟tomcat後,開啟日誌檔案。
三 問題解決
在linux系統,切換到tomcat的bin目錄,依次鍵入
./shutdown.sh
./startup.sh
重啟tomcat,然後切換到tomcat的logs目錄,鍵入
tail -f catalina.out
就可以實時檢視tomcat的日誌資訊,日誌資訊比較多,不過錯誤資訊也是很明顯的,和用開發工具除錯的時候碰到的報錯資訊類似,很容易發現。報錯資訊的開頭,就是如下的一段。
Unable to register MBean [HikariDataSource (null)] with key 'dataSource'; nested exception is javax.management.InstanceAlreadyExistsException: com.zaxxer.hikari:name=dataSource,type=HikariDataSource
百度了一下,問題解答定位到了StackOverflow網站,不得不說,StackOverflow上的大牛們確實很熱心,有靠譜的回答,試了試,果然管用。
方法就是在配置檔案application.properties中,進行如下設定
spring.jmx.enabled=false
重新生成war包,測試,頁面能夠正常開啟,功能也都正常。
四 一些未解決的疑惑
雖然問題解決了,但還是有些疑惑的地方,比如同樣的war包,在windows環境中能夠使用,到了linux環境中報錯,具體原因不是太瞭解。再有就是報錯的大概意思是不能註冊MBean,解決的辦法就是不註冊,直接將jmx設定為false,雖然專案能夠執行,但不知道具體的影響有哪些。這些問題可能還需要在實踐中摸索。
最後希望對大家除錯程式有所幫助,如果有大牛對我提出的疑問,有好的解答,也請不吝賜教。