文章目录

  • 项目介绍
  • 项目整体设计
  • 环境准备
  • 所需服务准备
  • 域名(可选)
  • ESC云服务器
  • 代码仓库(推荐gitee)
  • OSS云存储(可选,推荐七牛云)
  • ESC软件环境安装和配置
  • JDK
  • Maven
  • Tomcat
  • MySQL
  • Redis(可选)
  • Git
  • Nginx
  • Jenkins
  • ESC 发布项目
  • 项目准备
  • Tomcat 部署项目
  • nginx配置
  • 自动化部署配置
  • Jenkins 配置
  • 插件安装
  • 全局工具配置
  • Gitee 配置
  • 自动化构建部署任务


项目介绍

  本篇文章将手把手
  网站部署使用ESC云服务器,项目代码存储与代码仓库,可以是git,gitlab,gitee等,另外还可有个自己独有的域名来访问你的网站。

项目整体设计

java无感知部署 nginx java无感知部署_java


域名云解析:

  目前市面上部分特殊后缀的域名还是很便宜 的!不过域名是需要备案的,首次备案比较麻烦,如果不考虑用域名这块可以跳过。

  目前购买注册域名的渠道有很多,可以通过一些比较有名云厂商来购买域名,并且大多都能提供免费的云解析!像阿里云,腾讯云等。域名注册成功并且备案后就可以在通过相应平台来解析域名,将域名解析到你的服务器的外网地址。以腾讯云为例:

java无感知部署 nginx java无感知部署_java_02

ESC服务器:
   如果想要部署一个外网可以访问的网站,云服务器是相当不错的选择,目前有很多云服务器厂商,像阿里云,腾讯云,滴滴云等。阿里云和腾讯云的学生机相对比较便宜,滴滴云新用户注册也很划算(没有学生认证的话是个不错选择:https://i.didiyun.com/27g0Inj5bDS)。
  web代理服务器我们选择用nginx,轻量级,性能高,使用简单。
  JavaWeb项目的部署我们使用Tomcat服务器,对于过个项目我们可以用一个Tomcat服务部署多个Webapp的形式来部署。
  自动化构建和部署(CI/CD)我们使用 Jenkins,通过在云服务器上搭建 Jenkins 服务,我们可以不用每次写完代码后发布都要打包然后手动上传war包到服务器上然后还要手动重启tomcat服务器,我们可以直接将代码提交然后push到代码仓库后 Jenkins 就给我们自动化构建项目,打包,部署服务。
  数据库我们在云服务器上自建,有条件也可以使用RDS,缓存的话可以使用Redis,根据项目使用来选择安装。

外部服务:
  外部服务我们依赖代码仓库(git/gitlab/gitee),如果有需要可以使用云存储服务,推荐七牛云存储,有10G的免费使用空间。
  

环境准备

所需服务准备

域名(可选)

  域名购买注册和备案

ESC云服务器

  云服务器购买,推荐CentOS 6或者 7,windows的建议用 xshell 连接登陆访问,macOS用自带的终端就行。

代码仓库(推荐gitee)

  创建gitee账号(也可以是git或gitlab),可以先新建个JavaWeb项目。

OSS云存储(可选,推荐七牛云)

  创建七牛云账号,创建一个对象存储空间。

ESC软件环境安装和配置

  软件安装推荐使用 yum ,CentOS一般自带这个工具 。
  常用命令
     yum list [package] # 显示安装包信息
     yum install [package] # 安装 安装包
     yum remove [package] # 卸载安装程序
     rpm -ql [package] # 查询安装包路径

  需要用到的软件安装

JDK

   CentOS 安装 JDK 时需要注意的是 CentOS 有自带的 OpenJDK,关于 OpenJDK 和 JDK 的区别可以见这遍博客 OpenJDK 和 JDK 的区别,所以还是建议安装 JDK,版本推荐 JDK8。

  1. 在 /usr/local/ 目录下新建java目录

cd /usr/local/mkdir java cd java

  1. 进入官网下载 JDK8,复制下载地址 ,需要注册Oracle 账号 https://www.oracle.com/java/technologies/javase-jdk8-downloads.html

wget https://download.oracle.com/otn/java/jdk/8u241-b07/1f5b5a70bf22433b84d0e960903adac8/jdk-8u241-linux-x64.tar.gz?AuthParam=1586136592_bbc81e0c55cb2ec6b43f89321ae51ca2

下载完成后

java无感知部署 nginx java无感知部署_jenkins_03


3. 解压

tar -zxvf tar -zxvf jdk-8u241-linux-x64.tar.gz\?AuthParam\=1586136592_bbc81e0c55cb2ec6b43f89321ae51ca2

解压之后


java无感知部署 nginx java无感知部署_jenkins_04


4. 配置环境变量

vim /etc/profile

在后面追加

#javaexport JAVA_HOME=/usr/local/java/jdk1.8.0_241export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib

然后让配置生效

source /etc/profile

  1. 验证安装

java -version

正常显示 jdk 版本就说明安装成功了!

Maven
  1. 安装maven

#mavencd /usr/local/ mkdir maven cd maven wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz tar zxf apache-maven-3.5.4-bin.tar.gz rm -f apache-maven-3.5.4-bin.tar.gz

  1. 配置环境变量

vim /etc/prifile

在后面追加

export M2_HOME=/usr/local/maven/apache-maven-3.5.4export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin

生效配置

source /etc/prifile

  1. 验证

mvn -v

正常显示版本信息就安装成功了

这里可能会有一个小问题,就是退出ESC连接后重新登陆后 mvn 命令失效
解决方案是在 .bashrc 文件后面追加 source /etc/prifile

vim /root/.bashrc然后在后面追加 source /etc/prifile 保存退出后 source /root/.bashrc

Tomcat
  1. 安装 tomcat

#tomcatcd /usr/local/ mkdir tomcat cd tomcat wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.53/bin/apache-tomcat-8.5.53.tar.gz tar -zxv -f apache-tomcat-8.5.53 rm -f apache-tomcat-8.5.53.tar.gz

  1. 启动 tomcat

cd /usr/local/tomcat/apache-tomcat-8.5.53/bin/./startup.sh

tomcat 默认是 8080 端口 所以直接访问 http://ip:8080/
如果不能访问,那可能是 8080 端口被防火墙拦截,则需要配置防火墙,开放8080端口
在 /etc/sysconfig/iptables 后面追加
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
然后重启防火墙 service iptables restart

MySQL
  1. 安装mysql

#mysqlcd /usr/local/src/ wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum -y install mysql57-community-release-el7-10.noarch.rpm yum -y install mysql-community-server

  1. 启动 mysql 服务

service mysqld restart

  1. 登陆 mysql
    mysql 初始化时会默认给 root 用户一个初始化密码
    获取初始化密码

grep 'temporary password' /var/log/mysqld.log(如果之前安装过MySQL则这里可能会有多个密码,用最后一个,注意这个密码输入时是可以粘贴的)

第一次登陆需要修改密码

mysql -uroot -p(这是一个MySQL的以密码登录root用户的命令)# 修改密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123456789'; # 注意密码不能太简单,不然会提示密码过于简单

Redis(可选)

Git

# git# 检查是否已有 git git --version # 若没有则安装 yum install -y git # 检查是否安装成功 git --version

Nginx

Jenkins
  1. 安装 Jenkins

# Jenkinssudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key yum install jenkins # 按照提示输入 y 继续安装,安装过程可能有些些慢,如果安装失败则 重新执行 yum install jenkins

  1. 修改初始配置信息
    首先我们可以用 rpm -ql jenkins 看下 jenkins 的安装路径
    /etc/init.d/jenkins # 启动脚本
    /etc/logrotate.d/jenkins
    /etc/sysconfig/jenkins # 系统配置
    /usr/lib/jenkins
    /usr/lib/jenkins/jenkins.war # jenkins 部署war包
    /usr/sbin/rcjenkins
    /var/cache/jenkins
    /var/lib/jenkins # 默认安装路径
    /var/log/jenkins # 默认日志路径

# 1. 修改默认端口 Jenkins 默认使用 8080 端口,我们可以换个好区分的端口 比如 8088,如果端口被占用则换个其它没有被占用的# 2. 修改默认用户,Jenkins 默认的用户是 jenkins,我们需要将它改成 root 用户 vim /etc/sysconfig/jenkins # 找到 JENKINS_PORT="8080" 将其修改为 JENKINS_PORT="8081" # 找到 JENKINS_USER="jenkins" 将其修改为 JENKINS_USER="root" # 3. 修改 JDK 安装路径,在 /etc/init.d/jenkins 有默认的一些JDK安装路径,如果我们的 JDK 安装路径没在里面则需要我们手动添加 JDK 安装路径 vim /etc/init.d/jenkins # 找到candidates=" #/etc/alternatives/java #/usr/lib/jvm/java-1.8.0/bin/java # /usr/lib/jvm/jre-1.8.0/bin/java #/usr/lib/jvm/java-1.7.0/bin/java #/usr/lib/jvm/jre-1.7.0/bin/java #/usr/lib/jvm/java-11.0/bin/java #/usr/lib/jvm/jre-11.0/bin/java #/usr/lib/jvm/java-11-openjdk-amd64 #/usr/bin/java #" # 如果没有我们本地的安装路径则将我们本地的JDK安装路径加到里面 # 4. 修改插件镜像地址 /var/lib/jenkins 为 jenkins 默认安装地址,如果是其它的则换成对应的路径 vim /var/lib/jenkins/hudson.model.UpdateCenter.xml # 找到 <url>http://updates.jenkins-ci.org/update-center.json</url> 将其 修改为 # <url>http://mirror.xmission.com/jenkins/updates/update-center.json</url>

  1. 启动jenkins

service jenkins start

启动成功后输入地址 http://ip:port/ 访问
初次访问时需要输入默认密码
通过该命令可以找到默认的密码 tail /var/lib/jenkins/secrets/initialAdminPassword

进入页面后我们可以选择安装默认插件,这个过程可以会很慢,所以我们也可以自定义安装插件,选择一些常用的插件安装,可以先选择安装以下几个插件,用于将页面语言设置成中文
Locale , Localization Support, Localization: Chinese (Simplified)
一些常见的 Jenkins 配置也可自行百度/谷歌

java无感知部署 nginx java无感知部署_java_05

ESC 发布项目

  前面我们已经准备了所有的环境了,现在可以手动通过 ESC 部署一个 JavaWeb 项目了!

项目准备

   如果有自己的项目的话可以选择自己的项目,如果没有则可以使用这个 SpringBootDemo 的项目,项目 giteee 下载地址为: https://gitee.com/klxwz/SpringBootDemo.git 可以在本地用 git colone 拉取项目

git clone https://gitee.com/klxwz/SpringBootDemo.git

   然后在本地执行 mvn package 打包成 war 包。

java无感知部署 nginx java无感知部署_jenkins_06


   然后将 war 包上传到ESC服务器,如果本地是 windows 可以用 xftp, mac 可以用Transmit,或者直接用命令 scp 上传到ESC服务器。

Tomcat 部署项目

   将上传的 war 包放置在Tomcat安装目录下的webapps下。然后修改 conf 目录下的 server.xml 文件,将Service标签的内容修改成如下。

<Service name="Catalina">
	<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

	<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
	<Engine name="Catalina" defaultHost="localhost">
	<Realm className="org.apache.catalina.realm.LockOutRealm">
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
     resourceName="UserDatabase"/>
     </Realm>

    <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="demo" reloadable="true" />
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
     </Host>
    </Engine>
</Service>

  然后重启tomcat服务就可以访问项目了。

cd &TOMCAT_HOME/bin/
./shutdown.sh
./startup.sh

   通过 http://ip:80808/ 就可以访问项目了

nginx配置

   如果有域名的同学可以配置下nginx反向代理,没有则可以配置下外网 IP 地址的反向代理。

  1. 添加反向代理配置
    在前面的安装 nginx 的博客中有介绍到,nginx 的配置文件在安装目录的 conf 目录下,对于主配置文件 nginx.xml 会包含一个子目录下的所有配置文件,默认有个 default.conf的文件,我们可以编辑这个文件如下

server { listen 80; autoindex on; server_name xx.xx.xx.xx www.xxxxx.xx; # 外网IP地址 / 域名地址 可以填写多个,域名地址需要解析到外网IP地址 access_log /usr/local/nginx/logs/access.log combined; # 日志地址 index index.html index.htm index.jsp index.php; if ( $query_string ~* ".*[\;'\<\>].*" ){ return 404; } location / { proxy_pass http://localhost:8080/; proxy_set_header Host $host; } }

该配置文件是将 xx.xx.xx.xx 地址通过代理服务器指向到 http://localhost:8080/ ,也就是项目的启动地址,如果是域名地址,需要将域名解析到外网IP地址
2. 重启 nginx 服务

cd &NGINX_HOME/sbin/./nginx -s reload

然后就可与通过 外网地址 或者 域名地址 访问项目了

自动化部署配置

  对于上面这种方式,我们每次修改完代码后都需要重新打包,上传 war 包,重新部署,对于个人来说可能没什么,但是对于团队开发就特别麻烦了,还涉及多人合作开发。所以这里会用到 CI/CD (持续集成/持续交付)这两个概念,对于CI/CD的介绍这里不做介绍,可以自行百度/谷歌。而目前业界对于CI/CD的工具也有很多,我们这里使用的是Jenkins。

  前面我们已经安装好了 Jenkins服务,也可以正常访问了,所以接下来我们将基于 Jenkins 和 gitee 来实现自动化构建和部署,大致流程如下。

java无感知部署 nginx java无感知部署_nginx_07

Jenkins 配置
插件安装

   考虑到通过 jenkins 安装插件比较慢,我们可以先本地在Jenkins插件的官网下载插件,然后上传插件进行安装。Jenkins插件下载地址为 https://plugins.jenkins.io/
   我们假设已经安装好了一些基础插件 Credentials,Deploy to container,SSH Credentials,Trilead API Plugin等。接下来我们需要安装 Gitee 的插件 和 maven插件,Gitee 需要依赖 Git 和 Git client 插件,当然中间可能还有些其它依赖的插件,如果安装过程中有出现缺少依赖插件而失败可以,可以先自行安装缺少的依赖插件。

全局工具配置

   首先我们需要现在Jenkins做一些全局工具的配置,像 Git,Maven,JDK。在Jenkins -> 系统管理 -> 全局工具配置下。

  • Maven
     Maven配置

     Maven安装配置(用本地安装路径)
  • Git
     Git安装配置(用本地安装路径)
  • JDK
     Git安装配置(用本地安装路径)
Gitee 配置

  Gitee的配置先参考官方的配置文档 https://gitee.com/help/articles/4193,我们只需先配置 。前面的插件安装可以参考下。

自动化构建部署任务

  前面我们已经将Jenkins的系统配置配置好了,接下来就是新建一个自动化构建部署任务。

  1. 新建 maven 项目任务
  2. java无感知部署 nginx java无感知部署_jenkins_08

  3. 通用信息配置
    这里选择Gitee配置的面配置的gitee
  4. java无感知部署 nginx java无感知部署_jenkins_09

  5. 系统配置中 gitee 配置的信息
  6. 源码管理配置
    源码管理我们选择 git
  7. java无感知部署 nginx java无感知部署_jenkins_10

  8. 这里有个需要注意的点是 Credentials 是需要我们新建一个基于用户名和密码(gitee 登陆的账号和密码)的全局凭证,如果是私有仓库的话!
    Name: origin
    Refspec: +refs/heads/:refs/remotes/origin/ +refs/pull//MERGE:refs/pull//MERGE
    Branches to build: origin/master
    然后我们需要选择Additional Behaviours 新增一个 Merge before build
  9. java无感知部署 nginx java无感知部署_java_11

  10. 构建触发器
    这里我们选择Gieee Webhook 触发构建
  11. java无感知部署 nginx java无感知部署_nginx_12

  12. 我们需要在 Gitee的项目里新建一个 webhook,填写这个URL,密码使用这边生成的
  13. java无感知部署 nginx java无感知部署_spring_13

  14. gitee添加 webhook
  15. java无感知部署 nginx java无感知部署_jenkins_14


  16. java无感知部署 nginx java无感知部署_java无感知部署 nginx_15

  17. post地址填写上面的URL地址,密码填写上面生成的密码。
  18. build 配置
    构建配置我们就填写 pom.xml
  19. java无感知部署 nginx java无感知部署_spring_16

  20. Post Steps 配置
    这里我们需要执行一个 shell 脚本 ,当 build 成功后。
    deploy.sh 脚本需要添加 可执行 的权限,不然脚本无法执行。
  21. java无感知部署 nginx java无感知部署_nginx_17

#当jenkins进程结束后新开的tomcat进程不被杀死BUILD_ID=DONTKILLME#加载变量 . /etc/profile #配置运行参数 #PROJ_PATH为设置的jenkins目录的执行任务目录 export PROJ_PATH=/var/lib/jenkins/workspace #配置tomcat所在目录 export TOMCAT_APP_PATH=/root/java/apache-tomcat-8.5.30 #执行写好的自动化部署脚本 sh /var/lib/jenkins/deploy.sh

接下来我们需要在 jenkins 的安装目录(/var/lib/jenkins/deploy.sh)下 新建一个 deploy.sh 的脚本

#!/usr/bin/env bash#编译+部署项目站点#需要配置如下参数 # 项目路径, 在Execute Shell中配置项目路径, pwd 就可以获> 得该项目路径 export PROJ_PATH=/var/lib/jenkins/workspace/Demo # 输入你的环境上tomcat的全路径 export TOMCAT_APP_PATH=/root/java/apache-tomcat-8.5.30 ### base 函数 killTomcat() { #pid=`ps -ef|grep tomcat|grep java|awk '{print $2}'` #echo "tomcat Id list :$pid" #if [ "$pid" = "" ] #then # echo "no tomcat pid alive" #else # kill -9 $pid #fi #上面注释的或者下面的 cd $TOMCAT_APP_PATH/bin sh shutdown.sh } # 停tomcat killTomcat # 删除原有工程 rm -f $TOMCAT_APP_PATH/webapps/demo.war # 复制新的工程到tomcat上 cp $PROJ_PATH/Demo/target/demo-1.0-SNAPSHOT.war > > $TOMCAT_APP_PATH/webapps/demo.war # 启动Tomcat cd $TOMCAT_APP_PATH/ sh bin/startup.sh

  1. 构建后操作
    自行选择构建后回调的结果
    至此,任务配置就完成了。
    我们可以先执行下构建,看是否能构建成功,如果能成功,在验证下 push 代码后有没有自动执行任务。

当然其中也还有一些需要注意的坑,当遇到后可以更具具体错误百度/谷歌查找解决方案,我也是在其中踩了无数个坑,最终一个一个填完了,当然我这里也不可能全部的坑都给出,我们需要更具具体情况具体分析。

  
  
最后说明:
  
  如过文章有不正确的地方还请提出来,我看到后也会及时修改。
  关于Demo项目可以自行 fork 到你的仓库。
  文章有一些配置和脚本都是依照我这边的来写的,具体的配置信息还得根据你们自己的配置来写。
  如有遇到解决不了的问题或者有一些自己的想法欢迎和我来讨论。联系方式Demo项目中的【关于】页面中有。