在一台计算机上运行Bokeh服务器,为另一台计算机提供服务

4

可能是一个简单的问题。我是新手。

我有一台本地计算机(计算机“A”)和一台远程计算机(计算机“B”)。

我想在B上运行bokeh服务器,并在我浏览到localhost:8000时在A的浏览器中显示结果。

首先,我在B上创建了这个文件。它只有一个带滑块的简单图表。您可以滑动滑块,图表会改变。当我在A上运行它时,它可以工作。

import sys
import numpy as np
from tornado.ioloop import IOLoop

from bokeh.application.handlers import FunctionHandler
from bokeh.application import Application
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, Slider
from bokeh.plotting import figure
from bokeh.server.server import Server

def modify_doc(doc):

    # Initialize the data
    power = 1
    x = np.arange(10)
    y = x**power

    # Initialize the plot and slider
    p = figure()
    p_source = ColumnDataSource(data=dict(x=x, y=y))
    p.line('x', 'y', source=p_source)
    s = Slider(start=0, end=10, value=1, step=.1, title="multiplier")

    # When the slider is changed, redraw the plot
    def callback(attr, old, new):
        x = p_source.data['x']
        y = x**s.value
        p_source.data = dict(x=x, y=y)
    s.on_change('value', callback)

    doc.add_root(column([p, s]))


def main(_):
    io_loop = IOLoop.current()
    bokeh_app = Application(FunctionHandler(modify_doc))
    server_kwargs = {}
    server_kwargs['port'] = 8000
    server = Server({'/': bokeh_app}, io_loop=io_loop, **server_kwargs)

    server.start()

    io_loop.add_callback(server.show, "/")
    io_loop.start()


if __name__ == '__main__':
    main(sys.argv[1:])

所以我将这个文件复制到B上,并通过ssh登录B,在终端输入以下命令来运行它:
python barebones.py

接着我在 A 上输入:

ssh root@123.123.123.123 -N -D 7000

请注意,我输入了7000而不是8000。我尝试过两种方法;我不明白为什么有些我在网上读到的东西告诉我要在这里使用不同的数字。
接下来,我打开Firefox > 首选项 > 网络代理 > 设置 > 手动代理配置。我将SOCKS主机设置为“localhost”(不带引号),端口为7000,并选择SOCKSv5。单击确定。在Firefox的地址栏中,浏览到http://localhost:8000。(请注意,我在那里说了8000而不是7000。同样,不确定是否正确,但我尝试过各种变化。)它显示“无法连接”。
我尝试将此插入脚本中,但似乎没有任何效果。也许我完全错了:
from bokeh.server.util import create_hosts_whitelist
allow_websocket_origin = ['0.0.0.0:8000']
port=8000
create_hosts_whitelist(allow_websocket_origin, port)

我知道还有一种通过命令行使用“bokeh serve…”命令运行bokeh服务器的方法,但是如果可能的话,我想创建一个独立的脚本。

唉,这应该很简单。我错过了什么?

4个回答

2

您尝试过以下方法吗?

B上执行:

bokeh serve filename.py --address 0.0.0.0

您可以使用URL http://Bs_name_or_ip_address:5006/ 从另一台计算机访问该应用程序。如果B计算机上运行有防火墙,则必须允许端口上的传入流量。

要覆盖默认端口号(5006),请使用--port NNNN 参数。

另请参见:

https://docs.bokeh.org/en/latest/docs/reference/command/subcommands/serve.html


2

以下命令适用于bokeh 1+版本

最初的回答:

bokeh serve --show filename.py --allow-websocket-origin=*:5006

1

我知道这个问题很老了,但我遇到了类似的问题,并成功地使用在这里发布的建议解决了它:https://groups.google.com/a/continuum.io/forum/#!topic/bokeh/CmweAdzkWXw

也许这会对其他人有所帮助:

在运行Bokeh的节点上:

bokeh serve &
ssh -NfR 5006:localhost:5006 user@gateway

在本地机器上(例如,笔记本电脑):
ssh -NfL localhost:5006:localhost:5006 user@gateway

现在,您应该能够导航到 http://localhost:5006 来访问在网关后面运行的 Bokeh。

0

除了以上的回答,有时候bokeh会说:

拒绝来自Origin http://<bokeh_server_ip_address>:8000的websocket连接;请使用--allow-websocket-origin=:8000或设置BOKEH_ALLOW_WS_ORIGIN=:8000以允许此操作;当前我们只允许{'localhost:8000'}这个origin。

bokeh serve --show file_name --address 0.0.0.0 --port=8000 --allow-websocket-origin=<bokeh_server_ip_address>:8000

bokeh_server_ip_address是远程服务器IP地址,您可以在其中托管bokeh应用程序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接