部署spring boot + Vue遇到的坑(權限、刷新404、跨域、內存)
- 2019 年 11 月 8 日
- 筆記
部署spring boot + Vue遇到的坑(權限、刷新404、跨域、內存)
項目背景是採用前後端分離,前端使用vue,後端使用springboot。
工具
工欲善其事必先利其器,我們先找一個操作Linux系統的工具極力推薦FinalShell。
一眼看過去是不是感覺很方便,對內存、CPU的監控也可以實時看到,訪問目錄更是方便,對於Linux小白來說簡直是神兵利器。
好了,我要開始入坑了。
問題一:權限不夠
把vue包放到tomcat->webapps->ROOT目錄下。
啟動tomcat:cd到tomcat的bin目錄下面,然後執行./startup.sh命令。
出現第一個問題:-bash: ./startup.sh: Permission denied ,說是權限不夠。
百度之後,執行此命令:chmod u+x *.sh 再次執行就OK了
問題二:刷新404
我先測試Vue包是否正常,於是啟動tomcat,可以成功訪問頁面,但是刷新時出現了404。
解決404,在tomcat->webapps->ROOT目錄下創建WEB-INF目錄,在WEB-INF目錄下面建web.xml文件
文件內容:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 4 http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 5 version="3.1" metadata-complete="true"> 6 <display-name>Router for Tomcat</display-name> 7 <error-page> 8 <error-code>404</error-code> 9 <location>/index.html</location> 10 </error-page> 11 </web-app>
重啟tomcat,再次刷新,不會再出現404。
問題三:端口佔用&跨域
啟動java -jar xxx.jar 和tomcat 發現有一個會起不來,因為端口被佔用了,springboot打出的jar包,內置了tomcat服務器,如果和外部的服務器端口設置一樣,就會出現端口衝突,如果不一樣,啟動是可以啟動,但是卻會出現跨域問題。
是解決端口衝突還是跨域問題你們怎麼選呢,我就解決端口衝突吧。
後來想到一個辦法,既然jar包不行,那就war包吧
1、把這裡改成war包
1 <packaging>war</packaging>
2、排除內置tomcat容器
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-tomcat</artifactId> 4 <scope>provided</scope> 5 </dependency>
3、修改Application類,讓它繼承SpringBootServletInitializer,如下。
1 @SpringBootApplication 2 public class Application { 3 4 public static void main(String[] args) { 5 SpringApplication.run(Application.class, args); 6 } 7 8 }
改成:
1 @SpringBootApplication 2 public class Application extends SpringBootServletInitializer { 3 4 public static void main(String[] args) { 5 SpringApplication.run(Application.class, args); 6 } 7 8 @Override 9 protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { 10 return builder.sources(Application.class); 11 } 12 }
問題四:配置docbase
打完war包,訪問接口時要加項目名稱,為了讓前端不再改代碼,就在tomcat->bin->server.xml中加上如下配置:
<Context path="" docBase="/webapps/項目名稱" reloadable="true" />
好,重啟tomcat,發現頁面訪問不到了,猜測是因為改了docbase路徑,才導致的,於是把Vue文件放到項目路徑下面,
重啟tomcat,可以訪問,但是刷新頁面404又出現了,就是加了web.xml文件也不行。
頭疼了好半天,行吧,不折騰了,我去折騰前端去,“前端小姐姐,把你的url路徑上都加上項目名稱”
前端小姐姐:“好的”。
“卧槽,這麼好說話”。
折騰完之後,把之前的配置再改回去。
去掉了docbase的配置,Vue文件還是放在ROOT下面。
好了,重啟tomcat,訪問項目,完美解決,心裏高興了好一會兒,卧槽,牛逼呀,給自己點個贊。
問題五:內存不夠
我怕是高興的太早了。
因為項目的更新,我做的反覆操作就是,./shutdown.sh和./srartup.sh。反覆的關閉tomcat和打開tomcat。
用着用着發現啟動不了了,啟動的時候,報了一個內存不夠的錯誤(當時沒截圖,現在不想折騰去重現這個問題了,這裡就簡單描述一下)。
一看FinalShell,卧槽,內存佔用完了(現在的圖是後來截的,所有顯示的是內存還夠)。
當時已經用到了15.4G,卧槽,瞬間崩潰,頭都大了沒找到原因。最後看一下哪些進程佔用了內存吧,
查看所有進程
1 ps -ef
查看tomcat進程
1 ps -ef | grep tomcat
發現有好三個tomcat進程,而且都是同一個tomcat,因為服務器部署了幾個tomcat,看路徑可以看出是同一個。但是不對呀,我每次都是先關閉tomcat,再打開,不可能會出現這麼多進程呀。
猜想不會是./shutdown.sh只會關閉tomcat不會殺死進程吧,卧槽,上網一搜有的說可以直接殺死進程,有的說不行,不管怎樣都要解決呀。
問了度娘,度娘給我兩種方案,
一種是直接殺死進程,kill -s 9 PID ,殺死PID的進程,法相確實是,殺死了兩個,發現內存瞬間降下來了 。
但是我每次關閉tomcat之後,再殺進程,那也太麻煩了。
於是用了第二種方案。
第一步 :vim修改tomcat下bin/catalina.sh文件,添加點東西,主要是記錄tomcat的pid,如下:
1 #設置記錄CATALINA_PID。 2 3 #該設置會在啟動時候bin下新建一個CATALINA_PID文件 4 5 #關閉時候從CATALINA_PID文件找到pid,kill。。。同時刪除CATALINA_PID文件 6 7 if [ -z "$CATALINA_PID" ]; then 8 9 CATALINA_PID=$PRGDIR/CATALINA_PID 10 11 fi
第二步 vim tomcat的shutdown.sh文件,在最後一行加上-force:
問題六:tomcat啟動
好,啟動tomcat,訪問正常,解決完畢,收工,關閉FinalShell,第一次再Linux上部署項目出現的問題都一步一步解決了,但是怎麼感覺事情沒那麼簡單。
果然,關閉FinalShell之後,項目訪問不了了。卧槽,無情 ,是不是要這樣折騰我。上網搜了之後發現:
1、啟動tomcat服務
方式一:直接啟動 ./startup.sh
方式二:作為服務啟動 nohup ./startup.sh &
方式三:控制台動態輸出方式啟動 ./catalina.sh run 動態地顯示tomcat後台的控制台輸出信息,Ctrl+C後退出並關閉服務
2、解釋
通過方式一、方式三啟動的tomcat有個弊端,當客戶端連接斷開的時候,tomcat服務也會立即停止,
通過方式二可以作為linux服務一直運行 通過方式一、方式二方式啟動的tomcat,其日誌會寫到相應的日誌文件中,而不能動態地查看tomcat控制台的輸出信息與錯誤情況,
通過方式三可以以控制台模式啟動tomcat服務,
直接看到程序運行時後台的控制台輸出信息,不必每次都要很麻煩的打開catalina.out日誌文件進行查看,這樣便於跟蹤查閱後台輸出信息。tomcat控制台信息包括log4j和System.out.println()等輸出的信息。
最後nohup ./startup.sh &這樣啟動,完美解決。小夜的第一次Linux部署項目之旅就此結束了,一路上也是坎坎坷坷,一步一個坑,但是也都一個一個解決了。