符号链接目录中的 pm2 应用程序产生 502 Bad Gateway

pm2 app in symlink'd directory yields 502 Bad Gateway

我有一个 node.js 应用程序通过 pm2 配置为 运行,目录结构如下:

/opt/project/v1/web/index.js
/opt/project/current -> /opt/project/v1

也就是说,currentv1 的符号链接。我需要 pm2 才能在 current/web 中启动应用程序,而不是在 v1/web.[=26= 中]

我第一次这样做:

cd /opt/project/current/web
pm2 start index.js

网站 运行 很好,但是 pm2 将符号链接解析为 /opt/project/v1/web/index.js.所以我找到了 this forum thread about pm2 resolving symlinks,并从那里尝试了这个:

cd /opt/project
pm2 start current/web/index.js

该进程似乎已启动,并且 pm2 将其显示在列表中并显示了符号路径,但访问该页面现在会产生 502(错误的网关)错误。

最后一次尝试 pm2 show 的输出是:

┌───────────────────┬───────────────────────────────────────┐
│ status            │ online                                │
│ name              │ index                                 │
│ restarts          │ 7                                     │
│ uptime            │ 2s                                    │
│ script path       │ /opt/project/current/web/index.js     │
│ script args       │ N/A                                   │
│ error log path    │ /root/.pm2/logs/index-error-0.log     │
│ out log path      │ /root/.pm2/logs/index-out-0.log       │
│ pid path          │ /root/.pm2/pids/index-0.pid           │
│ interpreter       │ node                                  │
│ interpreter args  │ N/A                                   │
│ script id         │ 0                                     │
│ exec cwd          │ /opt/project                          │
│ exec mode         │ fork_mode                             │
│ node.js version   │ 6.8.1                                 │
│ watch & reload    │ ✘                                     │
│ unstable restarts │ 0                                     │
│ created at        │ 2016-12-03T22:08:58.972Z              │
└───────────────────┴───────────────────────────────────────┘

认为可能是不同的 cwd 是个问题,然后我尝试了这个,也是从那个线程:

  1. 创建文件app.json:

    {
     "apps": [
        {
          "name": "index",
          "script": "index.js",
          "args": [],
          "watch": true,
          "node_args": "",
          "merge_logs": true,
          "cwd": "/opt/project/current/web",
          "env": {
          }
        }
      ]
    }
    
  2. 开始于pm2 start app.json

当我这样做时,结果与之前的尝试相同,除了 pm2 显示正确的 cwd,但仍然得到 502。

None 的日志文件似乎显示任何错误并且 pm2 显示应用在线。

我真的对node.js或pm2一无所知,我被交给了一个现有的系统,并负责稍微重组文件系统。我现在对 pm2 的命令有非常基本的工作知识,仅此而已。

所以我的问题是:如何在符号链接路径中将应用程序转到 运行 以及为什么在我尝试时它会以 502 响应?

好吧,我明白了。我通过使用这个配置文件(另存为app.json)解决了它:

{
    "apps": [
    {
        "name": "index",
        "script": "./index.js",
        "cwd": "/opt/project/current/web",
        "exec_mode": "fork_mode",
        "env": {
        }
    }
    ]
}

然后像这样开始:

cd /opt/project
pm2 start current/web/app.json

它的效果非常好,虽然我不确定究竟是哪个差异解决了问题,但我没有花时间进一步调查。