- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 Flask 应用程序,我在其中嵌入了 Bokeh 服务器图,但我无法让它们同时在 Heroku 上工作。我正在尝试在 Heorku 上部署,我可以从 Procfile 启动 Bokeh 应用程序或 Flask 应用程序,但不能同时启动两者。因此,要么显示 Flask 提供的内容,要么显示 Bokeh 图。
当我在 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 内容。似乎只考虑了第二个 worker 。
那么,我的问题是如何修改 Procfile 以考虑这两个进程?或者也许我一起接近这个错误?您能提供的任何线索将不胜感激。
最佳答案
每个 Heroku dyno 都分配了一个公共(public)网络端口,您可以从 $PORT
中获取。变量,在启动您的应用程序之前由 Heroku 预先分配。不幸的是,您只能在 dyno 中运行一个公共(public) Web 服务器。
我认为您需要做的第一件事是通过您的 Flask 服务器将所有请求路由到您的应用程序。例如,您可以添加 /bokeh/<path:path>
使用 requests 路由到您的 Flask 应用程序,将所有请求转发到 Bokeh 服务器,然后将响应发送回客户端。通过此更改,您现在拥有一个公共(public) Web 服务器,并且 bokeh 服务器可以作为后台服务运行而无需公共(public)访问。
现在您可以将 Flask 应用程序部署到 Heroku,并让它接收自己的请求和对 bokeh 服务器的请求。下一步是找出部署 Bokeh 服务器的位置。
执行此操作的正确方法是在单独的测功机上部署 Bokeh 。 Flask dyno 将知道如何将请求转发到 bokeh,因为您将拥有一个带有 bokeh 服务器 URL 的配置项。
如果您想将所有内容都托管在一个测功机上,我认为您也可以,尽管我自己从未尝试过,也无法确认它是否可行。一体式配置不太理想,不是 Heroku 推荐的配置,但根据 dyno networking documentation看来您可以私下监听除$PORT
之外的任何网络端口.这些没有公开,但文档似乎暗示在 dyno 中运行的进程可以通过私有(private)端口进行通信。例如,您可以在 $PORT
上启动 Flask 应用程序,以及 $PORT + 1
上的 Bokeh 服务器,并让 Flask 在内部将所有 Bokeh 请求转发到 $PORT + 1
.
关于python - 如何在 Procfile 中运行两个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39641568/
我是一名优秀的程序员,十分优秀!