我想在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笔记本网络服务器的好灵魂?如果是,那么请前进并分享您的知识:-)非常感谢!
答案 0 :(得分:14)
我使用以下设置进行了此操作。
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的虚拟主机定义。
对于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。我在这里重复了一些变化。其他链接在下面引用。
这是在帖子中,但不是像原始帖子建议的那样,我只是按照Running a notebook server的一般说明进行操作。完成此操作后,您应该能够测试设置,这将需要启用您配置的端口。如果这不起作用,那么任何Apache设置都将无效。
./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 headers
,sudo a2enmod proxy
等
如果您在2.4之前运行的是Apache版本,那么您没有proxy_wstunnel
mod。您可以修补您的版本或升级。要修补您的版本,您可以按照这些instructions进行操作。请务必同时复制mod_proxy.so
和mod_proxy_wstunnel.so
。要获取configure
脚本,您需要运行./buildconfig
,它具有自己的依赖项。这在其中的评论中指出。
在Apache中,创建一个&#34; sites-available / iPython.conf&#34;文件。最初我说要添加到httpd.conf
或ports.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。
启用新配置:
sudo a2ensite iPython
如果您需要停用:
sudo a2dissite iPython
sudo service apache2 reload
我的环境:
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 server在jupyter_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可以是您想要的任何名称。 我希望这可以提供帮助。