Heroku:在临时站点上运行不同的Web服务器进程?

时间:2013-03-12 20:18:47

标签: heroku

我想在我的一个临时站点上运行不同的Web服务器,这提供了更多适合调试的错误处理。我想知道是否/如何实现这一点,而无需在我的暂存和生产部署之间更改Procfile。

我试过了:

web: newrelic-admin run-program python manage.py run_gunicorn -b 0.0.0.0:$PORT -w 4 -k gevent 
debug: newrelic-admin run-program python manage.py runserver_plus 0.0.0.0:$PORT --threaded

然后将web缩放为0并调试为1,但现在我this article清楚地知道 web 是一个特殊的保留关键字,这是获取http请求的唯一进程。那么有没有办法管理这个,而无需维护一个单独的分支等?

2 个答案:

答案 0 :(得分:5)

当然可以。

如您所知,您需要使用“网络”流程类型。

请记住,流程类型实际上只是命名命令:“每个流程类型都是在启动该流程类型的dyno时执行的命令的声明”

您可以控制命令。

在一个小测试应用程序中,我刚创建了一个bin目录,添加了一个文件,并赋予它执行权限 - 如下所示:

mkdir bin
vi bin/go.sh
chmod a+x bin/go.sh

内容如下:

echo $*
echo $FOOBAR
thin --rackup config.ru start $*

然后我修改了我的Procfile,如下所示:

web: ~/bin/go.sh --port $PORT

我还在我的应用中添加了配置变量:

heroku config:添加FOOBAR = 123

然后我在启动后查看了日志

2013-03-14T11:49:42+00:00 heroku[web.1]: Starting process with command `~/bin/go.sh --port 47302` 2013-03-14T11:49:43+00:00 app[web.1]: --port 47302 2013-03-14T11:49:43+00:00 app[web.1]: 123 2013-03-14T11:49:44+00:00 heroku[web.1]: State changed from starting to up

优异。你能看出发生了什么吗?

  • 当我启动web dyno时,Heroku查找了Web进程类型并执行了命令
  • 该命令启动了我的服务器,但在此之前,它打印了发送给它的参数(--port XXX)和FOOBAR环境变量(将由config var设置)

所以我认为这就是你所需要的。只需编写一个bash脚本,根据config var,在staging vs production上执行不同的命令。在暂存时,设置config var。在生产上,不要。

答案 1 :(得分:1)

您可以创建一个单独的Heroku应用程序作为您的暂存环境并使用相同的代码库(本地git repo)。见Managing Multiple Environments for an App

请注意,您询问的具体任务涉及更改Procfile,因此您可能需要使用分支。在这种情况下,你像这样推动分支(假设按照上面的指南多个env):

$ git push heroku-staging <branch_name>:master --app staging_app_name