如何在Apache代理后面运行IPython

时间:2014-05-27 13:10:22

标签: apache proxy ipython reverse-proxy

我想在Apache(反向)代理后面运行一个IPython笔记本Web服务器,而不是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/

通过网址https://my.server:10000“直接”访问IPython,与宣传的完全一样。

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

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

可能相关的版本号:Ubuntu 14.04 LTS,Apache 2.4.7。

也许是相关的问题:IPython behind nginx。但是,由于我的设置中的其他所有内容都由Apache处理完全满意,我不想再运行Nginx。

在Apache之后是否有成功配置IPython笔记本网络服务器的好灵魂?如果是,那么请前进并分享您的知识:-)非常感谢!

6 个答案:

答案 0 :(得分:14)

我使用以下设置进行了此操作。

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'

的Apache

我已启用

  • 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的虚拟主机定义。

对于websockets,RequestHeader set Origin "http://localhost:8888"是必需的,否则你会获得403 Forbidden。

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

答案 1 :(得分:7)

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

在各种链接的帮助下,我自己实现了这个答案。第一个来自Websocket origin check fails when used with Apache WS proxy #5525。我在这里重复了一些变化。其他链接在下面引用。

1。设置iPython:

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

2。配置Apache:

  1. 确保您已启用并启用以下模式。
  2. ./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中,创建一个&#34; sites-available / iPython.conf&#34;文件。最初我说要添加到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,因此需要在SSLProxyEngine On定义的正文中添加VirtualHost。如上所述,这篇文章没有具体说明。

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

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

    2. 启用新配置: sudo a2ensite iPython

    3. 如果您需要停用: sudo a2dissite iPython

      1. 重新加载Apache: sudo service apache2 reload
      2. 我的环境:

        Ubuntu 14.04.1 Apache 2.4.7 ipython 2.3.0

        编辑:已更新,以反映我为实现此目的所做的最终更改。我还将指令顺序更改为我认为更有意义的内容。

答案 2 :(得分:2)

这适用于jupyter和密码哈希:

public class DealSmashApplication extends Application
{
    private Tracker mTracker;
    public PollManager pollManager;

    @Override
    public void onCreate()
    {
        super.onCreate();
        Bugfender.init(this, "Eu6Djgg8dakcYwjBQKIlmYL9A3Xxo7AK", BuildConfig.DEBUG);
//        Taplytics.startTaplytics(this, "ce36925556402e12404b38586de9cb5fb7d4e5ec");
        Fabric.with(this, new Crashlytics());
        LoginManager.initInstance(this);
        pollManager = PollManager.initInstance(this);
        ContentManager.initInstance(this);
        BeaconManager.initInstance(this);
    }

    @Override
    protected void attachBaseContext(Context base)
    {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    @Override
    public void onTerminate()
    {
        AlertsAndLogs.log("Application", "onTerminate");
        super.onTerminate();
        pollManager.stopPolling();
    }

    /**
     * Gets the default {@link Tracker} for this {@link Application}.
     *
     * @return tracker
     */
    synchronized public Tracker getDefaultTracker()
    {
        if (mTracker == null)
        {
            GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
            // To enable debug logging use: adb shell setprop log.tag.GAv4 DEBUG
            mTracker = analytics.newTracker(R.xml.global_tracker);
        }
        return mTracker;
    }
}

答案 3 :(得分:1)

基于Apache的@adam配置,我在这里放置了一个完整的 SSL-aware <VirualHost>部分,但没有/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>

答案 4 :(得分:1)

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

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

答案 5 :(得分: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可以是您想要的任何名称。 我希望这可以提供帮助。