【问题标题】:How to run IPython behind an Apache proxy如何在 Apache 代理后面运行 IPython
【发布时间】:2014-07-16 10:09:36
【问题描述】:

我想在 Apache(反向)代理后面运行 IPython 笔记本网络服务器,以便代替 URL

https://my.server:XXXX

(其中 XXXX 是某个端口号)我可以使用

https://my.server/py0

我知道 IPython 使用 websockets,我怀疑这是我的设置中缺少的部分,但我根本找不到关于如何配置它的适当详细描述。不幸的是,IPython webserver setup docs 除了这个之外对代理没有什么好说的:

在代理之后,尤其是当您的系统或浏览器设置为 自动检测代理,笔记本 Web 应用程序可能无法 连接到服务器的 websockets[...]

所以我决定自己尝试一下,并将以下内容放入/etc/apache2/sites-enabled/default-ssl.conf

            SSLProxyEngine On
            SSLProxyVerify none
            SSLProxyCheckPeerCN off
            SSLProxyCheckPeerName off
            ProxyPass       /py0/ https://localhost:10000/
            ProxyPassReverse        /py0/ https://localhost:10000/

通过 URL https://my.server:10000“直接”访问 IPython 就像宣传的那样完美。

URL https://my.server/py0(没有尾部斜杠)返回“404 Not found”。

与尾部斜杠 https://my.server/py0/ 相同,它会“工作”,因为它转发到 https://my.server/login?next=%2F,然后它本身就是“未找到”——显然是因为 /py0/ 部分丢失了。也许我应该告诉 IPython,但是 如何 ??

也许相关的版本号:Ubuntu 14.04 LTS、Apache 2.4.7。

也许相关的 SO 问题:IPython behind nginx。但是,由于我的设置中的所有其他内容都由 Apache 处理,我对此非常满意,因此我不想另外运行 Nginx。

有没有成功在 Apache 后面配置 IPython 笔记本网络服务器的好人?如果是,那么请站出来分享您的知识 :-) 非常感谢!

【问题讨论】:

  • 我要感谢所有提供答案的人。 JupyterHub (github.com/jupyter/jupyterhub) 现在提供了更优雅的解决方案。与 RStudio (rstudio.com) 类似,您可以运行多个用户可以登录并并行工作的网络服务器。如果有兴趣,我可以提供我的 Ubuntu 14.04 的 JupyterHub 安装说明。

标签: apache proxy ipython reverse-proxy


【解决方案1】:

我在运行 Ubuntu 16.04.1 LTS(xenial) 的服务器中使用 apache 版本 2.4.18 最后我让我的 jupyter 笔记本通过 ssl 运行。 我已经在我的服务器上配置了标准 SSL,所以 https:// 工作正常。我还按照以下说明操作:Running a notebook serverjupyter_notebook_config.py 配置文件中获取我的证书文件和密码。我缺少的是:

c.NotebookApp.allow_origin = '*'
c.NotebookApp.base_url = '/SomeName'

使用多个地方的解决方案为我工作的 apache 配置文件和这里的部分答案是:

SSLProxyEngine on
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

<Location "/SomeName">
    ProxyPass        https://localhost:XXXX/SomeName
    ProxyPassReverse https://localhost:XXXX/SomeName
</Location>

<Location "/SomeName/api/kernels">
    ProxyPass        wss://localhost:XXXX/SomeName/api/kernels
    ProxyPassReverse wss://localhost:XXXX/SomeName/api/kernels
</Location>
<Location "/SomeName/terminals/websocket">
    ProxyPass        wss://localhost:XXXX/SomeName/terminals/websocket
    ProxyPassReverse wss://localhost:XXXX/SomeName/terminals/websocket
</Location>

其中 XXXX 是您正在使用的端口,例如8888,并且 SomeName 可以是您想要的任何名称。 我希望这会有所帮助。

【讨论】:

  • 谢谢!我疯了,我想我只是错过了配置文件中的 allow_origin ..
  • 没问题。我刚刚意识到我在所有内容的末尾都有额外的斜线。我刚刚摆脱了它们。
【解决方案2】:

这适用于 jupyter 和密码哈希:

<VirtualHost *:443>
    ServerName  default
    ProxyPreserveHost On
    ProxyRequests off
    SSLProxyEngine on
    SSLEngine on
    SSLProtocol TLSv1
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLCertificateFile      /home/ubuntu/.certs/mycert.pem

    ProxyPass /notebook/terminals/websocket/       wss://localhost:9999/notebook/terminals/websocket/
    ProxyPassReverse /notebook/terminals/websocket/ wss://localhost:9999/notebook/terminals/websocket/

    ProxyPass /notebook/api/kernels/ wss://127.0.0.1:9999/notebook/api/kernels/
    ProxyPassReverse /notebook/api/kernels/ wss://127.0.0.1:9999/notebook/api/kernels/

    ProxyPass /notebook https://127.0.0.1:9999/notebook
    ProxyPassReverse /notebook https://127.0.0.1:9999/notebook
</VirtualHost>

【讨论】:

    【解决方案3】:

    在具有终端的较新版本的 IPython/Jupyter 上,您还需要为终端添加条目。

    <Location /ipython/terminals/websocket/>
         ProxyPass        ws://localhost:8888/ipython/terminals/websocket/
         ProxyPassReverse ws://localhost:8888/ipython/terminals/websocket/
    </Location>
    

    【讨论】:

      【解决方案4】:

      基于 Apache 的 @adam 配置,我在这里放了一个完整的 SSL-aware &lt;VirualHost&gt; 部分,但没有 /ipython 前缀,我还提供了 SSL 选项对于任何有兴趣的人:

      <VirtualHost *:80>
          ServerAdmin myname@my.place.com
          ServerName some.server.com
          SSLEngine off
      
          Redirect permanent / https://some.server.com
      </VirtualHost>
      
      ## From http://stackoverflow.com/questions/23890386/how-to-run-ipython-behind-an-apache-proxy
      #
      <VirtualHost *:443>
          ServerAdmin myname@my.place.com
          ServerName some.server.com
      
          SSLEngine on
      
          SSLCertificateFile              some_server_com.crt
          SSLCertificateKeyFile           some_server_com.key
      
      
          <Location />
              ProxyPass        http://localhost:8888/
              ProxyPassReverse http://localhost:8888/
              ProxyPassReverseCookieDomain localhost some.server.com
              RequestHeader set Origin "http://localhost:8888"
          </Location>
      
          <Location /api/kernels/>
              ProxyPass        ws://localhost:8888/api/kernels/
              ProxyPassReverse ws://localhost:8888/api/kernels/
          </Location>
      
          Redirect permanent / https://some.server.com
      </VirtualHost>
      

      【讨论】:

        【解决方案5】:

        我使用以下设置完成了这项工作。

        IPython

        IPython Notebook 正在收听http://localhost:8888/ipython。需要加上/ipython前缀,因为IPython使用的是绝对路径,所以必须和反向代理路径一样。

        ipython_notebook_config.py

        c = get_config()
        c.NotebookApp.ip = 'localhost'
        c.NotebookApp.open_browser = False
        c.NotebookApp.port = 8888
        c.NotebookApp.base_url = '/ipython'
        

        阿帕奇

        我启用了

        • mod_proxy
        • mod_proxy_http
        • mod_proxy_wstunnel

        在我添加的 apache 配置中

        <Location /ipython>
        ProxyPass        http://localhost:8888/ipython
        ProxyPassReverse http://localhost:8888/ipython
        ProxyPassReverseCookieDomain localhost my.server.com
        RequestHeader set Origin "http://localhost:8888"
        </Location>
        
        <Location /ipython/api/kernels/>
        ProxyPass        ws://localhost:8888/ipython/api/kernels/
        ProxyPassReverse ws://localhost:8888/ipython/api/kernels/
        </Location>
        

        到启用 SSL 的虚拟主机定义。

        RequestHeader set Origin "http://localhost:8888" 是 websocket 所必需的,否则你会得到 403 Forbidden。

        现在可以通过https://my.server.com/ipython 访问IPython(没有尾随/!)。

        【讨论】:

        • 为了使用RequestHeader,您还需要启用mod_headers(sudo a2enmod 标头)
        • RequestHeader set Origin "http://localhost:8888" 为我修复了它!谢谢! (我也使用 CSP,所以我也必须在那里添加/允许wss:。)
        【解决方案6】:

        警告:这相当冗长,因为我猜你已经想到了很多,但出于文档目的,我在这里列出了足够的细节供其他人遵循。

        在各种链接的帮助下,我自己实现了这个答案后,我把这个答案放在了一起。第一个从这里Websocket origin check fails when used with Apache WS proxy #5525。我在这里重复了大部分内容,并进行了一些更改。其他链接参考如下。

        1。设置 iPython:

        这是在帖子中,但我没有按照原始帖子的建议进行操作,而是按照Running a notebook server 的一般说明进行操作。完成此操作后,您应该能够测试设置,这将需要启用您为其配置的端口。如果这不起作用,那么任何 Apache 设置都将不起作用。

        2。配置 Apache:

        1. 确保您拥有并启用了以下模组。

        ./configure --enable-proxy --enable-ssl --enable-deflate --enable-proxy-http --enable-proxy-wstunnel --enable-info --enable-rewrite --enable-headers

        在这里添加了--enable-headers,因为它们没有安装在我的身上。我还使用了 Apache2 a2enmod 命令。所以sudo a2enmod headerssudo a2enmod proxy

        如果您运行的是 2.4 之前的 Apache 版本,则您没有 proxy_wstunnel mod。您可以修补您的版本或升级。要修补您的版本,您可以关注这些instructions。请务必复制mod_proxy.somod_proxy_wstunnel.so。要获取configure 脚本,您需要运行./buildconfig,它有自己的依赖项。这在其中的评论中注明。

        1. 在 Apache 中,创建一个“sites-available/iPython.conf”文件。最初我说要添加到httpd.confports.conf。添加您自己的站点文件更加简洁,并且允许您在需要时启用/禁用配置。

          Listen [ANY PORT HERE] # post has port 8999 here... ... <VirtualHost *:[ANY PORT HERE]> SSLProxyEngine On # post did not have this... ProxyPass / http://127.0.0.1:8888/ ProxyPassReverse / http://127.0.0.1:8888/ # spoof headers to make notepad accept the request as coming from the same origin Header set Origin "http://127.0.0.1:8888/" RequestHeader set Origin "http://127.0.0.1:8888/" LogLevel debug </VirtualHost>

          注意 1:帖子使用端口 8999,但它可以是您想要的任何端口。您需要这里的端口 80,但您不需要指定它,因此,修改上述内容会产生:

          <VirtualHost *:80> ... # Everything is the same here... </VirtualHost>

          注意 2:由于您使用的是 SSL,因此您需要在 VirtualHost 定义的正文中添加 SSLProxyEngine On。如上所述,该帖子没有具体说明。

          注意 3:端口 8888 是 ipython 运行的任何端口。根据您的配置更改此设置。

          注意 4:如果您想托管多个应用程序,并且这是其中之一,而不是拥有 /:8888/,您将需要 /ipython:8888/ipython 或任何您想要的名称.为了支持这一点,请参阅Running with a different URL prefix

        2. 启用新配置: sudo a2ensite iPython

        如果您需要禁用: sudo a2dissite iPython

        1. 重新加载 Apache: sudo service apache2 reload

        我的环境:

        Ubuntu 14.04.1 Apache 2.4.7 ipython 2.3.0

        编辑:更新以反映我为使其正常工作所做的最终更改。我还将指令顺序更改为我认为更有意义的顺序。

        【讨论】:

        • 非常感谢,+1。快速评论:您将 proxy_wstunnel 作为补丁,因为您运行的是 Apache 2.2 。在 Apache 2.4 中,包含了 wstunnel 模块。
        • 不用担心。我添加了关于补丁的说明。谢谢!
        • 更新以反映我的最终更改。
        • 命令“sudo a2ensite iPython”需要是“sudo a2ensite iPython.conf”。至少在我的 Apache 版本中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多