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