[2017/5/17 追記] Pythonが動かない模様。ブラウザからはWebSocket接続に問題があるように見えますが…要調査。
Dockerなどで動かしているJupyter Notebookをリバースプロキシで/以外にマウントする方法。
まずはJupyterの設定変更。Docker運用でない方は直接jupyter_notebook_config.pyを編集してJupyterを再起動してください。
- docker ps -aでJupyterコンテナIDもしくはNAMEを調べる
- シェルに入る
- jupyter_notebook_config.py(/home/jovyan/.jupyter/jupyter_notebook_config.py)の設定に以下を追加。'jupyter'はリバースプロキシでマウントしたいパスと一致するように適当に変更。
- シェルを抜ける
- Jupyterの再起動
docker exec -it コンテナIDまたはNAME /bin/bash
c.NotebookApp.base_url = '/jupyter/'
docker restart コンテナIDまたはNAME
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="jupyter/(.*)" /> <conditions> <add input="{CACHE_URL}" pattern="^(https?)://" /> </conditions> <action type="Rewrite" url="{C:1}://localhost:8888/{R:1}" /> </rule> </rules> <outboundRules> <preConditions> <preCondition name="ResponseIsHtml1"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" /> </preCondition> </preConditions> <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1"> <match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^http(s)?://localhost:8888/(.*)" /> <action type="Rewrite" value="http{R:1}://Webサーバアドレス/{R:2}" /> </rule> </outboundRules> </rewrite> </system.webServer> <system.web> <identity impersonate="false" /> </system.web> </configuration>
Jupyter・リバースプロキシで検索するとWebサーバの/にマウントする例がよくありました。私は/以外にマウントしたかったのですが、jupyter_notebook_config.py書き換え無しにIISのURL Rewriteだけで行おうとすると以下の点でハマりました。
- '/foo/bar'のようにサーバ名を含まないURL表記も'/jupyter/foo/bar'と書き換えないといけないのですが、JavaScript内も変更するためfilterByTags="None"、つまりHTML全文を置換対象する必要があり、余計な部分にマッチしない正規表現にしないといけない。ルールが複雑になると、後のJupyter側の変更で不具合起こす可能性あり。
- CSS内の'/foo/bar'も'/jupyter/foo/bar'に書き換えないといけない。
- JupyterのログインフォームでNext=%2F(Next=/)という部分がありログイン成功後に進むページが指定されるのですが、ここを
- 書き換えないとWebサーバー側の/に飛んでしまう
- Next=%2Fjupyterなどと書き換えるとJupyterにとっては知らないパス/jupyterに飛べと指定されるのでエラーになる
私は3つ目の理由でURL Rewrite単独での解決は断念しました。
[参考]
Comments