如何在Apache代理后运行IPython

如何在Apache代理后运行IPython,apache,proxy,ipython,reverse-proxy,Apache,Proxy,Ipython,Reverse Proxy,我想在Apache(反向)代理之后运行一个IPython笔记本web服务器,以便 https://my.server:XXXX (其中XXXX是一些端口号)我可以使用 https://my.server/py0 我知道IPython使用websockets,我怀疑这是我的设置中缺少的部分,但我无法找到关于如何配置它的适当详细说明。不幸的是,除此之外,对于代理没有什么可说的: 在代理之后,尤其是当系统或浏览器设置为 自动检测代理,笔记本电脑web应用程序可能无法 连接到服务器的WebSocket[

我想在Apache(反向)代理之后运行一个IPython笔记本web服务器,以便

https://my.server:XXXX

(其中XXXX是一些端口号)我可以使用

https://my.server/py0

我知道IPython使用websockets,我怀疑这是我的设置中缺少的部分,但我无法找到关于如何配置它的适当详细说明。不幸的是,除此之外,对于代理没有什么可说的:

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

因此,我决定自己尝试一下,并将以下内容放入
/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“直接”访问IPython
https://my.server:10000
与广告宣传的一样完美

URL
https://my.server/py0
(不带尾随斜杠)返回“404未找到”

尾随斜杠
https://my.server/py0/
转发到
https://my.server/login?next=%2F
,它本身就“找不到”——显然是因为/py0/部分丢失了。也许我应该告诉IPython,但是怎么做

也许相关的版本号是:Ubuntu14.04LTS,Apache2.4.7

或许相关的问题是:。但是,由于我的设置中的所有其他内容都由Apache处理,我完全满意,因此我不想另外运行Nginx


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

警告:这相当冗长,因为我想您已经了解了其中的大部分内容,但出于文档目的,我在这里列出了足够的细节,供其他人参考

在各个环节的帮助下,我自己实现了这一点,然后把这个答案放在了一起。第一个从这里开始。我在这里重复了很多内容,并做了一些修改。其他链接参考如下

1.设置iPython: 这是在帖子里,但我并没有按照原帖子的建议去做,而是按照一般的说明去做。完成此操作后,您应该能够测试设置,这将需要启用为此配置的端口。如果这不起作用,那么任何Apache设置都将不起作用

2.配置Apache:
  • 确保以下MOD可用并已启用
  • /configure--enable proxy--enable ssl--enable deflate--enable proxy http--enable proxy wstunnel--enable info--enable rewrite--enable headers

    在此处添加了
    --启用标题
    ,因为它们未安装在我的设备上。我还使用了apache2a2enmod命令。所以
    sudoa2enmod头文件
    sudoa2enmod代理文件
    ,等等

    如果您运行的是Apache 2.4之前的版本,那么您没有
    proxy\u wstunnel
    mod。您可以修补您的版本或升级。要修补您的版本,您可以按照以下步骤操作。一定要复制
    mod_proxy.so
    mod_proxy\u wstunnel.so
    。要获取
    configure
    脚本,您需要运行
    /buildconfig
    ,它有自己的依赖项。其中的一条评论指出了这一点

  • 在Apache中,创建一个“sites available/iPython.conf”文件。最初我说要么添加到
    httpd.conf
    或者
    ports.conf
    。添加您自己的站点文件更干净,并且允许您在需要时启用/禁用配置

    Listen[这里的任何端口]#post在这里有端口8999。。。
    ...
    post上的SSLProxyEngine没有这个。。。
    ProxyPass/http://127.0.0.1:8888/
    ProxyPassReverse/http://127.0.0.1:8888/
    #伪造标题,使记事本接受来自同一来源的请求
    标题集原点“http://127.0.0.1:8888/"
    RequestHeader集合原点“http://127.0.0.1:8888/"
    日志级调试
    

    注1:post使用端口8999,但它可以是您想要的任何端口。此处需要端口80,但不需要指定它,因此,修改上述端口将产生:

    
    ...       # 这里的一切都是一样的。。。
    

    注意2:由于您使用的是SSL,因此需要在
    VirtualHost
    定义的主体中添加
    SSLProxyEngine On
    。如上所述,该员额没有明确规定这一点

    注3:端口8888是运行ipython的端口。根据您的配置进行更改

    注4:如果您希望托管多个应用程序,而这是其中之一,而不是使用
    /
    :8888/
    ,则需要
    /ipython
    :8888/ipython
    或任何您希望命名的名称。要支持这一点,请参阅

  • 启用新配置:
    sudo a2ensite iPython

  • 如果需要禁用:
    sudo a2dispate iPython

  • 重新加载Apache:
    sudo服务apache2重新加载
  • 我的环境:

    Ubuntu 14.04.1
    Apache 2.4.7
    ipython 2.3.0


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

    我通过以下设置实现了这一点

    伊皮顿 IPython笔记本正在收听
    http://localhost:8888/ipython
    。有必要添加
    /ipython
    前缀,因为ipython使用绝对路径,因此它必须与反向代理路径相同

    ipython\u notebook\u config.py

    c=get_config()
    c、 NotebookApp.ip='localhost'
    c、 NotebookApp.open\u browser=False
    c、 NotebookApp.port=8888
    c、 NotebookApp.base_url='/ipython'
    
    阿帕奇 我启用

    • mod_代理
    • mod\u proxy\u ht
      
      <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>
      
      <Location /ipython/terminals/websocket/>
           ProxyPass        ws://localhost:8888/ipython/terminals/websocket/
           ProxyPassReverse ws://localhost:8888/ipython/terminals/websocket/
      </Location>
      
      <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>
      
      c.NotebookApp.allow_origin = '*'
      c.NotebookApp.base_url = '/SomeName'
      
      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>