我想在我的 Linux 服务器(共享主机)上无限期地运行我的 node.js 服务器。
最初,我使用 进行设置forever
,这种方法可以工作一段时间。但是,我注意到大约 2 周后,永久守护进程和 node.js 服务器进程都消失得无影无踪。没有任何日志。
然后,我切换到我目前正在使用的 - pm2 作为守护程序实用程序。一切都很顺利......但事情并不顺利。一段时间后,Pm2 也关闭了。对此感到愤怒,我设置了一个 cron 作业,基本上用我的 node.js 服务器重新启动 pm2。所有输出都被发送到我的收件箱。
直到本周一 (2019 年 7 月 15 日) 一切都还好。然而,周一午夜过后 16 分钟,又出现了问题。这是尝试重启服务器的 cron 作业的输出:
[PM2] Spawning PM2 daemon with pm2_home=/home/jwroczyn/.pm2
[PM2] PM2 Successfully daemonized
[PM2][ERROR] Interpreter node does not seem to be available
[PM2] Starting /home/jwroczyn/krzemien/krzemien-api/server.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬─────────┬──────┬─────┬─────────┬─────────┬────────┬─────┬────────┬──────────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────┼────┼─────────┼──────┼─────┼─────────┼─────────┼────────┼─────┼────────┼──────────┼──────────┤
│ server │ 0 │ 1.0.6 │ fork │ N/A │ errored │ 0 │ 0 │ 0% │ 0 B │ jwroczyn │ disabled │
└──────────┴────┴─────────┴──────┴─────┴─────────┴─────────┴────────┴─────┴──────
Use `pm2 show <id|name>` to get more details about an app
地位:errored
。
之所以切换到online
仅是因为我杀死了所有 pm2 进程并再次重新启动了守护进程。
不幸的是,我没有保存pm2 show
命令的输出(基本上没有任何有用的信息)。但是,当我运行 时pm2 monit
,服务器的内存使用量值类似于 %f25 - 不完全是数字。不确定该内存使用量是怎么回事。
我不知道接下来要做什么。
我只想让我的 node.js 服务器正常运行。
答案1
读完你的帖子后,我的危险信号是共享主机。您遇到的症状是共享主机限制的典型迹象:
- 一段时间后进程被终止
- 没有失败进程的日志(可能是因为它们被杀死了
SIGKILL
) - 自定义二进制文件(就你的情况而言
node
)消失或变得无法访问
进程控制守护进程PM2,forever
, 和导师擅长通过重新启动来保持其子进程处于活动状态,但是如果它们自己被终止,就没有什么可以保护它们了。
在共享主机中,用户进程应在访问者访问用户网站时消耗资源,然后在页面生成完成后释放资源。Apache 下的 PHP 通常这样做,但 Node.js 应用程序是自己的服务器,可以无限期地保留自己的资源。
共享主机提供商喜欢终止长时间运行的进程,因为这意味着他们正在为你分配内存和 CPU 时间,而这不符合他们的利益超卖他们可以很容易地做到这一点——RLIMIT_CPU
参见setrlimit(2)
:
限制CPU数量
CPU 时间限制(以秒为单位)。[…] 如果进程继续消耗 CPU 时间,则会发送信号处理每秒一次,直到达到硬限制,此时将发送终止信号。
您找到了一种解决方法,即重新启动该过程计划任务,这将重置进程限制记账。这似乎对你有用,直到你的账户达到其他限制或服务器管理员禁用了你的 Node 解释器。也许你的托管服务提供商注意到他们试图终止的进程正在重生,因此他们可能只是node
通过删除它(rm node
)或关闭执行位(chmod -x node
)来阻止执行。
您可以继续对抗共享主机账户的限制,也可以切换到为您提供专用资源的其他类型的主机:
- 专用服务器,正如其名称所暗示的那样,可能是你最好的选择,因为资源是投入的给你。默认情况下,不会有限制策略或管理员终止你的进程。
- 一些虚拟专用服务器供应商也可能提供一些专用资源,但他们也容易超卖。
- 一种更现代的计费方式是基于使用量而不是固定费率无服务器计算. 这种计费模式根据您的需要为您的应用程序提供资源,从这个意义上来说,它是“专用的”,尽管您的应用程序是在与其他独立应用程序共享的一台或多台服务器上执行的。
如果您选择继续创造变通方法,它们只会变得更加复杂,您的正常运行时间将继续受到影响。您的共享托管服务提供商甚至可能会因为您试图绕过他们的限制而暂停您的服务。