如何在 Procfile 中 运行 两个进程?
How do I run two processes in Procfile?
我有一个 Flask 应用程序,我在其中嵌入了 Bokeh 服务器图,但我无法让它们同时在 Heroku 上工作。我正在尝试在 Heorku 上部署,我可以从 Procfile 启动 Bokeh 应用程序或 Flask 应用程序,但不能同时启动两者。因此,要么显示 Flask 提供的内容,要么显示散景图。
当我在 Procfile 中使用以下行进行部署时,Bokeh 内容显示在网页上,但 Flask 中没有任何内容:
web: bokeh serve --port=$PORT --host=bokehapp.herokuapp.com --host=* --address=0.0.0.0 --use-xheaders bokeh_script.py
如果我使用以下方式部署,我只会得到 Flask 内容,而不是 Bokeh 图:
web: gunicorn app:app
在第二种情况下,我使用子进程在 app.py Flask 脚本中启动 Bokeh:
bokeh_process = subprocess.Popen(
['bokeh', 'serve','--allow-websocket-origin=bokehapp.herokuapp.com','--log-level=debug','standard_way_with_curdoc.py'], stdout=subprocess.PIPE)
Heroku 日志未显示任何错误。
我也尝试了第三种选择:
web: bokeh serve --port=$PORT --host=bokehapp.herokuapp.com --host=* --address=0.0.0.0 --use-xheaders bokeh_script.py
web: gunicorn app:app
并且仅显示 Flask 内容。似乎只考虑了第二个工人。
所以,我的问题是如何修改 Procfile 以同时考虑这两个进程?
或者也许我一起接近这个错误?您能提供的任何线索将不胜感激。
每个 Heroku dyno 都分配了一个 public 网络端口,您可以从 $PORT
变量中获取该端口,该端口由 Heroku 在启动您的应用程序之前预先分配。不幸的是,你只能在 dyno 中使用一个 public 网络服务器 运行ning。
我认为您需要做的第一件事是通过 Flask 服务器将所有请求路由到您的应用程序。例如,您可以向 Flask 应用程序添加一个 /bokeh/<path:path>
路由,使用 requests 将所有请求转发到 bokeh 服务器,然后将响应发送回客户端。通过此更改,您现在拥有一个 public 网络服务器,并且散景服务器可以 运行 作为后台服务而无需 public 访问。
现在您可以将 Flask 应用程序部署到 Heroku,并让它接收自己的请求和对 bokeh 服务器的请求。下一步是弄清楚散景服务器的部署位置。
执行此操作的正确方法是在单独的测功机上部署散景。 Flask dyno 将知道如何将请求转发到 bokeh,因为您将拥有 bokeh 服务器的配置项 URL.
如果你想把所有东西都托管在一个测功机上,我想你也可以,尽管我自己从未尝试过,也无法确认它是否可行。一体式配置不太理想,也不是 Heroku 推荐的配置,但根据 dyno networking documentation 看来您可以私下侦听除 $PORT
之外的任何网络端口。这些 publicly 没有公开,但文档似乎暗示 dyno 中的进程 运行ning 可以通过专用端口进行通信。因此,例如,您可以在 $PORT
上启动 Flask 应用程序,在 $PORT + 1
上启动散景服务器,并让 Flask 在内部将所有散景请求转发到 $PORT + 1
。
我有一个 Flask 应用程序,我在其中嵌入了 Bokeh 服务器图,但我无法让它们同时在 Heroku 上工作。我正在尝试在 Heorku 上部署,我可以从 Procfile 启动 Bokeh 应用程序或 Flask 应用程序,但不能同时启动两者。因此,要么显示 Flask 提供的内容,要么显示散景图。
当我在 Procfile 中使用以下行进行部署时,Bokeh 内容显示在网页上,但 Flask 中没有任何内容:
web: bokeh serve --port=$PORT --host=bokehapp.herokuapp.com --host=* --address=0.0.0.0 --use-xheaders bokeh_script.py
如果我使用以下方式部署,我只会得到 Flask 内容,而不是 Bokeh 图:
web: gunicorn app:app
在第二种情况下,我使用子进程在 app.py Flask 脚本中启动 Bokeh:
bokeh_process = subprocess.Popen(
['bokeh', 'serve','--allow-websocket-origin=bokehapp.herokuapp.com','--log-level=debug','standard_way_with_curdoc.py'], stdout=subprocess.PIPE)
Heroku 日志未显示任何错误。
我也尝试了第三种选择:
web: bokeh serve --port=$PORT --host=bokehapp.herokuapp.com --host=* --address=0.0.0.0 --use-xheaders bokeh_script.py
web: gunicorn app:app
并且仅显示 Flask 内容。似乎只考虑了第二个工人。
所以,我的问题是如何修改 Procfile 以同时考虑这两个进程? 或者也许我一起接近这个错误?您能提供的任何线索将不胜感激。
每个 Heroku dyno 都分配了一个 public 网络端口,您可以从 $PORT
变量中获取该端口,该端口由 Heroku 在启动您的应用程序之前预先分配。不幸的是,你只能在 dyno 中使用一个 public 网络服务器 运行ning。
我认为您需要做的第一件事是通过 Flask 服务器将所有请求路由到您的应用程序。例如,您可以向 Flask 应用程序添加一个 /bokeh/<path:path>
路由,使用 requests 将所有请求转发到 bokeh 服务器,然后将响应发送回客户端。通过此更改,您现在拥有一个 public 网络服务器,并且散景服务器可以 运行 作为后台服务而无需 public 访问。
现在您可以将 Flask 应用程序部署到 Heroku,并让它接收自己的请求和对 bokeh 服务器的请求。下一步是弄清楚散景服务器的部署位置。
执行此操作的正确方法是在单独的测功机上部署散景。 Flask dyno 将知道如何将请求转发到 bokeh,因为您将拥有 bokeh 服务器的配置项 URL.
如果你想把所有东西都托管在一个测功机上,我想你也可以,尽管我自己从未尝试过,也无法确认它是否可行。一体式配置不太理想,也不是 Heroku 推荐的配置,但根据 dyno networking documentation 看来您可以私下侦听除 $PORT
之外的任何网络端口。这些 publicly 没有公开,但文档似乎暗示 dyno 中的进程 运行ning 可以通过专用端口进行通信。因此,例如,您可以在 $PORT
上启动 Flask 应用程序,在 $PORT + 1
上启动散景服务器,并让 Flask 在内部将所有散景请求转发到 $PORT + 1
。