配置文件
当使用 PM2 管理多个应用程序时,请使用 JS 配置文件来组织它们。
生成配置
要生成示例配置文件,您可以键入以下命令
$ pm2 init simple
这将生成一个示例 ecosystem.config.js
module.exports = {
apps : [{
name : "app1",
script : "./app.js"
}]
}
如果您要创建自己的配置文件,请确保其以 .config.js
结尾,以便 PM2 能够将其识别为配置文件。
对配置文件进行操作
您可以无缝地启动/停止/重启/删除配置文件中包含的所有应用程序,而不是对应用程序进行操作
# Start all applications
pm2 start ecosystem.config.js
# Stop all
pm2 stop ecosystem.config.js
# Restart all
pm2 restart ecosystem.config.js
# Reload all
pm2 reload ecosystem.config.js
# Delete all
pm2 delete ecosystem.config.js
对特定进程进行操作
您还可以使用应用程序的名称和选项 --only <app_name>
对特定应用程序进行操作
pm2 start ecosystem.config.js --only api-app
注意:--only
选项也适用于启动/重启/停止/删除
您甚至可以通过指定以逗号分隔的每个应用程序名称来指定要对其进行操作的多个应用程序
pm2 start ecosystem.config.js --only "api-app,worker-app"
切换环境
您可以通过 env_*
选项指定不同的环境变量集。
示例
module.exports = {
apps : [{
name : "app1",
script : "./app.js",
env_production: {
NODE_ENV: "production"
},
env_development: {
NODE_ENV: "development"
}
}]
}
现在,要在不同环境中切换变量,请指定 --env [env name]
选项
pm2 start process.json --env production
pm2 restart process.json --env development
可用属性
可以使用以下属性微调应用程序行为和配置
通用
字段 | 类型 | 示例 | 描述 |
---|---|---|---|
name | (字符串) | “my-api” | 应用程序名称(默认为不带扩展名的脚本文件名) |
script | (字符串) | “./api/app.js” | 相对于 pm2 start 的脚本路径 |
cwd | (字符串) | “/var/www/” | 将从中启动应用程序的目录 |
args | (字符串) | “-a 13 -b 12” | 包含通过 CLI 传递给脚本的所有参数的字符串 |
interpreter | (字符串) | “/usr/bin/python” | 解释器绝对路径(默认为 node) |
interpreter_args | (字符串) | “–harmony” | 传递给解释器的选项 |
node_args | (字符串) | interpreter_args 的别名 |
高级功能
字段 | 类型 | 示例 | 描述 |
---|---|---|---|
instances | 数字 | -1 | 要启动的应用程序实例数 |
exec_mode | 字符串 | “cluster” | 启动应用程序的模式,可以是“cluster”或“fork”,默认为 fork |
watch | 布尔值或 [] | true | 启用监视和重启功能,如果文件夹或子文件夹中的文件发生更改,您的应用程序将重新加载 |
ignore_watch | 列表 | [”[\/\\]\./”, “node_modules”] | 要忽略的某些文件或文件夹名称的正则表达式列表,由监视功能提供 |
max_memory_restart | 字符串 | “150M” | 如果您的应用程序超过指定的内存量,它将重新启动。人性化格式:可以是“10M”、“100K”、“2G”等等…… |
env | 对象 | {“NODE_ENV”: “development”, “ID”: “42”} | 将出现在您的应用程序中的环境变量 |
env_ |
对象 | {“NODE_ENV”: “production”, “ID”: “89”} | 注入 |
appendEnvToName | 布尔值 | true | 默认为 false。用于在单个服务器上部署多个环境。它会将每个环境附加到名称。例如)my-api-production |
source_map_support | 布尔值 | true | 默认为 true,[启用/禁用源映射文件] |
instance_var | 字符串 | “NODE_APP_INSTANCE” | 请参阅文档 |
filter_env | 字符串数组 | [ “REACT_” ] | 排除以“REACT_”开头的全局变量,并且不允许它们渗透到集群中。 |
日志文件
字段 | 类型 | 示例 | 描述 |
---|---|---|---|
log_date_format | (字符串) | “YYYY-MM-DD HH:mm Z” | 日志日期格式(请参阅日志部分) |
error_file | (字符串) | 错误文件路径(默认为 $HOME/.pm2/logs/<app name>-error-<pid>.log) | |
out_file | (字符串) | 输出文件路径(默认为 $HOME/.pm2/logs/<app name>-out-<pid>.log) | |
log_file | (字符串) | 输出和错误日志的文件路径(默认情况下禁用) | |
combine_logs | 布尔值 | true | 如果设置为 true,则避免在日志文件名后缀进程 ID |
merge_logs | 布尔值 | true | combine_logs 的别名 |
time | 布尔值 | false | 默认为 false。如果为 true,则自动在日志前缀日期 |
pid_file | (字符串) | pid 文件路径(默认为 $HOME/.pm2/pids/<app name>-<pid>.pid) |
控制流
字段 | 类型 | 示例 | 描述 |
---|---|---|---|
min_uptime | (数字) | 应用程序被认为已启动的最短正常运行时间 | |
listen_timeout | 数字 | 8000 | 如果应用程序未侦听,则在强制重新加载之前的超时时间(以毫秒为单位) |
kill_timeout | 数字 | 1600 | 在发送 最终 SIGKILL 之前的超时时间(以毫秒为单位) |
shutdown_with_message | 布尔值 | false | 使用 process.send('shutdown') 而不是 process.kill(pid, SIGINT) 关闭应用程序 |
wait_ready | 布尔值 | false | 不是重新加载等待侦听事件,而是等待 process.send('ready') |
max_restarts | 数字 | 10 | 在您的应用程序被认为出错并停止重新启动之前连续不稳定重新启动的次数(小于 1 秒的间隔或通过 min_uptime 自定义的时间) |
restart_delay | 数字 | 4000 | 重新启动崩溃的应用程序之前等待的时间(以毫秒为单位)。默认为 0。 |
autorestart | 布尔值 | false | 默认为 true。如果为 false,则如果您的应用程序崩溃或正常结束,PM2 将不会重新启动它 |
cron_restart | 字符串 | “1 0 * * *” | 用于重新启动应用程序的 cron 模式。应用程序必须正在运行才能使 cron 功能正常工作 |
vizion | 布尔值 | false | 默认为 true。如果为 false,则 PM2 将在没有 vizion 功能(版本控制元数据)的情况下启动 |
post_update | 列表 | [“npm install”, “echo launching the app”] | 在您从 Keymetrics 仪表板执行拉取/升级操作后将执行的命令列表 |
force | 布尔值 | true | 默认为 false。如果为 true,您可以多次启动同一个脚本,这通常是不允许的 PM2 |
部署
条目名称 | 描述 | 类型 | 默认值 |
---|---|---|---|
key | SSH 密钥路径 | 字符串 | $HOME/.ssh |
user | SSH 用户 | 字符串 | |
host | SSH 主机 | [字符串] | |
ssh_options | 没有命令行标志的 SSH 选项,请参阅“man ssh” | 字符串或 [字符串] | |
ref | GIT 远程/分支 | 字符串 | |
repo | GIT 远程 | 字符串 | |
path | 服务器上的路径 | 字符串 | |
pre-setup | 预设命令或本地机器上脚本的路径 | 字符串 | |
post-setup | 后置设置命令或主机上脚本的路径 | 字符串 | |
pre-deploy-local | 预部署操作 | 字符串 | |
post-deploy | 后部署操作 | 字符串 |
注意事项
使用 JSON 应用程序声明时传递的所有命令行选项都将被丢弃,即
CWD
cwd:您的 JSON 声明不需要与您的脚本位于同一位置。如果您希望将 JSON 保留在脚本以外的位置(例如,/etc/pm2/conf.d/node-app.json
),则需要使用 cwd
功能(请注意,这对于使用符号链接的 capistrano 风格目录结构非常有用)。文件可以是相对于 cwd
目录的,也可以是绝对路径(请参见下面的示例)。
CLI/JSON 选项
所有键都可以在 JSON 配置文件中使用,但在命令行上几乎保持不变,例如
exec_mode -> --execute-command
max_restarts -> --max-restarts
force -> --force
使用引号进行转义,例如
$pm2 start test.js --node-args "port=3001 sitename='first pm2 app'"
nodeArgs
参数将被解析为
[
"port=3001",
"sitename=first pm2 app"
]
但不是
[
"port=3001",
"sitename='first",
"pm2",
"app'"
]
禁用日志
您可以将 /dev/null
传递给 error_file 或 out_file 以禁用日志保存。注意:从 PM2 2.4.0
开始,/dev/null
或 NULL
禁用日志,而与平台无关。
日志后缀
您可以通过启用 merge_logs: true
选项来禁用日志上的自动 ID 后缀(例如 app-name-ID.log
)
环境定义
您需要使用 --env <envname>
来告诉 pm2 使用进程文件中定义的特定环境
{
"apps" : [{
"name" : "worker-app",
"script" : "./worker.js",
"watch" : true,
"env": {
"NODE_ENV": "development"
},
"env_production" : {
"NODE_ENV": "production"
}
},{
"name" : "api-app",
"script" : "./api.js",
"instances" : 4,
"exec_mode" : "cluster"
}]
}
在此示例中,您将运行 pm2 start ecosystem.json
,它将使用默认环境(在开发中)启动您的应用程序。然后,您使用 pm2 start ecosystem.json --env production
,它将使用属性 env_<name>
,其中 name 在此处为 production
,因此它将使用 NODE_ENV=production
启动您的应用程序。
特殊 ext_type
- min_uptime
min_uptime
的值可以是- 数字 例如
"min_uptime": 3000
表示 3000 毫秒。 - 字符串 因此,我们使其配置起来简短易懂:
h
、m
和s
,例如:"min_uptime": "1h"
表示一小时,"min_uptime": "5m"
表示五分钟,"min_uptime": "10s"
表示十秒(这些将被转换为毫秒)。
- 数字 例如
- max_memory_restart
max_memory_restart
的值可以是- 数字 例如
"max_memory_restart": 1024
表示 1024 字节(不是位)。 - 字符串 因此,我们使其配置起来简短易懂:
G
、M
和K
,例如:"max_memory_restart": "1G"
表示 1 GB,"max_memory_restart": "5M"
表示 5 MB,"max_memory_restart": "10K"
表示 10 KB(这些将被转换为字节)。
- 数字 例如
-
可选值 例如,
exec_mode
可以采用cluster
(cluster_mode
) 或fork
(fork_mode
) 作为可能的值。 - 需要注意的事项
"instances": 0
表示 PM2 将根据 CPU 数量启动尽可能多的进程(集群模式)- 数组
args
、node_args
和ignore_watch
的类型可以是Array
(例如:"args": ["--toto=heya coco", "-d", "1"]
)或string
(例如:"args": "--to='heya coco' -d 1"
)