草庐IT

04-项目部署到Linux

OnlyOnYourself-lzw 2023-04-17 原文

三、项目部署

之前我们讲解Linux操作系统时,就提到,我们服务端开发工程师学习Linux系统的目的就是将来我们开发的项目绝大部分情况下都需要部署在Linux系统中。那么在本章节,我们将通过两种方式,来演示项目部署,分别是:手动部署项目 和 基于shell脚本自动部署。

3.1、手动部署项目

3.1.1、在IDEA中开发SpringBoot项目并打包成jar包

  • 创建一个简单的项目,结构如下所示

  • 项目运行结果

  • 执行package指令,进行打包操作,将当前的SpringBoot项目,打包成jar包

    • 操作步骤

      • Step1

        •  <build>
                  <!--指定jar的名字-->
                  <finalName>helloworld</finalName>
                  <plugins>
                      <plugin>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>spring-boot-maven-plugin</artifactId>
                      </plugin>
                  </plugins>
              </build>
          
      • Step2

        • # 清理、打包 跳过测试
          mvn clean package -Dmaven.test.skip=true
          
      • Step3

        • # 运行
          java -jar xxx.jar
          
      • Step4

3.1.2、将jar包上传到Linux并运行

  • 将打好的jar包上传至Linux服务器的 /usr/local/app 目录下
    • mkdir /usr/local/app
    • cd /usr/local/app
  • 启动SpringBoot项目
    • 由于我们的项目已经打成jar包上传上来到Linux服务器,我们只需要运行这个jar包项目就启动起来了,所以只需要执行如下指令即可:
    • java -jar helloworld.jar
    • 运行结果
  • PS
    • 由于前面安装的Tomcat在启动时,会占用端口号8080,而当前springboot项目我们没有配置端口号,默认也是8080,所以我们要想启动springboot项目,需要把之前运行的Tomcat停止掉
  • 开放端口,确保端口对外开放,可以访问SpringBoot项目
    • firewall-cmd --zone=public --list-ports
    • 如果防火墙没有开放对应的端口,还需要先开放端口
      • firewall-cmd --zone=public --add-port=8080/tcp --permanent
      • firewall-cmd --reload
  • 访问测试
  • 成功运行项目后的问题
    • 当前我们项目启动的这个窗口被霸屏占用了,如果我们把这个窗口关闭掉(或ctrl+c),当前服务也就访问不到了

3.1.3、手动部署项目优化

  • 解决上述霸屏问题的解决方法就是让部署的项目在后台运行
  • 这个时候我们需要使用到linux中的一个命令 nohup ,接下来,就来介绍一下nohup命令
    • nohup命令:英文全称 no hang up(不挂断),用于不挂断地运行指定命令,退出终端不会影响程序的运行
    • 语法格式: nohup Command [ Arg … ][&]
    • 参数说明:
      • Command:要执行的命令
      • Arg:一些参数,可以指定输出文件
      • &:让命令在后台运行
    • 举例:
      • nohup java -jar boot工程.jar &> hello.log &
      • 上述指令的含义为: 后台运行 java -jar 命令,并将日志输出到hello.log文件
  • 综上所得,要想让当前项目在后台运行,就可以使用以下命令
    • nohup java -jar helloworld-1.0-SNAPSHOT.jar &> hello.log &
  • 这样的话,我们的项目就已经启动成功了,我们可以通过ps指令,查看到系统的进程
  • 接下来,我们再次访问我们的项目,来看看服务是否可用
    • 这时候可以查看以下hello.log文件是否正常输出日志
  • 停止项目
    • 直接杀死进程:kill -9 pid

3.2、基于Shell脚本自动部署

3.2.1、介绍

  • 前面介绍的项目部署是手动部署,也就是部署过程中的每一步操作都需要我们手动操作。接下来,我们需要再讲解一下项目的自动部署,从而来简化项目部署的操作,那么我们先来整体上了解一下项目自动部署的流程及操作步骤
    • 具体操作步骤如下
      • ①、在Gitee上创建远程仓库,并将本地的项目代码推送到远程仓库中
      • ②、在Linux中安装Git,克隆代码
      • ③、在Linux中安装maven
      • ④、编写Shell脚本(拉取代码、编译、打包、启动)
      • ⑤、为用户授予执行Shell脚本的权限
      • ⑥、执行Shell脚本

3.2.2、推送代码到远程仓库

1)创建远程仓库

自行创建

2)推送代码到远程仓库

自行推送一个简单示例项目即可

3.2.3、Git操作

1)Git软件安装

  • 通过yum命令在线安装git,执行如下指令
    • yum list git:列出git安装包
    • yum install git:在线安装git
  • 通过上述指令,安装好git之后,我们就可以通过git --version去验证git的环境

2)Git克隆代码

  • 先切换到指定的目录,如/usr/local,执行如下指令
    • git clone 要克隆的远程仓库地址(然后输入个人的Git账号密码)

3.2.4、Maven安装

1)官网下载Maven的压缩包

  • apache-maven-3.5.4-bin.tar.gz,自行选择对应版本号在官网下载即可

2)解压Maven压缩包

  • 自行解压到指定目录即可
    • tar -zxvf apache-maven-3.5.4-bin.tar.gz -C 指定目录

3)配置环境变量

  • /etc/profile配置文件中配置环境变量

    • vim /etc/profile

    • 增加如下内容

    • MAVEN_HOME=/usr/local/apache-maven-3.5.4/
      PATH=$JAVA_HOME\bin:$PATH:$MAVEN_HOME\bin
      export JAVA_HOME PATH MAVEN_HOME
      
    • PS:这里面的JAVA_HOME是之前配置的,忽略即可

  • 要让配置的环境变量生效,还需要执行如下指令

    • source /etc/profile

4)修改maven的settings.xml配置文件

  • 配置本地仓库地址

    • 切换目录

      • cd /usr/local/apache-maven-3.5.4/conf
    • 编辑setting.xml配置文件

      • vim setting.conf
    • 在其中增加如下配置,添加本地仓库地址

      • <localRepository>/usr/local/maven-reposity</localRepository>
    • 同时在<mirrors>标签中,配置阿里云的私服

      • <mirror> 
            <id>alimaven</id> 
            <mirrorOf>central</mirrorOf> 
            <name>aliyun maven</name> 
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </mirror> 
        

3.2.5、Shell脚本准备

Shell脚本(shell script),是一种Linux系统中的脚本程序。使用Shell脚本编程跟 JavaScript、Java编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了

  • 本次测试不作为学习内容,直接使用现成的demo即可
  • 脚本解读

3.2.6、Linux权限

  • 根据上面步骤执行完后,Shell脚本要想正常的执行,还需要给Shell脚本分配执行权限。 由于linux系统是一个多用户的操作系统,并且针对每一个用户,Linux会严格的控制操作权限。接下来,我们就需要介绍一下Linux系统的权限控制

    • 1). chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令
    • 2). Linux中的权限分为三种 :读(r)、写(w)、执行(x)
    • 3). Linux文件权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)
    • 4). 只有文件的所有者和超级用户可以修改文件或目录的权限
    • 5). 要执行Shell脚本需要有对此脚本文件的执行权限(x),如果没有则不能执行
  • 解析当前脚本的权限情况

  • chmod命令可以使用八进制来指定权限(0 - 代表无, 1 - 表示执行x,2 - 写w, 4 - 读r

    • 权限 rwx rwx
      7 读 + 写 + 执行 rwx
      6 读 + 写 rw-
      5 读 + 执行 r-x
      4 只读 r--
      3 写 + 执行 -wx
      2 只写 -w-
      1 只执行 --x
      0 ---
  • 举例

    • chmod 777 bootStart.sh 为所有用户授予读、写、执行权限
    • chmod 755 bootStart.sh 为文件拥有者授予读、写、执行权限,同组用户和其他用户授予读、执行权限
    • chmod 210 bootStart.sh 为文件拥有者授予写权限,同组用户授予执行权限,其他用户没有任何权限
  • 注意:

    • 三个数字分别代表不同用户的权限
      • 第1位表示文件拥有者的权限
      • 第2位表示同组用户的权限
      • 第3位表示其他用户的权限

3.2.7、授权并执行脚本

  • 在测试阶段,我们可以给所有的人都赋予执行该shell脚本的权限。所以可以执行如下指令
    • chmod 777 bootStart.sh
    • 权限解读:
      • A. 第一个7,代表当前文件所有者root用户,对该文件具有读写执行权限
      • B. 第二个7,代表当前文件所有者所属组的用户,对该文件具有读写执行权限
      • C. 第三个7,代表其他用户,对该文件具有读写执行权限
  • 执行该shell版本
    • 注意: 在执行maven指令进行打包时,第一次执行可能会耗时比较长,因为在进行maven工程的打包时,需要到中央仓库下载工程依赖的jar包和插件(可以在settings.xml中配置阿里云私服加速下载)。
  • 启动完成之后,我们可以查看java进程
  • 访问项目

有关04-项目部署到Linux的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  4. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  5. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  6. ruby - 如何在 Ruby 字符串中插入项目符号字符? - 2

    我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195

  7. ruby - 在 Rails 项目中测试本地版本的 gem - 2

    我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行​​bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正

  8. ruby - 在 Ubuntu 14.04 中使用 Curl 安装 RVM 时出错 - 2

    我试图在Ubuntu14.04中使用Curl安装RVM。我运行了以下命令:\curl-sSLhttps://get.rvm.io|bash-sstable出现如下错误:curl:(7)Failedtoconnecttoget.rvm.ioport80:Networkisunreachable非常感谢解决此问题的任何帮助。谢谢 最佳答案 在执行curl之前尝试这个:echoipv4>>~/.curlrc 关于ruby-在Ubuntu14.04中使用Curl安装RVM时出错,我们在Stack

  9. ruby - 合并 nanoc 中的项目 - 2

    我一直在尝试使用nanoc用于生成静态网站。我需要组织一个复杂的排列页面,我想让我的内容保持干燥。包含或合并的概念在nanoc系统中如何运作?我已阅读文档,但似乎找不到我想要的内容。例如:我如何获取两个部分内容项并将它们合并到一个新的内容项中。在staticmatic您可以在您的页面中执行以下操作。=partial('partials/shared/navigation')类似的约定在nanoc中如何运作? 最佳答案 这里是nanoc的作者。在nanoc中,部分是布局。因此,您可以拥有layouts/partials/shared/

  10. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

随机推荐