[英]Error running legacy node.js app with nvm and pm2
我有一個舊的 nodejs應用程序(在v0.8.18
下v0.8.18
!),出於歷史原因,我想繼續運行。 我可以從命令行(即$ node app
)正常運行它,但不能通過pm2(即$ pm2 start app
)運行它。
nvm
v0.8.18
v9.3.0
與最新的穩定版本pm2
全球的裝機量 pm2.json
,如下所示: [{
"name": "my-old-app",
"exec_interpreter": "node@0.8.18",
"script": "app.js",
"error": "error.log"
}]
$ 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
它始終會失敗。 事實證明,這個軟件包的原始作者使用了一個奇怪的,有錯誤的,中間版本的bcrypt
( v0.7.5
)。 當我切換它到一個稍微新bcrypt
( v0.7.6
),我是能夠與節點運行整個應用程序v0.9.12
,這反過來又使得它的安全為pm2
使用unref()
pm2
來嘗試運行節點應用<v0.9.1
,或 >=v0.9.1
運行它。 其中一個維護者的pm2
讓我知道他們不正式支持的的NodeJS任何版本<v0.12
為他們很快就會下探支持,以及 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.