项目简介
一个小网站,需要seo,没考虑nuxt或者ssr;业务不复杂直接node+ejs;
前端使用node转发请求到真正的后端接受数据完成前后分离;线上使用nginx 代理,进程管理使用pm2
创建目录
创建一个空文件夹并在此cmd 执行以下操作,请注意,一定不能使用powershell,否则windows会报关于express的安全策略的错误
npm install express express-generator -g //已经安装了就忽略
express -e myapp //使用 express-generator 快速生成项目
//开始项目
cd myapp
npm install
npm start
基本配置
1,package.json
的配置
其他的不管,主要是修改scripts
这个字段,配置启动端口以及启动方式;
"scripts": {
"start": "node ./bin/www",
"production": "set NODE_ENV=production && set PORT=4488 && node ./bin/www"
},
2,pm2.config.js的配置
在项目根目录创建一个pm2.config.js
的文件,这个文件主要是对pm2做一些基本配置
module.exports = {
apps: [
{
"name": "testServer_node_pm2",
"script": "bin/www",
"log_date_format": "YYYY-MM-DD HH:mm:SS",
"error_file": "logs/err.log",
"out_file": "logs/out.log",
"pid_file": "pids/out.pid",
"instances": 1,
"min_uptime": "200s",
"max_restarts": 10,
"max_memory_restart": "1M",
"cron_restart": "1 0 * * *",
"watch": false,
"merge_logs": true,
"exec_interpreter": "node",
"exec_mode": "cluster_mode",
"autorestart": true,
"vizion": false,
"env_production": {
"IP": "xxx.110.110.250",
"NODE_ENV": "production",//-- env 的真实参数名称
"PORT":4488,
"BASE_URL":"none"
}
}
]
}
项目在本地启动就使用node 进行正常的npm run dev
启动;如果是线上就使用pm2启动; 在控制台使用pm2 start pm2.config.js --env production --watch
启动;
pm2 如果要配置多环境, 请用env_ 标识 , 比如
env: {
NODE_ENV: 'development',
PORT: 4242
},
env_production: {
NODE_ENV: 'production',
PORT: 4241
},
env_production_new: {
NODE_ENV: 'production_new',
PORT: 4243
},
可以使用pm2 start pm2.config.js --env development|production|production_new
此处参考 pm2 多环境配置
最后得到一个这样的目录
;
然后在bin/www
文件里面就可以获取到env里面配置的参数
console.log("环境变量",process.env.IP,process.env.NODE_ENV,process.env.BASE_URL)
转发请求
在app.js 里面需要对请求进行,转发至真正的后端;
var querystring = require('querystring'); //提供用于解析和格式化 URL 查询字符串的实用工具
console.log(myTrim(process.env.NODE_ENV)) //myTrim是一个前后去空格的函数,当时在这里折腾了很久
var myhost = '';
if (myTrim(process.env.NODE_ENV)=="development") { //可以简单判断一下环境设置接口地址
myhost = "520.131.4.1" //本地后台地址
} else {
myhost = "110.119.120.520" //线上后台
}
//web 是后端接口的统一前缀
app.all(/\/web/, function (req, res) {
if (req.url.indexOf('/web') != -1 && req.method !== "GET") {
var strData = querystring.stringify(req.body)
let options = {
host: myhost, //本地,后台请求地址
port: 5222,
path: req.url,
method: 'POST',
};
delete req.headers['content-length'];
options.headers = req.headers;
// options.headers = Object.assign(options.headers, req.headers); //带上客户端请求头(包含cookie之类的东西)
let httpRequest = http.request(options, function (res) {
let _data = '';
res.on('data', function (chunk) {
_data += chunk;
});
res.on('end', function () {
sendData(_data);
});
});
//httpRequest.write(strData); //写入数据到请求主体
httpRequest.write(strData);
httpRequest.end();
function sendData(data) {
res.send(data);
}
} else {
res.redirect(302, '/404');
return;
}
});
上服务和nginx配置
使用xftp
工具把除了node_modules
之外的所有目录全部上传到你自己服务器的指定目录下,然后使用npm install
重新安装一下,安装完成之后使用pm2 start pm2.config.js --env production --watch
启动项目;如果一切正常的话你会得到这样的提示,那么恭喜你成功了
在搞定了node
之后现在对nginx进行配置;
nginx.conf配置文件
server {
listen 80;
charset utf-8;
server_name my.server.com 120.119.114.911;
location / {
proxy_pass http://localhost:4747; #这里其实就是使用nginx把80端口的服务转到了你自己的node服务上去
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
配置完成之后使用 nginx -c /etc/nginx/nginx.conf -s reload
刷新一下nginx,一切正常的话就可以使用你配置的域名或者地址进行访问了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。