Node服务一键离线部署

  • 2019 年 12 月 4 日
  • 筆記

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载

背景说明

项目测试通过,到了上线部署阶段。部署的机器安全限制比较严格,不允许访问外网。此外,没有对外网开放ssh服务,无法通过ssh远程操作。

针对上面提到的两条限制条件,通过下面方式解决:

  • 无法访问外部网络:将依赖的环境本地下载,打包上传,离线安装;
  • 无法ssh远程操作:将安装/初始化步骤脚本化,安装包交给运维人员,一键部署;

安装包说明

让运维同学将安装包置于/data/my_install下。安装包大致如容如下。其中install_scripts目录中,存放的是部署相关的脚本。

[root@localhost my_install]# tree -L 1  .  ├── control # 各种服务控制脚本  ├── install_scripts # 安装脚本  ├── node-v5.11.1-linux-x64 # node二进制包  ├── npm_modules_global_offline # 全局的npm模块,比如 pm2  ├── express_svr # express应用  └── uninstall_scripts # 卸载脚本

部署脚本说明

[root@localhost install_scripts]# tree -L 1  .  ├── install_node.sh # 安装nodejs  ├── install_npm_moduels.sh # 安装npm模块  ├── install_run_service.sh # 启动服务  ├── install_express_svr.sh # 部署express应用  └── install.sh # 部署总入口

Node安装

看下nodejs安装脚本。为了安装快些,这里我们采用的是编译好的二进制文件。只需要将相关文件拷贝到指定路径即可。

Node安装包说明

以下是[email protected]的目录。

[root@localhost node-v5.11.1-linux-x64]# tree -L 2  .  ├── bin  │   ├── node # node可执行文件  │   └── npm -> ../lib/node_modules/npm/bin/npm-cli.js # npm可执行文件,其实是个软链接  ├── CHANGELOG.md  ├── include # 各种包含文件  │   └── node  ├── lib  │   └── node_modules # npm模块安装目录  ├── LICENSE  ├── README.md  └── share      ├── doc      ├── man # 说明文件      └── systemtap

拷贝路径说明如下

本地路径

拷贝到的路径

备注

./bin/node

/usr/local/bin/node

node可执行文件

./bin/npm

/usr/local/bin/node

npm可执行文件,软链接,指向 /usr/local/lib/node_modules/npm/bin/npm-cli.js

./lib/node_modules/

/usr/local/lib/

npm模块安装目录

./include/node

/usr/local/include/

各种包含文件

./share/man/man1/node.1

/usr/local/man/man1/

使用说明

安装脚本

install_node.sh

[root@localhost install_scripts]# cat install_node.sh  #!/bin/bash  # 安装nodejs    cd /data/my_install/  cd node-v5.11.1-linux-x64/    cp -r ./lib/node_modules/ /usr/local/lib/ # copy the node modules folder to the /lib/ folder  cp -r ./include/node /usr/local/include/ # copy the /include/node folder to /usr/local/include folder  mkdir -p /usr/local/man/man1 # create the man folder  cp ./share/man/man1/node.1 /usr/local/man/man1/ # copy the man file  cp ./bin/node /usr/local/bin/ # copy node to the bin folder  ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm ## making the symbolic link to npm

全局npm模块安装

这里我们就用到了pm2,需要全局安装。根据npm全局模块的安装方式,需要分两步

  • 将pm2模块目录拷贝到/usr/local/lib/node_modules下。
  • /usr/local/bin/下,建立软链接,指向/usr/local/lib/node_modules/pm2/bin/下的可执行文件。

pm2安装说明

首先,把pm2包下载下来,这步略。我在这里放到了npm_modules_global_offline目录下,以防以后还有其他全部模块要一起安装。

软链接映射关系如下

目标文件路径

源文件路径

/usr/local/bin/pm2

/usr/local/lib/node_modules/pm2/bin/pm2

/usr/local/bin/pm2-dev

/usr/local/lib/node_modules/pm2/bin/pm2-dev

安装脚本

install_npm_moduels.sh

#!/bin/bash  # 安装全局npm模块    cd /data/my_install/  cd npm_modules_global_offline/    cp -rf ./node_modules/* /usr/local/lib/node_modules/  ln -s /usr/local/lib/node_modules/pm2/bin/pm2 /usr/local/bin/pm2  ln -s /usr/local/lib/node_modules/pm2/bin/pm2-dev /usr/local/bin/pm2-dev

Express应用安装

express应用的安装相对比较简单,本地npm install后,连同node_modules目录一起打包即可。

脚本如下,把express_svr拷贝到指定路径即可。

install_express_svr.sh

#!/bin/bash  # 安装express应用    cd /data/my_install/    if [ ! -d "/data/web/express_svr" ]; then    mkdir /data/web/express_svr  fi    cp -rf ./express_svr/* /data/express_svr/

一键部署脚本

简易版本

其实没那么玄乎,无非就是再写个脚本,统一调用下前面提到的脚本。奏是这么简单。

install.sh

./install_node.sh  ./install_npm_moduels.sh  ./install_otc_svr.sh  ./install_run_service.sh

运行:

./install.sh

进一步完善

上面脚本的缺陷比较明显,没有进度提示,也没有运行状态提示。于是优化一下,虽然也不能算是完善,但相比之前的版本的确会好很多。

#!/bin/bash    commands=(  ./install_node.sh "install nodejs"  ./install_npm_moduels.sh "install npm modules"  ./install_express_svr.sh "install express application"  ./install_run_service.sh "start services"  )    commands_len=${#commands[@]}    for (( i=0; i<$commands_len; i=i+2 ))  do      desc_index=i+1      desc=${commands[$desc_index]}        echo -e $desc" - starts ..."        ${commands[$i]}        if [ "$?" ==  "0" ]; then        echo -e $desc" - ok n"      else        echo -e $desc" - failed ! n"      fi  done

运行看下效果:

install nodejs - starts ...  install nodejs - ok    install npm modules - starts ...  install npm modules - ok    install express application - starts ...  install express application - ok    start services - starts ...  # pm2启动日志,一大坨,这里忽略  start services - ok

一键卸载脚本

从上面的内容可以看到,离线部署的过程,主要包含了几个操作

  • 文件拷贝
  • 建立软连接
  • 启动服务

那么,卸载无非就是上面几个步骤的反操作。脚本大致如下,跟前面的部署脚本其实是一一对应的。这里就不再赘述。

[root@localhost uninstall_scripts]# tree -L 1  .  ├── uninstall_run_service.sh  ├── uninstall_node.sh  ├── uninstall_npm_modules.sh  ├── uninstall_express_svr.sh  └── uninstall.sh

写在后面

文中提及的node服务离线部署,应该已经可以涵盖大部分的场景,举一反三即可。当然更富在的场景还有,这里就不再展开。