部署springboot+Vue遇到的坑(权限、刷新404、跨域、内存)
部署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⽬录下⾯建l⽂件
  ⽂件内容:
1<?xml version="1.0" encoding="UTF-8"?>
2<web-app xmlns="/xml/ns/javaee" xmlns:xsi="/2001/XMLSchema-instance"
3xsi:schemaLocation="/xml/ns/javaee
4/xml/ns/javaee/web-app_3_1.xsd"
5version="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。
问题三:端⼝占⽤&跨域
  启动j ava -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
2public class Application {
3
4public static void main(String[] args) {
5        SpringApplication.run(Application.class, args);
6    }
7
8 }
  改成:
1 @SpringBootApplication
2public class Application extends SpringBootServletInitializer {
3
4public static void main(String[] args) {
5        SpringApplication.run(Application.class, args);
6    }
7
8    @Override
9protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
10return builder.sources(Application.class);
11    }
12 }
问题四:配置docbase
  打完war包,访问接⼝时要加项⽬名称,为了让前端不再改代码,就在tomcat->bin-&l中加上如下配置:
<Context path="" docBase="/webapps/项⽬名称"  reloadable="true"/>
  好,重启tomcat,发现页⾯访问不到了,猜测是因为改了docbase路径,才导致的,于是把Vue⽂件放到项⽬路径下⾯,
  重启tomcat,可以访问,但是刷新页⾯404⼜出现了,就是加了l⽂件也不⾏。
  头疼了好半天,⾏吧,不折腾了,我去折腾前端去,“前端⼩,把你的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
7if [ -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、解释
springframework和springboot  通过⽅式⼀、⽅式三启动的tomcat有个弊端,当客户端连接断开的时候,tomcat服务也会⽴即停⽌,
  通过⽅式⼆可以作为linux服务⼀直运⾏通过⽅式⼀、⽅式⼆⽅式启动的tomcat,其⽇志会写到相应的⽇志⽂件中,⽽不能动态地查看tomcat控制台的输出信息与错误情况,
  通过⽅式三可以以控制台模式启动tomcat服务,
  直接看到程序运⾏时后台的控制台输出信息,不必每次都要很⿇烦的打开catalina.out⽇志⽂件进⾏查看,这样便于跟踪查阅后台输出信息。tomcat控制台信息包括log4j和System.out.println()等输出的信息。
  最后nohup ./startup.sh &这样启动,完美解决。⼩夜的第⼀次Linux部署项⽬之旅就此结束了,⼀路上也是坎坎坷坷,⼀步⼀个坑,但是也都⼀个⼀个解决了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。