You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

远程Bokeh Server跨机器访问失败问题求助

解决远程Bokeh Server访问问题的分步方案

我来帮你捋清楚问题出在哪,以及怎么用独立脚本实现需求:

核心问题分析

你当前的配置有三个关键问题:

  1. Bokeh Server默认只绑定localhost,远程机器B上的服务无法接收外部(通过SSH转发过来的)请求
  2. 你添加的白名单代码没有正确生效,Websocket Origin验证失败
  3. SOCKS代理的方式不如直接的SSH端口转发稳定,容易出现连接问题

第一步:修改B上的独立脚本

调整脚本里的Server配置,解决绑定地址和Websocket验证问题:

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):
    # 你的绘图逻辑保持不变
    power = 1
    x = np.arange(10)
    y = x**power

    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")

    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
    # 关键修改1:让服务绑定到所有网卡,允许外部连接
    server_kwargs['address'] = '0.0.0.0'
    # 关键修改2:正确配置允许的Websocket Origin,包含A浏览器访问的地址
    server_kwargs['allow_websocket_origin'] = ['localhost:8000', '123.123.123.123:8000']
    
    server = Server({'/': bokeh_app}, io_loop=io_loop, **server_kwargs)
    server.start()
    # 注释掉这行:远程机器没有图形界面,调用server.show会报错
    # io_loop.add_callback(server.show, "/")
    io_loop.start()

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

修改说明:

  • address='0.0.0.0':让Bokeh Server监听所有可用网卡,而不是只监听B的本地回环地址
  • allow_websocket_origin:明确指定允许的请求来源,这里包含A浏览器访问的localhost:8000和B的公网地址,确保Websocket交互能通过验证
  • 注释server.show("/"):远程服务器通常没有桌面环境,这行代码会触发错误

第二步:用SSH本地端口转发替代SOCKS代理

在A的终端执行以下命令,直接把A的8000端口转发到B的8000端口:

ssh -L 8000:localhost:8000 root@123.123.123.123 -N
  • -L 8000:localhost:8000:将A的localhost:8000请求,转发到B的localhost:8000
  • -N:只做端口转发,不执行远程命令,保持连接稳定

第三步:启动服务并访问

  1. 在B的终端执行:python barebones.py启动Bokeh Server
  2. 在A的浏览器直接访问http://localhost:8000,就能看到B上运行的交互式可视化了

额外注意事项

  • 如果B的8000端口被占用,可修改脚本里的port参数(比如改成8001),同时把SSH转发命令改成-L 8001:localhost:8001
  • 确保B的防火墙允许22端口(SSH默认端口)的入站请求,端口转发是通过SSH通道实现的,不需要开放8000端口给公网

内容的提问来源于stack exchange,提问作者dnh37

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:39:26