部署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部署項目之旅就此結束了,一路上也是坎坎坷坷,一步一個坑,但是也都一個一個解決了。