宝塔按钮pm2后,node就装好了。
对于前端开发人员来说,配置后端服务器的工作都是脑瓜疼的,好在宝塔这种可视化工具还是挺好用
在部署上线前,假设你的项目已经写好的了。
1. 在宝塔上添加新的站点pm2是一个带有负载均衡功能的Node应用的进程管理器。当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的。
PM2是开源的基于Nodejs的进程管理器,包括守护进程,监控,日志的一整套完整的功能,基本是Nodejs应用程序不二的守护进程选择,事实上它并不仅仅可以启动Nodejs的程序,只要是一般的脚本的程序它同样可以胜任。
主要特性:
内建负载均衡(使用Node cluster 集群模块) 后台运行 0秒停机重载(这项功能允许你重新载入代码而不用失去请求连接。) 具有Ubuntu和CentOS 的启动脚本 停止不稳定的进程(避免无限循环) 控制台检测 提供 HTTP API 远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )
在nginx站点配置文件下添加(后面的端口号是node设置的那个)
location / {
proxy_pass http://127.0.0.1:3033;
}
查看状态
目录结构
|--Leavingamessage
|----img
|----|--fyz.jpg
|----public
|----|--css
|----|--js
|----vew
|----|--404.html
|----|--msgadd.html
|----|--msgimdex.html
|----app.js
app.js
//引入文件模块
var fs=require('fs');
//引入http模块
var http=require('http');
//创建web服务器
var server=http.createServer();
//引入URL模块
var url=require('url');
//引入post模块get不需要
var querystring = require('querystring');
var msgs=[
{name:'张三',content:'我是张三',create_at:'2017-11-14 10:30:32'},
{name:'李四',content:'我是李四张三',create_at:'2017-11-14 11:30:32'},
{name:'王五',content:'我是王五张三',create_at:'2017-11-14 12:30:32'}
];
//监听请求 req - request请求 res - response 响应
server.on('request', function(req, res) {
if(req.url=='/'){
fs.readFile('./vew/msgindex.html','utf8',function(err,data){
if(err) res.end('404 Not fund');
//遍历数据拼接数据 jq $.each 也可以通过js的 数据foreach
var html='';
msgs.forEach(function(item){
html+=`
${item.name}说:${item.content}日期${item.create_at}
`;
});
console.log(html,12212)
//将拼接的视图里面的笑脸替换成遍历数据
var data=data.replace('^_^',html);
console.log(data)
res.write(data);
res.end();
});
}else if(req.url=='/add'){
fs.readFile('./vew/msgadd.html','utf8',function(err,data){
if(err) res.end('404 Not fund');
res.write(data);
res.end();
});
}else if(req.url.indexOf('/action')==0){
console.log(123)
if(req.method=='POST'){
//post提交数据过大所以需要分片获取
var postData='';
req.on('data',function(chunk){
postData+=chunk;
});
//end事件等于数据传输完毕
req.on('end',function(){
//通过querystring模块将字符串数据转化为对象
parpost=querystring.parse(postData);
console.log(parpost,121212);
var date = new Date();
var year = date.getFullYear(); //获取当前年份
var mon = date.getMonth()+1; //获取当前月份
var da = date.getDate(); //获取当前日
var day = date.getDay(); //获取当前星期几
var h = date.getHours(); //获取小时
var m = date.getMinutes(); //获取分钟
var time2=year+'年'+mon+'月'+da+'日'+'星期'+day+' '+h+':'+m;
var msg={name:parpost.name,content:parpost.content,create_at:time2};
msgs.push(msg);
console.log(msgs,232323);
res.statusCode=302;
res.setHeader('Location','/');
res.end();
});
}else{
//1.接收数据
//2.入库(压入数据到数组 push pop)
//3.跳转
var par=url.parse(req.url,true).query;
//console.log(par);
var date = new Date();
var year = date.getFullYear(); //获取当前年份
var mon = date.getMonth()+1; //获取当前月份
var da = date.getDate(); //获取当前日
var day = date.getDay(); //获取当前星期几
var h = date.getHours(); //获取小时
var m = date.getMinutes(); //获取分钟
var time2=year+'年'+mon+'月'+da+'日'+'星期'+day+' '+h+':'+m;
var msg={name:par.name,content:par.content,create_at:time2};
msgs.push(msg);
console.log(msgs,121212);
res.statusCode=302;
res.setHeader('test.cc','/');
res.end();
}
}else if(req.url.indexOf('/public')==0){
fs.readFile('./'+req.url,'utf8',function(err,data){
if(err) res.end('404 Not fund');
res.write(data);
res.end();
});
}else if(req.url.indexOf('/img')==0){
fs.readFile('./'+req.url,'utf8',function(err,data){
if(err) res.end('404 Not fund');
//res.write(data);
//设置请求的返回头type,content的type类型列表见上面
res.setHeader("Content-Type", 'image/jpg');
//格式必须为 binary 否则会出错
var content = fs.readFileSync('./'+req.url,"binary");
res.writeHead(200, "Ok");
res.write(content,"binary"); //格式必须为 binary,否则会出错
res.end();
});
}else{
fs.readFile('./vew/404.html','utf8',function(err,data){
if(err) res.end('404 Not fund');
res.write(data);
res.end();
});
}
});
//启动服务
server.listen(6800,function(){
console.log("服务启动成功,访问:http://test.cc:6800");
});
msgindex.htm
留言板列表
留言板列表
^_^
msgadd.html
留言板列表
留言板添加数据
用户名
内容
提交
此时项目配置好后即可运行。