如何用pm2部署java全栈项目

标题说的java全栈项目特指前端采用vue/react/angular等前端框架,后端采用java技术栈开发的项目。

一直以来我走的技术路线都是全栈路线,从2014-2015年左右特别火的MEAN(mongodb+expressjs+angularjs+nodejs)框架到现在的vue+java技术栈,包括服务器部署和运维都是自己在做。说到项目部署,之前用过很长一段时间简单但不粗暴的screen命令,比如screen -L -S some_awesome_project_namescreen -r pidscreen -list都是常用的几个,当然还有ctrl+a+d,这个是退出项目的日志终端但是不杀掉该进程的命令,这套部署方案没什么不好,只是功能太少,只适合于demo项目或者测试环境,正式项目或者对项目质量要求比较高的场景下并不适合。然后用过一小段docker技术栈,docker从2013年发布起就非常火,周边生态也越来越壮大,基于容器的各种持续集成和持续交付的架构方案也出现很多,现在最火的要数kubernete了。但是缺点就是比较耗资源,一个镜像文件少则800M,多则几个g。当然如果项目预算比较充足,采用docker容器集群作为架构方案的话,也就不在乎资源问题了,如果是单机的话,还是有种杀鸡用牛刀的感觉。虽然docker和kubernete是时下最热门的技术,但是考虑自己公司的情况和项目的实际需求,我最终还是决定用pm2部署。

服务器初始化

写了一个脚本,分享出来。

#!/bin/bash

# install jdk
sudo apt-get update
sudo apt-get install -y openjdk-8-jdk
java -version

# install mvn
cd ~
wget https://mirrors.ocf.berkeley.edu/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
sudo tar -xvzf apache-maven-3.5.4-bin.tar.gz
sudo mv apache-maven-3.5.4 /opt
sudo ln -s /opt/apache-maven-3.5.4/bin/mvn /usr/bin/mvn
mvn -version

# install nodejs and pm2
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo apt-get install -y build-essential
node -v
npm -v
sudo npm install -g pm2 --registry=https://registry.npm.taobao.org
pm2 l

# install git
sudo apt install -y git
ssh-keygen -t rsa -C $1
cat ~/.ssh/id_rsa.pub

使用方式是命令行执行:

./setup.sh "anythingcanputhere"

解释一下:

  • 参数"anythingcanputhere"会替换脚本里的$1,用于生成ssh公私钥
  • 第一部分是安装jdk,Oracle的jdk越来越不好安装了,以后用openjdk好了。apt-get install后面加上-y可以一直执行到完,不会提示你确认yes or no而中断执行了
  • 第二部分是安装maven,注意sudo ln -s /opt/apache-maven-3.5.4/bin/mvn /usr/bin/mvn这行命令是新建软连接,如果没有这步,后面执行pm2 deploy命令的时候会提示找不到mvn命令而退出
  • 第三部分是安装nodejs和pm2
  • 第四部分是安装git和生成ssh公私钥。服务器需要用git命令从代码仓库拉取代码。生成公私钥以后,需要把~/.ssh/id_rsa.pub文件里的内容拷贝到你的代码仓库的设置 -> SSH公钥里。如果你的代码仓库里没有这台服务器的ssh公钥,拉取代码就会失败

配置文件

执行pm2 deploy部署命令时需要指定配置文件。分享一个例子:

const ENV = {
  "env_dev": {
    "PROFILE": "dev"
  },
  "env_prod": {
    "PROFILE": "prod"
  },
  "env_test": {
    "PROFILE": "test"
  }
};

module.exports = {
  apps: [
    {
      "name": "pm2-demo-project",
      "script": "/usr/bin/java",
      "args": [
        "-Xms128m",
        "-Xmx256m",
        "-Djava.security.egd=file:/dev/./urandom",
        "-jar",
        "pm2-demo-project/target/pm2-demo-project-0.0.1-SNAPSHOT.jar"
      ],
      "exec_interpreter": "",
      "exec_mode": "fork",
      ...ENV
    },
  ],
  deploy: {
    test: {
      host: ['192.168.1.103'],
      user: 'wubin',
      ssh_options: "StrictHostKeyChecking=no",
      ref: 'origin/test',
      repo: "git@code.xxx.com:wubin/pm2-demo-project.git", 
      path: "/home/demo/deploy/demo/pm2-demo-project",
      "post-deploy": "sh deploy.sh test",
    }
  }
};

解释一下:

  • apps部分是配置启动某个应用的命令,包括可执行文件和参数,以及自定义的环境变量
  • deploy部分是服务器的信息。如果到这里还需要执行一步命令:
ssh-copy-id -i ~/.ssh/id_rsa.pub wubin@192.168.1.103

即设置免密码登录。这样就不必每次部署都要输入服务器密码了,这不是必须的,只是为了更方便。post-deploy是配置实际启动服务的命令

下面我们看看deploy.sh里有什么:

#!/bin/bash
mvn clean install
pm2 reload ecosystem.config.js --env $1

解释一下:

  • $1接受执行脚本时的第一个传参,--env指定了当前的环境是配置文件里的env_devenv_prodenv_test的其中之一,注意传参的时候把前缀env_去掉,相应的自定义环境变量就会生效
  • pm2 reload表示重启配置文件里的apps属性的服务。如果原来就没有,那就会启动。需要注意的是,如果之前没有采用pm2 deploy的方式部署,而是手动在服务器执行pm2 start命令并且项目代码的路径不是/home/demo/deploy/demo/pm2-demo-project的话,必须先用pm2 delete命令把已经存在的服务删掉,否则pm2 reload重启的jar包还是之前路径下的jar包

部署

理解了上面的内容,部署就容易了:

  • 第一步需要初始化部署路径下的目录结构,包括拉取代码,只需初始化一次:
pm2 deploy ecosystem.config.js test setup
  • 第二步执行:
pm2 deploy ecosystem.config.js test update

输出示例:

➜  pm2-demo-project git:(test) pm2 deploy ecosystem.config.js test update
--> Deploying to test environment
--> on host 192.168.1.103
fatal: no upstream configured for branch 'test'
  ○ deploying origin/test
  ○ executing pre-deploy-local
  ○ hook pre-deploy
  ○ fast forward test
已经位于 'test'
您的分支与上游分支 'origin/test' 一致。
来自 code.xxx.com:wubin/pm2-demo-project
 * branch            test      -> FETCH_HEAD
Already up-to-date.
  ○ executing post-deploy `sh deploy.sh test`
[INFO] Scanning for projects...
// 省略
.
.
.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] pm2-demo-project 0.0.1-SNAPSHOT .................... SUCCESS [  0.422 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20.120 s
[INFO] Finished at: 2020-05-21T13:43:09+08:00
[INFO] ------------------------------------------------------------------------
[PM2] Applying action reloadProcessId on app [pm2-demo-project](ids: 0)
[PM2] [pm2-demo-project](0) ✓
  ○ hook test
  ○ successfully deployed origin/test
--> Success

pm2是非常好用的部署工具,但有时也会遇到一些小坑。有任何疑问,欢迎一起探讨。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352