この記事では、Nginxリバースプロキシの背後でJupyterを構成する方法について説明します。このような構成は、多くの人にとってあまり明白ではないためです。 GitHubには多くの問題と要点があり、この問題に対して適切なソリューションを選択することは困難です。また、その方法を説明するさまざまな記事が見つかる場合がありますが、それらのほとんどは古く、CORS構成を十分にカバーしていません。
トピックはまだ流行しているので、記事を更新して構成を簡素化することにしました。
以下のコメントに感謝します。AndrewBarker 。記事の更新されたバージョンをキャッチします。
記事のこのセクションでは、通常のDocker環境でJupyterまたはJupyterHubを起動する必要がある場合について説明します。
JupyterHub構成
まず、すべての構成ファイルを配置するフォルダーを作成しましょう。
最終的な構造は次のとおりです。
mkdir docker
tree docker
docker
├── docker-compose.yaml
├── jupyter_notebook_config.py
└── nginx.conf
すべてを単純化するために、docker-compose.yaml
を作成しました 、当社のサービスについて説明しています:
version: "3.7"
services:
nginx:
image: nginx:alpine
volumes:
- "./nginx.conf:/etc/nginx/nginx.conf:ro"
ports:
- 8080:8080
links:
- "jupyterhub"
jupyterhub:
image: jupyterhub/jupyterhub
container_name: jupyterhub
volumes:
- "./jupyter_notebook_config.py:/root/.jupyter/jupyter_notebook_config.py:ro"
構成は簡単です–Jupyterhubの前にあるシンプルな小さなNginxDockerコンテナー。
どちらも最新バージョンからリリースされました。
Nginx構成
Nginxはポート8080に座っています ポート8080でリッスンします 同様に。
非常に重要: nginx.conf
リバースプロキシ構成が含まれています。
Nginxが80以外のポートにある場合 または443 、次の構成ディレクティブを使用する必要があります:
-
proxy_set_header Host $host:$server_port;
デフォルトのポートにあるNginxの場合は、default
を使用します 構成:
-
proxy_set_header Host $host;
ここで間違えると、Blocking Cross Origin API request for /api/contents
の受信を開始します。 エラーメッセージ。
繰り返しますが、これらのメッセージの主な理由は、Nginxコンテナのサービスバインディングとエクスポートのポートが等しいことではありません。
これが私のnginx.conf
です ポート8080
でリッスンする場合 :
worker_processes 1;
events { worker_connections 1024; }
http {
sendfile on;
upstream ml {
server jupyterhub:8000;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 8080;
location / {
proxy_pass http://ml;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# websocket headers
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}
Jupyter構成
JupyterHub構成の場合、/root/.jupyter/jupyter_notebook_config.py
に配置された次の構成を使用します :
# get the config object
c = get_config()
# JupyterHub listen address
c.JupyterHub.hub_ip = '0.0.0.0'
# JupyterHub connect hostname.
# In our case it's 'jupyterhub' by the name of the service from docker-compose.yaml
c.JupyterHub.hub_connect_ip = 'jupyterhub'
# Location for users notebooks
c.Spawner.notebook_dir = '~/'
Nginxプロキシの背後でJupyrterを起動する
新しいコンテナを作成したり、ユーザー認証設定を試したりする時間があまりありませんでした。主な目的は、クロスオリジンAPIリクエストをブロックするためのソリューションを提供することです / api / contents 問題。
したがって、この構成を起動する方法は次のとおりです。
docker-compose up -d
起動したばかりのコンテナに接続してユーザーを作成し、ノートブックをインストールします パッケージ:
docker exec -it jupyterhub /bin/bash
adduser
pip install notebook
これで、JupterHubに接続し、作成したユーザー名とパスワードをログイン資格情報として使用できます。
記事のこのセクションでは、DockerSwarmモードでJupyterまたはJupyterHubを起動する必要がある場合について説明します。
プロジェクトフォルダを少し変更してみましょう:
.
├── .env
├── docker-compose.yaml
├── jupyterhub
│ ├── Dockerfile
│ ├── jupyterhub_config.py
└── nginx
└── nginx.conf
3 directories, 5 files
Docker構成(群れ)
docker-compose.yaml
の方法は次のとおりです ファイルは次のようになります:
version: "3.7"
services:
# Configuration for reverse proxy
nginx:
image: nginx:alpine
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
ports:
- 8080:8080
networks:
default:
jupyterhub_network:
aliases:
- nginx
# Configuration for Hub+Proxy
jupyterhub:
env_file: .env
build: jupyterhub
image: jupyterhub_customized
hostname: jupyterhub
volumes:
- "./jupyterhub/jupyterhub_config.py:/srv/jupyterhub/jupyterhub_config.py:ro"
- "/var/run/docker.sock:/var/run/docker.sock"
ports:
- 8000:8000
networks:
default:
jupyterhub_network:
aliases:
- jupyterhub
environment:
# Name of the Docker image for the single-user servers
DOCKER_JUPYTER_IMAGE: ${DOCKER_JUPYTER_IMAGE}
# The name of the Docker network used by the services
DOCKER_NETWORK_NAME: ${COMPOSE_PROJECT_NAME}_jupyterhub_network
# The IP address of the Hub service within the docker network
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
# Configuration for the single-user servers
jupyterlab:
image: ${DOCKER_JUPYTER_IMAGE}
command: echo
networks:
jupyterhub_network:
driver: overlay
volumes:
jupyterhub_data:
Docker-compose環境変数は、.env
で定義されています。 ファイル:
# Name of our Docker Compose project
COMPOSE_PROJECT_NAME="jupyterhub"
DOCKER_JUPYTER_IMAGE="jupyterhub/singleuser:2.2"
JupyterHub構成(群れ)
独自のJupyterHubのカスタムイメージを作成して、dockerspawner、dummyauthenticator、およびその他の必要なモジュールを自動的に含める必要があります(たとえば、さまざまな認証方法をサポートするため)。
# Do not forget to pin down the version
FROM jupyterhub/jupyterhub
# Install dependencies (for advanced authentication and spawning)
RUN pip install \
dockerspawner \
jupyterhub-dummyauthenticator
また、JupyterHubの正しい構成を提供する必要があります:
import os
NETWORK_NAME = os.environ['DOCKER_NETWORK_NAME']
DOCKER_JUPYTER_IMAGE = os.environ['DOCKER_JUPYTER_IMAGE']
# get the config object
c = get_config()
c.ConfigurableHTTPProxy.should_start = True
c.JupyterHub.authenticator_class = 'dummyauthenticator.DummyAuthenticator'
c.JupyterHub.hub_ip = '0.0.0.0'
c.JupyterHub.hub_connect_ip = 'jupyterhub'
c.JupyterHub.spawner_class = 'dockerspawner.SwarmSpawner'
c.JupyterHub.tornado_settings = {'slow_spawn_timeout': 30}
c.SwarmSpawner.image = DOCKER_JUPYTER_IMAGE
c.SwarmSpawner.network_name = NETWORK_NAME
c.SwarmSpawner.remove_containers = True
c.Spawner.cmd = ["jupyter", "labhub"]
c.Spawner.args = ['--allow-root']
c.Spawner.notebook_dir = '~/'
c.Spawner.debug = True
c.SwarmSpawner.debug = True
c.SwarmSpawner.host_ip = '0.0.0.0'
c.SwarmSpawner.http_timeout = 300
c.SwarmSpawner.start_timeout = 300
#c.JupyterHub.log_level = 00
#c.ConfigurableHTTPProxy.debug = True
詳細については、次のリンクを確認することを強くお勧めします。
- SwarmSpawnerの使用(公式例)
- SwarmSpawnerの公式ドキュメント(JupyterHub)
- Dockerを使用したコンテナ化されたJupyterHubサーバーのデプロイ(記事)
- swarmSpawnerを使用してDockerSwarm環境でJupyterHubを実行する方法(記事)
Nginx構成(スウォーム)
Nginxの構成は変更されませんが、例を完全にするためにここに配置しましょう:
worker_processes 1;
events { worker_connections 1024; }
http {
sendfile on;
upstream ml {
server jupyterhub:8000;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 8080;
location / {
proxy_pass http://ml;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# websocket headers
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}
提供されたデモを起動するには、次のコマンドを実行します。
docker-compose build
docker-compose up
サービスが開始したらすぐに、サーバーの外部IPアドレスをポート8080に接続します。
次のコンソール出力が表示されます。
ブラウザに次のページが表示されます:
任意のユーザー名を使用し、パスワードは指定しないでください。 サインインをクリックします ボタンをクリックすると、ユーザーラボ環境にリダイレクトされます:
この小さなメモが時間を節約するのに役立つことを願っています。役に立ったと思ったら、世界に広めるのを手伝ってください!
しばらくお待ちください!