node最佳实践11-部署和ssl配置

116 阅读2分钟

关于pm2的简单教程

// install
npm install pm2 -g

启动pm2 start ./src/bin/www.js ,

但是用apifox调用的时候发现接口访问失败了,执行pm2 logs看看日志

0|www      | /Users/dongzhiqin/myProjects/node-server/src/bin/www.js:10
0|www      | import app from '../app'
0|www      | ^^^^^^
0|www      |
0|www      | SyntaxError: Cannot use import statement outside a module
0|www      |     at Object.compileFunction (node:vm:352:18)
0|www      |     at wrapSafe (node:internal/modules/cjs/loader:1033:15)
0|www      |     at Module._compile (node:internal/modules/cjs/loader:1069:27)
0|www      |     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
0|www      |     at Module.load (node:internal/modules/cjs/loader:981:32)
0|www      |     at Function.Module._load (node:internal/modules/cjs/loader:822:12)
0|www      |     at Object.<anonymous> (/Users/dongzhiqin/.nvm/versions/node/v16.16.0/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
0|www      |     at Module._compile (node:internal/modules/cjs/loader:1105:14)
0|www      |     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
0|www      |     at Module.load (node:internal/modules/cjs/loader:981:32)

是因为我在项目中使用了es6语法,pm2无法识别,修改为dist文件夹内的路径(前提必须执行编译)

pm2 start ./dist/bin/www.js

pm2 list 查看进程

⇆ PM2+ activated | Instance Name: dongzhiqins-MacBook-Pro.local-b3a4 | Dash: https://app.pm2.io/#/r/guazsb3bmbmmdkn
┌────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name   │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 2  │ www    │ default0.0.0   │ fork    │ 0015   │ errored   │ 0%       │ 0b       │ don… │ disabled │
│ 3  │ www    │ default0.0.0   │ fork    │ 253000s     │ 0    │ online    │ 0%       │ 1.2mb    │ don… │ disabled │
└────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

id为2的进程是出错的,删除掉pm2 delete 2 ,id为3是正常运行的进程。

修改package.json的脚本,"server:prod" : "node ./dist/bin/www" 修改为

"server:prod": "pm2 start ./dist/bin/www.js"

如果不喜欢pm2 start ./dist/bin/www.js这种书写方式,也可以指定一个执行文件

创建ecosystem.config.js

module.exports={
  apps: [
    {
      name: 'node-server',
      script: "./bin/www.js",
      cwd: "./dist"
    }
  ]
}

在根目录下执行pm2 start ecosystem.config.js

服务已经正常启动了,查看端口使用情况lsof -i tcp:3000

(base) ➜  node-demo git:(master) ✗ lsof -i tcp:3000
COMMAND   PID       USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node    34791 dongzhiqin   23u  IPv6 0x3690a130995da763      0t0  TCP *:hbci (LISTEN)
(base) ➜  node-demo git:(master) ✗

参数说明

  • --watch:监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。
  • -i --instances:启用多少个实例,可用于负载均衡。如果-i 0或者-i max,则根据当前机器核数确定实例数目。
  • --ignore-watch:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules "some scripts""
  • -n --name:应用的名称。查看应用信息的时候可以用到。
  • -o --output <path>:标准输出日志文件的路径。
  • -e --error <path>:错误输出日志文件的路径。
  • --interpreter <interpreter>:the interpreter pm2 should use for executing app (bash, python...)。比如你用的coffee script来编写应用。
pm2 start app.js -i 3 # 开启三个进程
pm2 start app.js -i max # 根据机器CPU核数,开启对应数目的进程