项目简介

一个小网站,需要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,一切正常的话就可以使用你配置的域名或者地址进行访问了


墨韵
109 声望0 粉丝