我是否可以告诉工头每次提出请求时重新加载网络应用程序,这样我可以正常发展?

时间:2012-02-03 15:54:45

标签: node.js foreman

我使用node.js在JavaScript中编写的Web应用程序。我使用Foreman,但每次更改代码时我都不想手动重启服务器。我可以告诉Foreman在处理HTTP请求之前重新加载整个Web应用程序(即重新启动node进程)吗?

6 个答案:

答案 0 :(得分:23)

这是Pendlepants解决方案的调整版本。 Foreman查找.env文件来读取环境变量。而不是添加包装器,您可以让Foreman切换它用于启动的命令:

在.env:

WEB=node app.js

在dev.env中:

WEB=supervisor app.js

在您的Procfile中:

web: $WEB

默认情况下,Foreman会从.env(生产中)读取,但在DEV中只需运行:

foreman start -e dev.env

答案 1 :(得分:7)

您可以将rerun用于此目的

您可能只为此实现2个命令:

  1. gem install rerun
  2. 重新开始领班开始
  3. 然后,在文件发生任何更改后,重新运行将自动重启进程。

答案 2 :(得分:6)

如果您使用nodemon  ,你可以做到

nodemon --exec "foreman start"

答案 3 :(得分:3)

问题不在于Foreman,而在于节点如何不在新请求上重新加载代码。解决方案是使用像supervisor这样的npm包以及Foreman的环境包装器。

首先,安装主管:

npm install -g supervisor

然后,编写一个Foreman可以调用的包装器shell脚本:

if [ "$NODE_ENV" == "production" ]; then
  node /path/to/app.js
else
  supervisor /path/to/app.js
fi

通过运行chmod a+x /path/to/wrapper_script.sh

将包装器脚本的权限设置为可执行文件

最后,更新工头使用包装器脚本。所以在Procfile

web: /path/to/wrapper_script.sh

现在,当您运行Foreman并且您的节点应用程序未在生产环境中运行时,它应该在每次请求时重新加载。

答案 4 :(得分:2)

我觉得Peter Ehrlich对原始问题的评论应该是一个独立的答案。我认为本地/ dev的不同Procfile绝对是最好的解决方案:https://stackoverflow.com/a/10790514/133720

答案 5 :(得分:0)

如果您使用node-dev。

,您甚至不需要安装任何新内容

从Procfile加载的.env文件:

NODECMD=node-dev

你的Procfile:

web: $NODECMD app/server.js

你的领班命令

foreman start -e dev.env -p 9786

在你的生产中,env(heroku)设置了一个环境变量:

NODECMD=node