下载安装包
cd /app/
wget https://registry.npmmirror.com/-/binary/node/v16.13.2/node-v16.13.2-linux-x64.tar.gz
tar -xvf node-v16.13.2-linux-x64.tar.gz
mv node-v16.13.2-linux-x64 node
配置环境变量
将nodejs的命令node、npm等添加到PATH环境变量中
# 方法1: 配置环境变量
export NODE_HOME=/app/node
export PATH=$PATH:${NODE_HOME}/bin
# 方法2: 为node和npm建立软链接
ln -s /bin/node /app/node/bin/node
ln -s /bin/npm /app/node/bin/npm
设置镜像
# 查看源
npm get registry
# 官方源
npm config set registry https://registry.npmjs.org/
# 命令行临时使用指定镜像(淘宝)
npm --registry https://registry.npm.taobao.org install express
# 命令行永久更改使用指定镜像(淘宝)
npm config set registry https://registry.npm.taobao.org
安装cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
检验是否安装成功
# 运行如下命令查看node、npm、cnpm的版本号
node -v
npm -v
cnpm -v
# 查看node_modules、可执行文件的目录
npm root -g|head -n 1
npm bin -g|head -n 1
Http服务同步gitbook
app.js
const http = require('http')
const url = require('url');
const cdprocess = require('child_process')
// 校验token
var checkToken = function(request) {
var token = request.headers['x-codeup-token'];
if(token=='riRu******'){
return true;
}
return false;
};
// 同步gitbook文档
var syncGitbook = function() {
// 异步处理,如果要同步处理可以用execSync
cdprocess.exec('bash /opt/gitbook/build.sh /opt/gitbook/', function (error, stdout, stderr) {
if(error) {
console.error('\n' + error);
}
console.log('\n' + stdout);
console.log('\n' + stderr);
});
return true;
};
// 更新serverslist文件
var updateServersList = function(n,u,h,p) {
// 异步处理,如果要同步处理可以用execSync
var cmds = "sed -ri 's/^.*:"+n+"/"+u+"@"+h+":"+p+":"+n+"/g' /opt/files/servers.list";
// console.log('\n' + cmds);
cdprocess.execSync(cmds, function (error, stdout, stderr) {
if(error) {
console.error('\n' + error);
return false;
}
console.log('\n' + stdout);
console.log('\n' + stderr);
});
return true;
};
// httpserver对象
const server = http.createServer()
// request请求事件处理函数需要接收俩个参数
// request请求对象 请求对象可以获取客户端的一些请求信息,例如请求路径
// response响应对象 响应对象可以用来给客户端发送响应消息
server.on('request',function(request,response){
// console.log('收到客户端的请求路径:'+request.url)
// console.log('收到客户端的请求头:'+JSON.stringify(request.headers))
response.writeHead(200,{'Content-Type':'application/json;charset=utf-8'})
var result = {code:"200", message:"SUCCESS"}
// 判断请求路径
var requrl = request.url;
var reqpath = url.parse(requrl,true).query
if(requrl.startsWith('/gitbook')){
console.log('开始处理Gitbook同步!')
if(checkToken(request)){
if(syncGitbook()){
response.end(JSON.stringify(result));
}else{
result = {code:"500", message:"process failed!"};
response.end(JSON.stringify(result));
}
}else{
console.log('=====Token校验失败!===============')
result = {code:"500", message:"check sign failed!"};
response.end(JSON.stringify(result));
}
}else if (requrl.startsWith('/serverlist')){
console.log('开始处理ServerList同步!')
if(updateServersList(reqpath.n,reqpath.u,reqpath.h,reqpath.p)){
response.end(JSON.stringify(result));
}else{
result = {code:"500", message:"process failed!"};
response.end(JSON.stringify(result));
}
}
else{
response.end("Hello, World!")
}
})
server.listen(3000,()=> {
console.log("服务器启动成功了,可以通过http://127.0.0.1:3000/")
})
启动Node服务
forever启动应用
#安装forever
npm install forever -g
#启动服务 -w监控文件变化重启应用
forever -w start -l httpserver.log app.js
#停止服务
forever stop -a app.js
#查看应用列表
forever list
#查看应用日志
tail -f /root/.forever/httpserver.log
快速启动应用
# 启动 app.js,pm2 会自动给它分配一个名字(通常是文件名)
pm2 start app.js
# 指定应用名称(推荐,方便管理)
pm2 start app.js --name my-api
# 指定节点数(集群模式,利用多核 CPU,强烈推荐生产环境使用)
# "max" 表示根据 CPU 核数自动开启相应数量的进程
pm2 start app.js -i max --name my-api-cluster
# 传递参数给应用
pm2 start app.js --name worker -- arg1 arg2
查看状态
# 查看所有运行中的应用状态、内存占用、重启次数等
pm2 list
# 或者简写
pm2 l
停止/重启/删除
# 重启应用(代码更新后常用,支持零停机重载)
pm2 restart my-api
# 停止应用
pm2 stop my-api
# 删除应用(从列表中移除,但不会删除文件)
pm2 delete my-api
# 一次性操作所有应用
pm2 restart all
pm2 stop all
pm2 delete all