【发布时间】:2015-07-30 08:57:16
【问题描述】:
目前我们在 nginx 代理后面运行一个 Ipython 笔记本服务器。这很有效,因为它是一个简单的一对一映射。
现在我们要在 1 个代理后面运行多个笔记本服务器。由于这些服务器是动态添加的,因此代理也应该是动态的。
理想情况下,我想代理 url 子路径:
http://open.net/py1 -> http://secure1:8888
http://open.net/py2 -> http://secure2:8888
http://open.net/py3 -> http://secure3:8888
etc.
这种方法的问题是 Ipython 在它的 html 中不使用相对 url。摘录:
<script src="/static/.../promise.min.js"</script>
<script src="/static/.../require.js"</script>
<script> ...
所以在http://open.net/py2 内部require.js 将通过http://open.net/static/.../require.js 加载,这当然会导致502。它应该是http://open.net/py2/static/.../require.js
问题:解决这个问题的好策略是什么?
约束:
- 我无法触摸源 html
- 我不能为每个 Ipython 服务器使用子域(因为它们是动态添加的)
【问题讨论】:
-
你如何匹配
/py3应该代理到secure3? -
我不知道。也许是一个正则表达式......要明确:现在不是那样,这只是一个假设。我想在子路径上代理,因为替代方案 (AFAIK) 正在动态添加子域,这很乏味 imo。
-
您不需要每次都添加子域。只需添加通配符子域并让 nginx 监听任何子域。
-
我之前与我们的开发人员讨论过这个问题。他们对通配符子域上的正则表达式路由(安全漏洞)有一种不好的感觉。但是,是的,就这样吧。发送!
-
您可以通过在配置中设置
NotebookApp.base_url来更改 IPython 笔记本服务器使用的基本 URL。 Jupyterhub 已经做了与此非常相似的事情 - 将多个独立笔记本用户暴露在单个代理后面。
标签: nginx ipython ipython-notebook reverse-proxy