PM2学习(二)配置文件&环境管理
配置文件
简单说明
- 配置文件里的设置项,跟命令行参数基本是一一对应的。
- 可以选择
yaml
或者json
文件,就看个人喜好。 - 如果启动的时候指定了配置文件,那么命令行参数会被忽略。(个别参数除外,比如--env)
举个简单例子,如下json文件,完整配置说明请参考官方文档。
{ "apps": // apps属性配置了需要pm2管理的服务群,为一个数组,可配置多个项目 [ { "name": "test", //项目名称(应用名称) "cwd": "/project/test", //项目目录 "script": "bin/www", //项目的启动文件 "log_date_format": "YYYY-MM-DD HH:mm Z", // 日志日期格式,Z 为时区 "error_file": "/project/log/testError.log", // 错误日志目录 "out_file": "/project/log/test.log", // 普通日志目录 "pid_file": "/project/pid/test.pid", // 项目pid文件 "min_uptime": "120s", // 最小运行时间,如果程序在这个时间内退出,会被认为错误,自动重启 "max_restarts": 8, // 最大的自动重启次数 "max_memory_restart": "10M", // 重启占用最大内存 "cron_restart": "1 0 * * *", // 定时重启 (*/30 * * * *)每隔30分钟重启一次,(0 10 9 * * *) 每天9:10重启一次 "exec_interpreter": "node", //项目的脚本类型,默认node,可选shell "exec_mode": "fork", // 项目的启动方式,默认fork,可选cluster[集群],若为cluster,可配置instances "instances": 4, // 实例个数,如果exec_mode为cluster[集群],可配置集群实例的个数 "autorestart": false, // 启用/禁用 项目崩溃或退出时自动重启 "vizion": false // 启用/禁用 vizion特性(版本控制) "watch": [ // 监控变化的目录,一旦变化,自动重启 "bin", "routers" ], "ignore_watch" : [ // 从监控目录中排除 "node_modules", "logs", "public" ], "watch_options": { "followSymlinks": false }, "env": { // 环境变量配置 "NODE_ENV": "production" // 环境参数,当前指定为生产环境 "PORT": 5650, // 端口 }, "kill_timeout": 10000 } ] }
- watch可以是布尔值,路径数组或表示路径的字符串。默认为false。
- ignore_watch可以是一个路径数组或一个字符串,它将被chokidar解释为glob或正则表达式。
- watch_options是一个替代chokidar的选项的对象。有关定义,请参阅chokidar文档。
也可以使用pm2 init
命令,创建一个ecosystem.config.js
文件,其中已经有默认的配置。
module.exports = {
apps : [{
name: 'API',
script: 'app.js',
// Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
args: 'one two',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'development'
},
env_production: {
NODE_ENV: 'production'
}
}],
deploy : {
production : {
user : 'node',
host : '212.83.163.1',
ref : 'origin/master',
repo : 'git@github.com:repo.git',
path : '/var/www/production',
'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production'
}
}
};
简单介绍一下:apps属性配置了需要pm2管理的服务群。
然后deploy属性支持用户使用pm2直接把多个服务群部署到阿里云。
然后使用: pm2 start ecosystem.config.js
部署到云上,这里不展示了,只要配置好ssh,即可部署到任意云平台。
更多配置参数参考:pm2入坑详解
环境管理
在实际项目开发中,我们的应用经常需要在多个环境下部署,比如开发环境、测试环境、生产环境等。在不同环境下,有时候配置项会有差异,比如链接的数据库地址不同等。
对于这种场景,pm2也是可以很好支持的。首先通过在配置文件中通过env_xx
来声明不同环境的配置,然后在启动应用时,通过--env
参数指定运行的环境。
环境配置声明
首先,在配置文件中,通过env
选项声明多个环境配置。简单说明下:
env
为默认的环境配置(生产环境),env_dev
、env_test
则分别是开发、测试环境。可以看到,不同环境下的NODE_ENV
、REMOTE_ADDR
字段的值是不同的。- 在应用中,可以通过
process.env.REMOTE_ADDR
等来读取配置中生命的变量。
"env": {
"NODE_ENV": "production",
"REMOTE_ADDR": "http://www.example.com/"
},
"env_dev": {
"NODE_ENV": "development",
"REMOTE_ADDR": "http://wdev.example.com/"
},
"env_test": {
"NODE_ENV": "test",
"REMOTE_ADDR": "http://wtest.example.com/"
}
启动指明环境
假设通过下面启动脚本(开发环境),那么,此时process.env.REMOTE_ADDR
的值就是相应的 http://wdev.example.com/ ,可以自己试验下。
pm2 start app.js --env dev
对于我们init生成的ecosystem.config.js文件,我们可以将其修改成
{
env: {
NODE_ENV: 'dev'
},
env_development: {
NODE_ENV: 'dev'
},
env_production: {
NODE_ENV: 'prod'
}
}
他们对应的启动命令分别为:
-
pm2 start ecosystem.config.js --watch --env
-
pm2 start ecosystem.config.js --watch --env development
-
pm2 start ecosystem.config.js --watch --env production
实战配置文件
1、activity项目
pm2.config.js:
module.exports = { apps: [ { name: 'game-activity-dev6', script: './server/index.js', env_dev: { PORT: 6015, NODE_ENV: 'development', } }, ], };
pm2test.config.js:
// 此文件为staging环境下的启动文件。 module.exports = { "apps": [{ "env": { "NODE_ENV": "development", "NODE_BUILD": "test", "PORT": 6015 }, "name": "game-activity", "script": "server/index.js" }] }
pm2.json:
{ "apps": [{ "env": { "NODE_ENV": "production", "PORT": 6015 }, "name": "game-activity", "script": "server/index.js", "execMode": "cluster", "watch": "process.env.NODE_ENV !== 'production'", "ignore_watch": ["node_modules", "dist", "build"], "instances": 20, "max_memory_restart": "1024M", "kill_timeout": 2000, "max_restarts": 20, "autorestart": true, "restart_delay": 1000 }] }
2、gamecenter项目
pm2.config.js:
module.exports = { apps: [
{ name: 'game-center-dev1', script: 'server/index.js', env_dev: { NODE_ENV: 'test', PORT: 5650, }, }, { name: 'game-center-dev2', script: 'server/index.js', env_dev2: { NODE_ENV: 'development', PORT: 5651, }, }, { name: 'game-center-dev3', script: 'server/index.js', env_dev3: { NODE_ENV: 'development', PORT: 5652, }, }, { name: 'game-center-dev4', script: 'server/index.js', env_dev4: { NODE_ENV: 'development', PORT: 5653, }, }, { name: 'game-center-dev5', script: 'server/index.js', env_dev5: { NODE_ENV: 'development', PORT: 5654, }, }, { name: 'game-center-dev6', script: 'server/index.js', env_dev6: { NODE_ENV: 'development', PORT: 5655, }, }, { name: 'game-center-dev7', script: 'server/index.js', env_dev7: { NODE_ENV: 'development', PORT: 5656, }, }, ], };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决