首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS ELB终端问题背后的Jupyter笔记本

问AWS ELB终端问题背后的Jupyter笔记本
EN

Stack Overflow用户
提问于 2016-03-31 20:13:30
回答 2查看 1.4K关注 0票数 3

我在自己创建的docker镜像上运行Jupyter notebook。它在AWS ELB (有自己的域名系统)后面的反向代理(oauth2_proxy)后面运行。

除了Jupyter终端之外,现在一切都运行得很好。

当我将实例IP直接连接到Jupyter端口时,它可以正常工作。

当我试图通过ELB和反向代理联系它时,它失败了。

我在浏览器控制台上看到的消息是:

代码语言:javascript
复制
WebSocket connection to 'wss://mydomainname.domain.com/terminals/websocket/1' failed: Error during WebSocket handshake: Unexpected response code: 400

我的AWS ELB配置为接受443上的SSL连接,并重定向至TCP 8889 (运行反向代理的位置)。然后反向代理将其从8889路由到运行Jupyter的8888。

在jupyter配置方面,我已经尝试添加了以下两个配置:

代码语言:javascript
复制
c.NotebookApp.trust_xheaders = True
c.NotebookApp.allow_origin = "*"

但这并没有解决问题。

对如何解决这个问题有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-07-28 17:26:33

我遇到了完全相同的问题。我终于设法解决了我的问题,希望这能对我有所帮助。在我的例子中,我不使用docker。相反,我直接在shell中启动jupyter实验室,并使用apache2和proxy pass将https://mydomain:8889/jupyter重定向到https://mydomain/jupyter。浏览器控制台显示,除了jupyter终端之外,其他一切都工作正常。

代码语言:javascript
复制
WebSocket connection to 'wss://mydomain/jupyter/terminals/websocket/1' failed: Error during WebSocket handshake: Unexpected response code: 400

jupyter实验室显示

代码语言:javascript
复制
[W 23:12:10.963 LabApp] 400 GET /jupyter/terminals/websocket/1 (2001:250:fe01:1406:605:605:605:726f) 1.22ms referer=None

下面的apache2配置最终解决了我的问题:

代码语言:javascript
复制
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule .* ws://localhost:8889%{REQUEST_URI} [P]
<Location /jupyter>
    ProxyPass http://localhost:8889/jupyter
    ProxyPassReverse http://localahost:8889/jupyter
</Location>
<LocationMatch "/jupyter/(api/kernels/[^/]+/channels|terminals/websocket)/?">
    ProxyPass ws://localhost:8889/jupyter/$1
    ProxyPassReverse ws://localhost:8889/jupyter/$1
</LocationMatch>

Jupyter终端使用与jupyter内核不同的websocket,因此需要LoactionMatch来绕过所有的websocket,包括jupyter内核、终端和其他一些重要的websocket。注意wss也可以在这里工作,因为proxypass可以绕过ws或者wss,不管你的网站是https还是http。

此外,RewriteCond也很重要。如果省略它,当您打开jupyter终端时,浏览器控制台将得到“200GET”响应。我不完全理解这部分,我在https://serverfault.com/questions/837104/apache-2-4-7-mod-proxy-wstunnel-tunneling-too-much-http-as-well-as-ws中找到的

似乎重写引擎负责不同类型的代理头“升级”和“连接”。如果有人能解释为什么需要这个重写引擎,我会很高兴的。

(顺便说一句,如果你使用的是Nginx而不是apache2,配置也在上面的链接中)

票数 2
EN

Stack Overflow用户

发布于 2016-04-02 20:53:19

我通过更改oauth2_proxy websocket实现修复了这个问题。

在使用grahamrhay's solution (#145)时,我遇到了ipython终端(terminado)的websockets问题。在恢复它并添加soellman's implementation (#201)后,它开始工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36333167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档