簡體   English   中英

使用nvm和pm2運行舊版node.js應用程序時出錯

[英]Error running legacy node.js app with nvm and pm2

我的問題

我有一個舊的 nodejs應用程序(在v0.8.18v0.8.18 !),出於歷史原因,我想繼續運行。 我可以從命令行(即$ node app )正常運行它,但不能通過pm2(即$ pm2 start app )運行它。

這是我的設置:

  • Ubuntu 16.04
  • 使用nvm
    • 安裝了用於運行舊版應用程序的節點v0.8.18
    • 節點v9.3.0與最新的穩定版本pm2全球的裝機量
  • 通過nginx對應用進行反向代理(大致遵循以下說明
  • 我在此線程之后創建的應用程序的根文件夾中有一個配置文件pm2.json ,如下所示:
[{
  "name": "my-old-app",
  "exec_interpreter": "node@0.8.18",
  "script": "app.js",
  "error": "error.log"
}]
  • 從pm2開始:
$ NVM_DIR=/home/myusername/.nvm/ pm2 start pm2.json

產量:

$ NVM_DIR=/home/myusername/.nvm/ pm2 start pm2.json
[PM2][WARN] Applications my-old-app not running, starting...
[PM2] Setting Node to v0.8.18 (path=/home/myusername/.nvm/v0.8.18/bin/node)
[PM2] App [my-old-app] launched (1 instances)
┌─────────────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬────────────┬──────────┐
│ App name        │ id │ mode │ pid  │ status │ restart │ uptime │ cpu │ mem      │ user       │ watching │
├─────────────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼────────────┼──────────┤
│ my-old-app      │ 0  │ fork │ 5879 │ online │ 0       │ 0s     │ 0%  │ 7.9 MB   │ myusername │ disabled │
└─────────────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴────────────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

當我開始嘗試以這種方式啟動應用程序時,這是運行pm2 show my-old-app

 Describing process with id 0 - name my-old-app
┌───────────────────┬──────────────────────────────────────────────────┐
│ status            │ errored                                          │
│ name              │ my-old-app                                       │
│ restarts          │ 15                                               │
│ uptime            │ 0                                                │
│ script path       │ /home/myusername/my-old-app/app.js               │
│ script args       │ N/A                                              │
│ error log path    │ /home/myusername/my-old-app/error-0.log          │
│ out log path      │ /home/myusername/.pm2/logs/my-old-app-out-0.log  │
│ pid path          │ /home/myusername/.pm2/pids/my-old-app-0.pid      │
│ interpreter       │ /home/myusername/.nvm/v0.8.18/bin/node           │
│ interpreter args  │ N/A                                              │
│ script id         │ 0                                                │
│ exec cwd          │ /home/myusername/my-old-app/                     │
│ exec mode         │ fork_mode                                        │
│ node.js version   │ N/A                                              │
│ watch & reload    │ ✘                                                │
│ unstable restarts │ 0                                                │
│ created at        │ N/A                                              │
└───────────────────┴──────────────────────────────────────────────────┘

此外,在error-0.log反復出現的error-0.log是:

domain.js:66
    throw er;
          ^
TypeError: Object #<Object> has no method 'unref'
    at Object.PMX.init (/home/myusername/.nvm/versions/node/v9.3.0/lib/node_modules/pm2/node_modules/pmx/lib/pmx.js:81:8)
    at Object.<anonymous> (/home/myusername/.nvm/versions/node/v9.3.0/lib/node_modules/pm2/lib/ProcessContainerFork.js:8:18)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain (module.js:492:10)
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)

我不知道為什么這行不通。

有什么用

如果我只是從命令行正常運行應用程序,則它可以按預期正常運行,即

$ nvm use 0.8.18
Now using node v0.8.18 (npm v1.2.2)
$ node app
   info  - socket.io started
Express server listening on port 37426

它可以通過nginx反向代理,並且可以通過https://old.example.com在瀏覽器中使用。 僅供參考,我的nginx網站配置的內容:

server {
  listen 80;
  listen [::]:80;
  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/old.example.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/old.example.com/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf;

  server_name old.example.com;

  if ($scheme != "https") {
    return 301 https://$host$request_uri;
  }

  # Pass requests for / to localhost:37426:
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://localhost:37426/;
    proxy_ssl_session_reuse off;
    proxy_set_header Host $http_host;
    proxy_cache_bypass $http_upgrade;
    proxy_redirect off;
  }
}

顯然,我不能僅使用此設置,因為如果該進程由於某種原因被中斷,則不會重新啟動。 有任何想法嗎? 我嘗試僅在節點v9.3.0運行應用程序,但是代碼太舊了。 它也太廣泛了,無法以最新形式重寫。

從錯誤日志中,您似乎正在嘗試使用節點v9.3.0運行該應用程序。

將您的命令修改為類似以下內容[未測試]

NVM_DIR=/home/myusername/.nvm/ nvm use 0.8.18 && pm2 start pm2.json

我想到了。 pm2取決於pmx ,這反過來使用setTimeout().unref()函數 直到v0.9.1才將unref()函數添加到v0.9.1 由於我嘗試使用節點v0.8.18運行我的應用程序,因此unref()函數未定義,因此Object #<Object> has no method 'unref'錯誤消息。

嘗試在較新的節點版本下運行我的應用程序始終會失敗,但是最終我意識到,由於使用了相同的軟件包bcrypt它始終會失敗。 事實證明,這個軟件包的原始作者使用了一個奇怪的,有錯誤的,中間版本的bcryptv0.7.5 )。 當我切換它到一個稍微新bcryptv0.7.6 ),我是能夠與節點運行整個應用程序v0.9.12 ,這反過來又使得它的安全為pm2使用unref()

綜上所述...

  1. 不要試圖用pm2來嘗試運行節點應用<v0.9.1 ,或
  2. 如果這樣做,則可能需要修改應用程序,以便可以在節點>=v0.9.1運行它。

更新資料

其中一個維護者的pm2讓我知道他們不正式支持的的NodeJS任何版本<v0.12為他們很快就會下探支持,以及

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM