本篇文章将手把手 教你从0到1搭建一个属于自己独有(装 * )的网站(当然网站内容,前后端具体设计实现还是靠自己做哈,这里只做简单的Demo网站),并且实现基于jenkins的自动化部署。
网站部署使用ESC云服务器,项目代码存储与代码仓库,可以是git,gitlab,gitee等,另外还可有个自己独有的域名来访问你的网站。
域名云解析:
目前市面上部分特殊后缀的域名还是很便宜 的!不过域名是需要备案的,首次备案比较麻烦,如果不考虑用域名这块可以跳过。
目前购买注册域名的渠道有很多,可以通过一些比较有名云厂商来购买域名,并且大多都能提供免费的云解析!像阿里云,腾讯云等。域名注册成功并且备案后就可以在通过相应平台来解析域名,将域名解析到你的服务器的外网地址。以腾讯云为例:
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的免费使用空间。
域名购买注册和备案
云服务器购买,推荐CentOS 6或者 7,windows的建议用 xshell 连接登陆访问,macOS用自带的终端就行。
创建gitee账号(也可以是git或gitlab),可以先新建个JavaWeb项目。
创建七牛云账号,创建一个对象存储空间。
软件安装推荐使用 yum ,CentOS一般自带这个工具 。
常用命令:
yum list [package] # 显示安装包信息
yum install [package] # 安装 安装包
yum remove [package] # 卸载安装程序
rpm -ql [package] # 查询安装包路径
需要用到的软件安装
CentOS 安装 JDK 时需要注意的是 CentOS 有自带的 OpenJDK,关于 OpenJDK 和 JDK 的区别可以见这遍博客 OpenJDK 和 JDK 的区别,所以还是建议安装 JDK,版本推荐 JDK8。
- 在 /usr/local/ 目录下新建java目录
cd /usr/local/ mkdir java cd java
- 进入官网下载 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
tar -zxvf tar -zxvf jdk-8u241-linux-x64.tar.gz\?AuthParam\=1586136592_bbc81e0c55cb2ec6b43f89321ae51ca2
vim /etc/profile
在后面追加
#java export JAVA_HOME=/usr/local/java/jdk1.8.0_241 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
然后让配置生效
source /etc/profile
- 验证安装
java -version
正常显示 jdk 版本就说明安装成功了!
- 安装maven
#maven cd /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
- 配置环境变量
vim /etc/prifile
在后面追加
export M2_HOME=/usr/local/maven/apache-maven-3.5.4 export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
生效配置
source /etc/prifile
- 验证
mvn -v
正常显示版本信息就安装成功了
这里可能会有一个小问题,就是退出ESC连接后重新登陆后 mvn 命令失效
解决方案是在 .bashrc 文件后面追加 source /etc/prifilevim /root/.bashrc 然后在后面追加 source /etc/prifile 保存退出后 source /root/.bashrc
- 安装 tomcat
#tomcat cd /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
- 启动 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
#mysql cd /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
- 启动 mysql 服务
service mysqld restart
- 登陆 mysql
mysql 初始化时会默认给 root 用户一个初始化密码
获取初始化密码grep 'temporary password' /var/log/mysqld.log(如果之前安装过MySQL则这里可能会有多个密码,用最后一个,注意这个密码输入时是可以粘贴的)
第一次登陆需要修改密码
mysql -uroot -p(这是一个MySQL的以密码登录root用户的命令) # 修改密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123456789'; # 注意密码不能太简单,不然会提示密码过于简单
Redis 安装详见 CentOS7 linux下yum安装redis以及使用
# git # 检查是否已有 git git --version # 若没有则安装 yum install -y git # 检查是否安装成功 git --version
Nginx 安装详见 centos7 yum 安装 配置 nginx
- 安装 Jenkins
# Jenkins sudo 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
- 修改初始配置信息
首先我们可以用 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 # 找到
http://updates.jenkins-ci.org/update-center.json 将其 修改为 #http://mirror.xmission.com/jenkins/updates/update-center.json
- 启动jenkins
service jenkins start
启动成功后输入地址 http://ip:port/ 访问
初次访问时需要输入默认密码
通过该命令可以找到默认的密码 tail /var/lib/jenkins/secrets/initialAdminPassword进入页面后我们可以选择安装默认插件,这个过程可以会很慢,所以我们也可以自定义安装插件,选择一些常用的插件安装,可以先选择安装以下几个插件,用于将页面语言设置成中文
Locale , Localization Support, Localization: Chinese (Simplified)
一些常见的 Jenkins 配置也可自行百度/谷歌
前面我们已经准备了所有的环境了,现在可以手动通过 ESC 部署一个 JavaWeb 项目了!
如果有自己的项目的话可以选择自己的项目,如果没有则可以使用这个 SpringBootDemo 的项目,项目 giteee 下载地址为: https://gitee.com/klxwz/SpringBootDemo.git 可以在本地用 git colone 拉取项目
git clone https://gitee.com/klxwz/SpringBootDemo.git
然后在本地执行 mvn package 打包成 war 包。
然后将 war 包上传到ESC服务器,如果本地是 windows 可以用 xftp, mac 可以用Transmit,或者直接用命令 scp 上传到ESC服务器。
将上传的 war 包放置在Tomcat安装目录下的webapps下。然后修改 conf 目录下的 server.xml 文件,将Service标签的内容修改成如下。
"Catalina">
"8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
"8009" protocol="AJP/1.3" redirectPort="8443" />
"Catalina" defaultHost="localhost">
"org.apache.catalina.realm.LockOutRealm">
"org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
"localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
"" docBase="demo" reloadable="true" />
"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反向代理,没有则可以配置下外网 IP 地址的反向代理。
- 添加反向代理配置
在前面的安装 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 来实现自动化构建和部署,大致流程如下。
考虑到通过 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 -> 系统管理 -> 全局工具配置下。
Gitee的配置先参考官方的配置文档 https://gitee.com/help/articles/4193,我们只需先配置 [添加码云链接配置] 。前面的插件安装可以参考下。
前面我们已经将Jenkins的系统配置配置好了,接下来就是新建一个自动化构建部署任务。
源码管理配置
源码管理我们选择 git
这里有个需要注意的点是 Credentials 是需要我们新建一个基于用户名和密码(gitee 登陆的账号和密码)的全局凭证,如果是私有仓库的话!
Name: origin
Refspec: +refs/heads/:refs/remotes/origin/ +refs/pull//MERGE:refs/pull//MERGE
Branches to build: origin/master构建触发器
这里我们选择Gieee Webhook 触发构建
我们需要在 Gitee的项目里新建一个 webhook,填写这个URL,密码使用这边生成的
gitee添加 webhook
post地址填写上面的URL地址,密码填写上面生成的密码。Post Steps 配置
这里我们需要执行一个 shell 脚本 ,当 build 成功后。
deploy.sh 脚本需要添加 可执行 的权限,不然脚本无法执行。
#当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
当然其中也还有一些需要注意的坑,当遇到后可以更具具体错误百度/谷歌查找解决方案,我也是在其中踩了无数个坑,最终一个一个填完了,当然我这里也不可能全部的坑都给出,我们需要更具具体情况具体分析。
最后说明:
如过文章有不正确的地方还请提出来,我看到后也会及时修改。
关于Demo项目可以自行 fork 到你的仓库。
文章有一些配置和脚本都是依照我这边的来写的,具体的配置信息还得根据你们自己的配置来写。
如有遇到解决不了的问题或者有一些自己的想法欢迎和我来讨论。联系方式Demo项目中的【关于】页面中有。
一些参考文档
https://gitee.com/help/articles/4193
https://www.jianshu.com/p/c517f09df025
https://blog.csdn.net/qq_37372007/article/details/81586751