Node服务一键离线部署
背景说明
项目测试通过,到了上线部署阶段。部署的机器安全限制比较严格,不允许访问外网。此外,没有对外网开放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服务离线部署,应该已经可以涵盖大部分的场景,举一反三即可。当然更富在的场景还有,这里就不再展开。
Node服务一键离线部署的更多相关文章
- 微服务架构 - 离线部署k8s平台并部署测试实例
一般在公司部署或者真实环境部署k8s平台,很有可能是内网环境,也即意味着是无法连接互联网的环境,这时就需要离线部署k8s平台.在此整理离线部署k8s的步骤,分享给大家,有什么不足之处,欢迎指正. 1. ...
- 使用应用编排服务一键式部署,持续集成利器--jenkins
这篇文章主要是来聊一聊jenkins,可说道jenkins,我没有办法不把它与持续集成(Continuous integration,简称CI)联系到一起,所以我先来谈谈什么是持续集成以及为什么需要持 ...
- 实践案例丨教你一键构建部署发布前端和Node.js服务
如何使用华为云服务一键构建部署发布前端和Node.js服务 构建部署,一直是一个很繁琐的过程 作为开发,最害怕遇到版本发布,特别是前.后端一起上线发布,项目又特别多的时候. 例如你有10个项目,前后端 ...
- 【BIGEMAP一键离线地图服务】
地址:http://www.bigemap.com/offlinemaps/ 首页 离线地图 代码示例 项目案例 开发文档 关于我们 [BIGEMAP一键离线服务] 1.快速搭建离线地图服务2 ...
- 小白从零开始阿里云部署react项目+node服务接口(三:部署到服务器)
服务器 准备工具 依次安装即可 nginx 安装nginx https://www.runoob.com/linux/nginx-install-setup.html 配置全局nginx命令 http ...
- 小白从零开始阿里云部署react项目+node服务接口(二:node服务+web)
我们用极简的方式来创建服务,没有任何附加功能 1 新建一个server文件夹 2 使用npm init 或者yarn init 一路enter 3 yarn add express cors ...
- 小白从零开始阿里云部署react项目+node服务接口(一:阿里云服务器)
准备阿里云服务器,并安装系统 如果没用自己服务器可以购买一个 https://www.aliyun.com/minisite/goods?userCode=x7i5glgc 初级购买一个1核2G的主机 ...
- IDEA 集成 Docker 插件实现一键远程部署 SpringBoot 应用,无需三方依赖,开源微服务全栈项目有来商城云环境的部署方式
一. 前言 最近有些童鞋对开源微服务商城项目 youlai-mall 如何部署到线上环境以及项目中 的Dockerfile 文件有疑问,所以写了这篇文章做个答疑以及演示完整的微服务项目发布到线上的流程 ...
- Node服务端极速搭建 - nvmhome
本文意在让你掌握极速搭建Node服务端(任何Project) $ whoami name: kelvin email: kelvv@outlook.com homepage: www.kelvv.co ...
随机推荐
- 读书笔记——Windows核心编程(2)比较字符串
1. CompareString 以符合用户语言习惯的方式,EX版本使用UNICODE int CompareString( __in LCID Locale, __in DWORD dwCmpFla ...
- 解决Mac Chrome打开HTTPS证书错误问题
goagent代理,在chrome下中总提示“该网站的安全证书不受信任” 并且没有 “继续访问” 的按钮. 解决方法 一.打开[应用程序]>[实用工具]>[钥匙串访问],并在左侧导航选择[ ...
- Android监听键盘显示和隐藏
问题概况:横板cocos2dx游戏,点击输入框弹出键盘时,界面要求跟随网上平易,不能挡住输入框.这种问题只出现在非全屏键盘到情况下. 方案1:mainActivity重写onconfiguration ...
- LeetCode题目分类
利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode.com/problem ...
- 如此低价的ZBrush,你能想象?
作为3D艺术的狂热者,你是否曾为找不到一款适合自己的雕刻软件而苦恼?要么,你已经找到了,却因为昂贵的价格而迟迟不肯入手? 作为改变整个三维行业的业界先进的数字雕刻和绘画软件,ZBrush向来拥有广 ...
- UESTC 288 青蛙的约会 扩展GCD
设两只青蛙跳了t步,则此时A的坐标:x+mt,B的坐标:y+nt.要使的他们在同一点,则要满足: x+mt - (y+nt) = kL (p是整数) 化成: (n-m)t + kL = x-y (L ...
- mysql 存储过程,以及mybatis如何调用
说道存储过程,很多人都知道,但是真正用的人其实很少,但是在某些必要的场景,是必须使用的,虽然可以使用java代码解决,但是效率性能远不及存储过程 曾经在sqlserver 以及pgadmin上用过,m ...
- maven 多工程搭建演示
maven出现后,很多公司会用maven来构建项目,单仅仅只是单项目单工程的 并没有使用多工程来构建,这样在以后,项目越来越大,业务越来越多以后,项目会难以维护,越发庞大,维护成本提高,团队士气也会下 ...
- AC日记——产生数 codevs 1009 (弗洛伊德)(组合数学)
1009 产生数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descriptio ...
- 【转载】Jmeter获取响应结果中参数出现的次数
在测试中,有时候会遇到要统计响应结果中某个参数出现了多少次,如果量级很大,一个一个数不太现实,下面讲一下实现自动打印出该参数出现的次数的方法. 例如我的响应信息为:{"ip":&q ...