具体细节 Specifics

在没有 root 的情况下监听 80 端口

在没有 root 的情况下监听 80 端口

一般规则是您不应以 root 身份运行节点。 但是只有 root 可以绑定到小于 1024 的端口。这就是 authbind 的用武之地。Authbind 允许非 root 用户绑定到小于 1024 的端口。将 %user% 替换为将运行 pm2 的用户。

bash
sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chown %user% /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80

您还应该为运行“pm2”配置文件的用户添加一个别名,例如 ~/.bashrc~/.zshrc(注意您需要在之后立即运行 source ~/.bashrcsource ~/.zshrc):

diff
+alias pm2='authbind --deep pm2'

最后确保使用 authbind 更新 pm2

sh
authbind --deep pm2 update

或者如果您将别名添加到用户的个人资料中,则只需“pm2 update”。

现在您可以使用 PM2 启动应用程序,无需 root 即可绑定到端口 80!

同一台服务器上的多个PM2

客户端和守护进程通过 $HOME/.pm2/pub.sock 和 $HOME/.pm2/rpc.sock 中可用的套接字文件进行通信。

您可以通过更改 PM2_HOME 环境变量来启动多个 PM2 实例。

bash
PM2_HOME='.pm2' pm2 start echo.js --name="echo-node-1"
PM2_HOME='.pm3' pm2 start echo.js --name="echo-node-2"

这将启动两个不同的 PM2 实例。 要列出由每个不同实例管理的进程,请执行以下操作:

bash
PM2_HOME='.pm2' pm2 list
PM2_HOME='.pm3' pm2 list

在没有守护进程的情况下启动 PM2

确保在以无守护进程模式 (pm2 kill) 启动 PM2 之前杀死任何 PM2 实例。 在没有守护进程的情况下启动 PM2:

bash
pm2 start app.js --no-daemon

在安装 PM2 时还默认安装了 CLI pm2-runtime,它是 Node.js 二进制文件的直接替代品。

无状态应用

一般规则是您的生产应用程序应该是无状态的。 每个数据、状态、websocket 会话、会话数据都必须通过任何类型的数据库或 PUB/SUB 系统共享。

否则,您的应用程序将很难在同一台服务器上和跨多台服务器进行扩展。

例如,您可以使用 connect-redis 来共享会话。

我们还建议您遵循 12 因子约定:http://12factor.net/

在服务器上设置 pm2

如何使用 pm2 在 Ubuntu VPS 上设置 Node.js 生产环境.

Log and PID files

默认情况下,日志(错误和输出)、pid 文件、转储和 PM2 日志位于 ~/.pm2/ 中:

.pm2/
├── dump.pm2
├── custom_options.sh
├── pm2.log
├── pm2.pid
├── logs
└── pids

Enabling Harmony ES6

--node-args 选项允许向节点解释器添加参数。 要为进程启用和谐,请键入以下命令:

bash
pm2 start my_app.js --node-args="--harmony"

在 JSON 声明中:

json
[{
  "name": "ES6",
  "script": "es6.js",
  "node_args": "--harmony"
}]

CoffeeScript

CoffeeScript v1

bash
pm2 install coffee-script
pm2 start app.coffee

CoffeeScript v2

bash
pm2 install coffeescript
pm2 start app.coffee

That's all!

Piping JSON

Pull-requests:

bash
#!/bin/bash

read -d '' my_json <<_EOF_
[{
    "name"       : "app1",
    "script"     : "/home/projects/pm2_nodetest/app.js",
    "instances"  : "4",
    "error_file" : "./logz/child-err.log",
    "out_file"   : "./logz/child-out.log",
    "pid_file"   : "./logz/child.pid",
    "exec_mode"  : "cluster_mode",
    "port"       : 4200
}]
_EOF_

echo $my_json | pm2 start -

进程标题

您可以在使用 PM2 启动应用程序时指定环境变量 PROCESS_TITLE,它将设置一个进程标题。 它在尝试从进程中获取特定数据时非常有用,例如,您可以使用 ps -fC name

转译器

参考 将转译器与 PM2 一起使用 教程。

来自问题的用户提示

External resources and articles