博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在Ubuntu 14.04服务器上自动化部署Spring Boot的应用
阅读量:6757 次
发布时间:2019-06-26

本文共 6332 字,大约阅读时间需要 21 分钟。

这篇文章主要讲解我在Ubuntu 14.04服务器上如何部署Spring Boot的网站应用的经验。以下以我的博客项目为例子。主要的部署需求如下:

  • 如何在服务器上运行Spring Boot的应用,并使用production环境的配置文件application-production.yml

  • 如何通过Gradle构建和发布Spring Boot的项目;

  • 如何在本地自动化部署网站到production环境中。

1. 在Ubuntu中安装Java8

以下是一个简单的安装方法。

$ sudo add-apt-repository ppa:webupd8team/java$ sudo apt-get update$ sudo apt-get install oracle-java8-installer$ java -versionjava version "1.8.0_60"Java(TM) SE Runtime Environment (build 1.8.0_60-b27)Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

2. 本地使用Gradle发布Spring Boot应用

我这里使用Jetty9作为内置的服务器。

// ...bootRun {    systemProperties = System.properties}configurations {    compile.exclude module: "spring-boot-starter-tomcat"}dependencies {    // spring boot    compile "org.springframework.boot:spring-boot-starter-web:1.3.0.M5"    compile "org.springframework.boot:spring-boot-starter-jetty"    // ...}//...

在本地运行默认使用src/main/resources/application.yml作为配置文件,而在production环境中我们系统它支持提供外部的配置文件application-production.yml

./gradlew bootRun # 开发环境下默认使用项目里的application.yml# 在本地测试使用外部配置文件./gradlew bootRun -Dspring.config.location=/path/to/application-production.yml # 发布./gradlew build # 运行java -jar build/libs/SpringBlog-0.1.jar  # 默认使用jar包里面的application.yml配置文件# 使用外部配置文件java -jar build/libs/SpringBlog-0.1.jar --spring.config.location=/path/to/application-production.yml

3. 在Ubuntu服务器上部署Spring Boot应用

# 上传SpringBlog-0.1.jar到服务器scp build/libs/SpringBlog-0.1.jar root@your_server_ip:/root/spring-blog/current# 在服务器上配置生产环境的配置文件scp application-production.yml root@your_server_ip:/root/spring-blog/current

然后SSH登录服务器,修改配置文件application-production.yml,试运行应用。

ssh root@your_server_ipcd spring-blog/currentjava -jar SpringBlog-0.1.jar --spring.config.location=application-production.yml
# application-production.ymlserver:    address: raysmond.com # 使用域名或者IP,启动之后就可以这个域名或IP访问网站了    port: 80    contextPath:    spring:    profiles:        active: production    thymeleaf:        cache: true    jade4j:        caching: true    dataSource:      driverClassName: com.mysql.jdbc.Driver      url: jdbc:mysql://127.0.0.1/spring_blog      username: root      password:    hibernate:      dialect: org.hibernate.dialect.MySQLDialect      hbm2ddl.auto: update      show_sql: false    redis:      host: localhost      port: 6379

4. 如何在Ubuntu中后台运行Spring Boot应用?

推荐使用nohup这个命令。

cd /root/spring-blog/currentnohup java -jar SpringBlog-0.1.jar --spring.config.location=application-production.yml \> ../logs/production.log 2> ../logs/production.err &

在Ubuntu还可以/etc/init.d目录下新建一个脚本,把SpringBlog作为service来运行,这样不用每次都打这么繁琐的命令了。新建一个/etc/init.d/spring_blog文件,内容如下:

#!/bin/shSERVICE_NAME=spring_blogHOME=/root/spring-blogPATH_TO_JAR=$HOME/current/SpringBlog-0.1.jarPID_PATH_NAME=/tmp/spring_blog.pidLOG=$HOME/logs/production.logERROR_LOG=$HOME/logs/production.errCONFIG=$HOME/application-production.ymlcase $1 in    start)        echo "Starting $SERVICE_NAME ..."        if [ ! -f $PID_PATH_NAME ]; then            cd $HOME/current            nohup java -jar $PATH_TO_JAR --spring.config.location=application-production.yml > $LOG 2> $ERROR_LOG &                        echo $! > $PID_PATH_NAME            echo "$SERVICE_NAME started ..."        else            echo "$SERVICE_NAME is already running ..."        fi    ;;    stop)        if [ -f $PID_PATH_NAME ]; then            PID=$(cat $PID_PATH_NAME);            echo "$SERVICE_NAME stoping ..."            kill $PID;            echo "$SERVICE_NAME stopped ..."            rm $PID_PATH_NAME        else            echo "$SERVICE_NAME is not running ..."        fi    ;;    restart)        if [ -f $PID_PATH_NAME ]; then            PID=$(cat $PID_PATH_NAME);            echo "$SERVICE_NAME stopping ...";            kill $PID;            echo "$SERVICE_NAME stopped ...";            rm $PID_PATH_NAME            echo "$SERVICE_NAME starting ..."            cd $HOME/current            nohup java -jar $PATH_TO_JAR --spring.config.location=application-production.yml > $LOG 2> $ERROR_LOG &                        echo $! > $PID_PATH_NAME            echo "$SERVICE_NAME started ..."        else            echo "$SERVICE_NAME is not running ..."        fi    ;;esac

现在就可以使用service的方式来运行网站了。

sudo service spring_blog startsudo service spring_blog stopsudo service spring_blog restart

5. 在本地自动化部署网站到远程服务器

在本地我用了一个shell脚本和一个python脚本来配合自动化部署。

  • deploy.sh 使用gradle的命令发布jar包,使用scp命令吧jar包上传到服务器上;

  • deploy.py 使用SSH远程登录服务器,并在服务器上执行部署命令。

# deploy.sh#!/bin/bashSERVER="your_server_ip"JAR="build/libs/SpringBlog-0.1.jar"echo "Building $JAR..."./gradlew buildecho "Upload $JAR to server $SERVER..."scp $JAR root@$SERVER:/root/spring-blog/python deploy.py

deploy.py主要使用了一个库,用于SSH远程登录服务器,并执行命令。这个脚本会把服务器上/root/spring-blog/current/SpringBlog-0.1.jar备份到/root/spring-blog/releases中,并把新发布的jar包放到/root/spring-blog/current中,然后重启spring_blog服务。

#!/usr/bin/pythonimport paramikoimport threadingimport timeip = 'your_server_ip'user = 'root'password = ''jar = 'SpringBlog-0.1.jar'home='/root/spring-blog'current=home+"/current"releases=home+"/releases"def execute_cmds(ip, user, passwd, cmd):    try:        ssh = paramiko.SSHClient()        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())        ssh.connect(ip,22,user,passwd,timeout=5)        for m in cmd:            print m            stdin, stdout, stderr = ssh.exec_command(m)#           stdin.write("Y")            out = stdout.readlines()            for o in out:                print o,        print '%s\tOK\n'%(ip)        ssh.close()    except :        print '%s\tError\n'%(ip)if __name__=='__main__':    print 'Start deploying %s to server %s'%(jar, ip)    now = time.strftime("%Y%m%d%H%M%S")    cmd = [        'echo Stop spring_blog service... && service spring_blog stop',        'echo Flush all redis cache data... && redis-cli -r 1 flushall',        'echo Stop redis server... && service redis_6379 stop',        'echo Use new jar... ' + \        ' && mv ' + current + '/' + jar + ' ' + releases + '/' + now + '_' + jar ,        'mv ' + home + '/' + jar + ' ' + current + '/' + jar,        'echo Stop redis... && service redis_6379 start',        'echo Start spring_blog service... && service spring_blog start ' + \        ' && echo All done.'    ]    a=threading.Thread(target=execute_cmds, args=(ip,user,password,cmd))    a.start()

配置完以后,在本地写完代码就可以运行./deploy.sh一键部署到远程服务器了。

以上就是我部署 网站的一些经验。项目源代码已开源放在Github上:。

转载地址:http://iyzeo.baihongyu.com/

你可能感兴趣的文章
Spring简介
查看>>
new Function()
查看>>
man page分類與說明
查看>>
站立会议3
查看>>
Libvirt 版本降级过程记录 4.5.0 to 3.9.0
查看>>
net core 的Generic Host 之Generic Host Builder
查看>>
SQL Server性能杀手
查看>>
1157: 零起点学算法64——回型矩阵
查看>>
Ubuntu系统清理瘦身
查看>>
How to Analyze Java Thread Dumps
查看>>
SQL-58 获取有奖金的员工相关信息。
查看>>
整数转为罗马数字
查看>>
ubuntu 本地和服务器scp文件传输
查看>>
bitmap
查看>>
image has dependent child images
查看>>
Vim常用的命令
查看>>
redis权限认证及登录
查看>>
判断表是否存在 存储
查看>>
rox + openbox + fbpanel + conky打造又快又稳的桌面
查看>>
“蚁族” 的生活方式画像
查看>>