我正在使用 node.js 用 JavaScript 编写的 Web 应用程序。我使用 Foreman,但我不想每次更改代码时都手动重新启动服务器。我可以告诉工头在处理 HTTP 请求(即重新启动node
进程)之前重新加载整个 Web 应用程序吗?
6 回答
这是 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
如果你使用nodemon ,你可以做
nodemon --exec "foreman start"
问题不在于工头,而在于节点如何在新请求上不重新加载代码。解决方案是使用像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 并且您的节点应用程序没有在生产中运行时,它应该在每个请求时重新加载。
我觉得 Peter Ehrlich 对原始问题的评论值得单独回答。我认为 local/dev 的不同 Procfile 绝对是最好的解决方案:https ://stackoverflow.com/a/10790514/133720
如果你使用 node-dev,你甚至不需要安装任何新东西。
您从 Procfile 加载的 .env 文件:
NODECMD=node-dev
你的档案:
web: $NODECMD app/server.js
你的工头命令
foreman start -e dev.env -p 9786
并在您的生产环境(heroku)中设置一个环境变量:
NODECMD=node