部署spring boot + 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目录下面建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部署项目之旅就此结束了,一路上也是坎坎坷坷,一步一个坑,但是也都一个一个解决了。

原文地址:https://www.cnblogs.com/yeshensi/p/11812391.html

时间: 2024-11-06 07:24:43

部署spring boot + Vue遇到的坑(权限、刷新404、跨域、内存)的相关文章

Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目

在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集群中去.这个才是我们最终的目标.众所周知,k8s 是目前最火的容器编排项目,很多公司都使用它来构建和管理自己容器集群,可以用来做机器学习训练以及 DevOps 等一系列的事情. 在这里,我们聚焦 CI/CD,针对于 Spring Boot 项目,借助 Gitlab CI 完成流水线的任务配置,最终部

初学spring boot踩过的坑

一.搭建spring boot环境 maven工程 pom文件内容 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-

spring boot + vue + element-ui全栈开发入门——开篇

最近经常看到很多java程序员朋友还在使用Spring 3.x,Spring MVC(struts),JSP.jQuery等这样传统技术.其实,我并不认为这些传统技术不好,而我想表达的是,技术的新旧程度体现了做项目时的生产力.生产力低了,项目的开发成本就高.反之,生产力高,则成本低.笔者写本系列的目的是让使用“前后端不分离”的老技术的开发者做一个入门级的过度.因为目前流行的“前后端分离”技术足够简单,足够方便,足够易学,也足够完善. 项目所使用的前端技术是:element-ui,文档地址是:ht

Spring Boot(十六):使用Jenkins部署Spring Boot

Spring Boot(十六):使用Jenkins部署Spring Boot jenkins是devops神器,介绍如何安装和使用jenkins部署Spring Boot项目 jenkins搭建 部署分为四个步骤: 第一步,jenkins安装 第二步,插件安装和配置 第三步,Push SSH 第四步,部署项目 第一步 ,jenkins安装 1,准备环境 JDK:1.8Jenkins:2.83 Centos:7.3maven 3.5 注意;jdk 默认已经安装完成 2,配置 maven 版本要求m

在CentOS 7上安装docker,部署spring boot

一.查看linux版本:lsb_release -a (如没有这个命令,安装:yum install -y redhat-lsb) uname -r docker 在centos安装,需要centos 7以上版本. 二.docker 安装操作步骤 docker 官网 :  https://docs.docker.com/get-started 安装必要的工具:Install required packages. yum-utils provides the yum-config-manager 

spring boot + vue + element-ui全栈开发入门——基于Electron桌面应用开发

 前言 Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环境中,并将其打包为Mac,Windows和Linux系统下的应用来实现这一目的. Electron于2013年作为构建Github上可编程的文本编辑器Atom的框架而被开发出来.这两个项目在2014春季开源. 目前它已成为开源开发者.初创企业和老牌公司常用的开发工具. 看看谁在使用Electron

【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志

如题: docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志 场景再现: docker部署并启动了  springboot服务,容器启动正常,docker exec 也可以正常进入容器内部,但是docker logs 控制台并没有日志打印出来. 同样的,/var/lib/docker/containers目录下的对应容器目录中,也没有对应的 *-json.log日志文件生成. 原因: dock

Spring Boot + Vue 跨域请求问题

使用Spring Boot + Vue 做前后端分离项目搭建,实现登录时,出现跨域请求 Access to XMLHttpRequest at 'http://localhost/open/login' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. V

部署spring boot到tomcat服务器上

在tomcat里部署spring boot项目成功,访问:服务器地址+端口+项目名称 问题:在idea里使用tomcat部署spring boot项目,启动成功,却是访问失败? 原文地址:https://www.cnblogs.com/devin-sl/p/12108684.html