2017-01-19 1 views

ответ

1

ВАРИАНТ 1: Запуск Bokeh в частной подсети и торнадо в публичной подсети.

Вы можете разместить свой сервер Bokeh в частной подсети VPC, см.: http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Subnets.html Это обеспечит получение частного IP-адреса, но не будет общедоступным. Если вашему серверу Bokeh требуется выход WAN, вы можете разместить NAT instance в общедоступной подсети и route external traffic на NAT из вашей частной подсети.

Tornado будет размещен в публичной подсети, что сделает его общедоступным и предоставит ему доступ к Bokeh через частную сеть.

ВАРИАНТ 2: Запуск Bokeh и Tornado на том же экземпляре в частной подсети.

Поместите a Load Balancer в общественную подсеть и используйте балансировщик нагрузки, чтобы выставить Tornado, но не Bokeh. Это будет иметь большой смысл, если вы используете 2 или более AZ для отказоустойчивости, но также достигнете своей цели в одном AZ.

ВАРИАНТ 3: Запуск Bokeh и Tornado на том же экземпляре в публичной подсети.

Используйте ec2 security group, чтобы разрешить входящий доступ к портам Торнадо, но не к портам Боке. Вы все равно сможете получить доступ к Bokeh локально, используя loopback-адрес (localhost: 127.0.0.1).

+0

Привет @Dave, я заглянул в ссылки.Означает ли это, что сервер Bokeh и сервер Tornado придется запускать в двух разных экземплярах? Текущая реализация, которую я пытаюсь запустить, работает на одном экземпляре, но на разных портах. –

+0

@ ansh.gandhi: вы хотите, чтобы служба торнадо была общедоступной? –

+0

Да. В настоящее время и сервер Bokeh, и Tornado являются общедоступными. Я разрешаю Websocket Origin на сервере bokeh, так что Tornado может получить к нему доступ. Но, интересно, возможно ли, чтобы сервер Tornado был публичным, а Bokeh - в частной сети в одном экземпляре и все еще работает? Я просто знаком с AWS. –

0

Я не думаю, что вы можете избежать разоблачения сервера Bokeh. После того как веб-браузер загрузил <script>, сгенерированный сервером autoload_server, он попытается сделать DIRECT-соединение с экземпляром сервера Bokeh на основе URL-адреса в <script>. Это соединение затем формирует WebSocket, который используется для интерактивности Bokeh.

Например:

# Start a Bokeh App for your interactive Graph 
chart_app = Application(FunctionHandler(charts.chart_code)) 
server = Server({"/chart_app": chart_app}, address="localhost" port=5006, allow_websocket_origin=["localhost:80"]) 

# Handle a call to /chart 
@app.route('/chart', methods=['GET']) 
def chart_func(): 
    script = autoload_server(model=None, url='http://localhost:5006/chart_app') 
    return render_template("embed_bootstrap.html", script=script) 

render_template будет генерировать полный веб-страницы HTML, с <div> добавленной для диаграммы боке:

<script 
    src="http://localhost:5006/chart_app/autoload.js?bokeh-autoload-element=5eaa53a8-3336-40b1-8d29-f48457410a18&bokeh-app-path=/chart_app&bokeh-absolute-url=http://localhost:5006/chart_app" 
    id="5eaa53a8-3336-40b1-8d29-f48457410a18" 
    data-bokeh-model-id="" 
    data-bokeh-doc-id="" 
></script> 
    </div> 
</div> 

Ваш браузер теперь будет пытаться подключиться непосредственно к Bokeh Server для извлечения тела <script>, а затем выполнит js в скрипте. Это приведет к обновлению вашего HTTP-соединения с WEBSOCKET и напрямую свяжется с внутренним сервером Bokeh для обеспечения интерактивности.

К сожалению, это не удастся, как размещаемый веб-сервер не будет подвергать сервер Бока на localhost:5006

Что нам нужно, это способ указать два узла настройку/порта для сервера бока, тот, который он использует для создания фактический внутренний сервер Bokeh (обычно на localhost:5006), а другой - для рекламы соединения как фактического реального адреса хоста и порта в его <script>, а также в извлеченном <script> кодексе - таким образом мы можем позволить нашему собственному размещенному HTTP-серверу перенаправлять эти вызовы внутренне, и Браузер только ведет переговоры непосредственно с одним сервером.

Смежные вопросы