【问题标题】:Run Upstart with Forever永远运行新贵
【发布时间】:2014-05-20 07:48:21
【问题描述】:

我们在 Ubuntu (13.10) 服务器上有一系列 node.js 脚本,我们希望尽可能多地保持和运行,并在服务器重新启动时自动重新启动。我们尝试了几种不同的技术,但还没有找到可行的解决方案。

设置:没有脚本在 80 端口上运行,而是在 8000 以上的端口上运行。

Node.js 文件当前在/usr/lib/sites/path/Node 中运行

我们已经使用 Forever 单独设置和运行它们,同时在特权(但不是 root)用户的上下文中运行,只需从包含脚本的文件夹的上下文中运行以下命令:

forever start server_process.js

我们希望在服务器启动时运行这些脚本,并在以后(如果需要)能够重新启动它们。

Upstart 听起来应该是解决方案,但我们还没有设法让它发挥作用。以下脚本启动,然后停止,但没有说明原因...

description "Our app"
version "1.0"
author "Nautilytics"

start on startup
stop on shutdown

expect fork

env FOREVER_PATH=/usr/bin/forever
env APPLICATION_DIRECTORY=/usr/lib/sites/path/Node
env APPLICATION_START=ourapp.js
env LOG_PATH=/var/log/ourapp.log

chdir /usr/lib/sites/path/Node

script
    exec $FOREVER_PATH start --sourceDir $APPLICATION_DIRECTORY -f -v $APPLICATION_START >> $LOG_PATH 2&>1
end script

通过直接的尝试和错误,有几次我们能够得到错误,表明无法找到其他文件(ourapp.js 需要),好像chdir 没有工作或通过永远的开始。

【问题讨论】:

  • 为什么首先需要 Forever? Upstart 可以满足您的要求。另一方面,Upstart 将是 replacedsystemd,因此也许 Upstart 都不是要走的路。
  • 我们认为 forever 有点多余,在 upstart 中重生可以处理这个任务。

标签: node.js init upstart forever


【解决方案1】:

你检查过 process.cwd() 吗?可能是您的进程正在其他地方运行。

【讨论】:

    【解决方案2】:

    在互联网上搜索解决方案后,我们决定坚持使用 nodejs,而不是永远使用这个任务。它更容易,并且随着重生它几乎可以完成我们需要永远为我们做的所有事情。

    start on runlevel [2345]
    
    stop on shutdown
    
    respawn
    
    script
        exec sudo nodejs /usr/lib/sites/path/Node/ourapp.js 2>&1 >> /var/log/ourapp.log
    end script
    

    【讨论】:

    • 以 root 身份运行 nodejs 被认为是不安全的。建议以 www-data 或nobody 等非特权用户身份运行nodejs。
    • +1 ,我通过提供如下绝对路径永远做到了:exec /usr/bin/forever /usr/lib/sites/path/Node/ourapp.js 2>&1 >> /var/log/ourapp.log
    【解决方案3】:

    一个更安全的新贵配置脚本可能是(hardened-nodejs.conf):

    description "Managing and monitoring nodejs application"
    
    # start when filesystem is mounted networking is up
    start on (filesystem and net-device-up IFACE!=lo)
    # stop on shutting down the system
    stop on runlevel [016]
    
    # application environment
    # staging and development instances should use hardened-nodejs.override to define environment
    env NODE_ENV=production
    
    # respawn the job up to 10 times within a 5 second period.
    # If the job exceeds these values, it will be stopped and marked as failed.
    respawn
    respawn limit 10 5
    
    # ssl-cert group can read certificates
    setuid www-data
    setgid ssl-cert
    
    exec  /usr/bin/nodejs /usr/lib/sites/path/Node/ourapp.js 2>&1 >> /var/log/ourapp.log
    

    在低端口上运行 nodejs 应用程序的一种解决方案可能是使用capabilities tools

    如果通过 SSL 服务,用户或组必须对证书具有读取权限。查看ssl-cert packagethis answer 了解基本概念。

    【讨论】:

      猜你喜欢
      • 2014-01-03
      • 2012-12-04
      • 2018-09-30
      • 1970-01-01
      • 2014-02-23
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      相关资源
      最近更新 更多