Node服务一键离线部署

简介: 生产环境的机器,存在各种限制,如无法访问外网,无法通过ssh远程连接。这里笔者简单介绍了下在生产环境下,一键离线部署的经验。

背景说明

项目测试通过,到了上线部署阶段。部署的机器安全限制比较严格,不允许访问外网。此外,没有对外网开放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安装包说明

以下是nodejs@v5.11.1的目录。

[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服务离线部署,应该已经可以涵盖大部分的场景,举一反三即可。当然更富在的场景还有,这里就不再展开。

相关文章
|
12天前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实战指南
【9月更文挑战第6天】在数字化时代的潮流中,后端开发作为支撑现代Web和移动应用的核心,其重要性不言而喻。本文将深入浅出地介绍如何使用Node.js及其流行的框架Express来搭建一个高效、可扩展的后端服务。通过具体的代码示例和实践技巧,我们将探索如何利用这两个强大的工具提升开发效率和应用性能。无论你是后端开发的新手还是希望提高现有项目质量的老手,这篇文章都将为你提供有价值的见解和指导。
|
24天前
|
存储 负载均衡 监控
检索服务elasticsearch节点(Node)
【8月更文挑战第23天】
37 5
|
22天前
|
消息中间件 JavaScript 中间件
函数计算产品使用问题之WebIDE编写的Node.js代码是否会自动进行打包部署
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
22天前
|
JavaScript 前端开发 中间件
构建高效后端服务:Node.js与Express框架的完美搭档
【8月更文挑战第28天】在追求高性能、可扩展和易维护的后端开发领域,Node.js和Express框架的组合提供了一种轻量级且灵活的解决方案。本文将深入探讨如何利用这一组合打造高效的后端服务,并通过实际代码示例展示其实现过程。
|
26天前
|
资源调度 JavaScript Linux
【Azure 应用服务】本地Node.js部署上云(Azure App Service for Linux)遇到的三个问题解决之道
【Azure 应用服务】本地Node.js部署上云(Azure App Service for Linux)遇到的三个问题解决之道
|
16天前
|
JavaScript 前端开发 Windows
NodeJS的环境部署
介绍如何在Windows操作系统上安装Node.js环境,包括下载长期支持版本的Node.js、安装程序、编写测试代码并执行,以及如何在WebStorm集成开发环境中配置和运行Node.js。
32 1
|
23天前
|
监控 JavaScript 前端开发
深入浅出Node.js: 打造高效的后端服务
【8月更文挑战第27天】在这个数字化飞速发展的时代,后端技术成为支撑互联网服务的基石。Node.js作为其中的佼佼者,以其非阻塞I/O模型、事件驱动架构和丰富的生态系统,赢得了开发者的青睐。本文将带领读者深入理解Node.js的核心概念,通过实际案例分析其应用模式,并探讨如何利用Node.js构建高效、可扩展的后端服务。无论你是初学者还是有经验的开发者,都能在这篇文章中找到提升你的Node.js技能的灵感和知识。
|
23天前
|
JavaScript NoSQL 中间件
《Node.js后端修炼手册》——揭秘服务器搭建与部署上线的生死时速,让你一战成名!
【8月更文挑战第27天】本文详细介绍如何从零开始利用Node.js构建后端服务器并部署至生产环境。首先,通过简易步骤搭建基础服务器,包括环境安装与配置。接着,引入Express框架优化路由与中间件管理,提升开发效率。随后,利用Mongoose实现MongoDB数据库连接,增强数据交互能力。为保证系统稳定性,文中还讲解了错误处理机制。最后,通过PM2等工具部署应用至生产环境,确保高效运行。本教程辅以示例代码,帮助读者快速掌握Node.js后端开发全流程。
52 2
|
23天前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的深度整合
【8月更文挑战第27天】 在现代Web开发中,后端服务的高效性至关重要。本文深入探讨了如何利用Node.js的非阻塞I/O特性和Express框架的简洁性来打造高性能的后端服务。我们将通过具体案例,展示如何在不牺牲代码可读性和可维护性的前提下,实现高效的请求处理和服务端逻辑。文章旨在为开发者提供一个清晰的指导,帮助他们在构建后端服务时做出更明智的技术选择。
|
23天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js: 打造高效后端服务
【8月更文挑战第27天】Node.js作为一款强大的后端开发平台,以其非阻塞I/O和事件驱动的特性深受开发者喜爱。本篇文章将引导你从基础到进阶,探索Node.js的核心技术与应用实践,让你能够利用这一技术构建高效、可扩展的后端服务。文章不仅包含理论知识,还会通过实际代码示例加深理解,让学习过程既系统又富有趣味。