Tento článek popisuje, jak nakonfigurovat Jupyter za reverzní proxy Nginx, protože taková konfigurace není pro mnoho lidí příliš zřejmá. Na GitHubu je mnoho problémů a podstat a je těžké vybrat správné řešení tohoto problému. Také můžete najít mnoho různých článků popisujících, jak to udělat, ale většina z nich je zastaralá a nepokrývá dobře konfiguraci CORS.
Jelikož je téma stále trendy, rozhodl jsem se článek obnovit a zjednodušit konfiguraci.
Děkujeme za vaše komentáře níže, Andrew Barker . Podívejte se na aktualizovanou verzi článku.
Konfigurace dockeru
V této části článku se budeme zabývat případem, kdy možná budete muset spustit Jupyter nebo JupyterHub v běžném prostředí Docker.
Konfigurace JupyterHub
Nejprve si vytvořte složku, do které vložíme všechny naše konfigurační soubory.
Zde je naše konečná struktura:
mkdir docker
tree docker
docker
├── docker-compose.yaml
├── jupyter_notebook_config.py
└── nginx.conf
Docker Compose
Abych vše zjednodušil, vytvořil jsem docker-compose.yaml
, který popisuje naše služby:
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"
Konfigurace je přímočará – jednoduchý malý kontejner Nginx Docker před Jupyterhub.
Oba byly spuštěny ze svých nejnovějších verzí.
Konfigurace Nginx
Nginx sedí na portu 8080 a poslech na portu 8080 také.
VELMI DŮLEŽITÉ: nginx.conf
obsahuje konfiguraci reverzního proxy.
Pokud váš Nginx sedí na jiném portu než 80 nebo 443 , musíte použít následující konfigurační direktivu:
proxy_set_header Host $host:$server_port;
Pro Nginx, který je umístěn na výchozích portech, použijte default
konfigurace:
proxy_set_header Host $host;
Pokud zde uděláte chybu, začnete dostávat Blocking Cross Origin API request for /api/contents
chybové zprávy.
Opět platí, že hlavním důvodem těchto zpráv nejsou stejné porty pro vazbu služby a export pro kontejnery Nginx.
Zde je můj nginx.conf
pro poslech na portu 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;
}
}
}
Konfigurace Jupyter
Pro konfiguraci JupyterHub použijeme následující konfiguraci umístěnou v /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 = '~/'
Spouštění Jupyrteru za Nginx Proxy
Neměl jsem moc času postavit nový kontejner a/nebo si hrát s nastavením ověřování uživatelů. Hlavním účelem je poskytnout řešení pro Blocking Cross-Origin API request for /api/contents problémy.
Zde je návod, jak můžete tuto konfiguraci spustit:
docker-compose up -d
Připojte se k právě spuštěným kontejnerům, vytvořte uživatele a nainstalujte notebook balíček:
docker exec -it jupyterhub /bin/bash
adduser
pip install notebook
Nyní se můžete připojit k JupterHub a použít vytvořené uživatelské jméno a heslo jako přihlašovací údaje.
Konfigurace Docker Swarm
V této části článku se budeme zabývat případem, kdy možná budete muset spustit Jupyter nebo JupyterHub v režimu Docker Swarm.
Pojďme trochu upravit naši složku projektu:
.
├── .env
├── docker-compose.yaml
├── jupyterhub
│ ├── Dockerfile
│ ├── jupyterhub_config.py
└── nginx
└── nginx.conf
3 directories, 5 files
Docker Compose (Swarm)
Zde je návod, jak funguje náš docker-compose.yaml
soubor bude vypadat takto:
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:
Proměnné prostředí Docker-compose jsou definovány v .env
soubor:
# Name of our Docker Compose project
COMPOSE_PROJECT_NAME="jupyterhub"
DOCKER_JUPYTER_IMAGE="jupyterhub/singleuser:2.2"
Konfigurace JupyterHub (swarm)
Potřebujeme vytvořit vlastní image JupyterHub, aby automaticky zahrnoval dockerspawner, dummyauthenticator a další moduly, které byste mohli potřebovat (například pro podporu různých metod ověřování).
# Do not forget to pin down the version
FROM jupyterhub/jupyterhub
# Install dependencies (for advanced authentication and spawning)
RUN pip install \
dockerspawner \
jupyterhub-dummyauthenticator
Potřebujeme také poskytnout správnou konfiguraci pro 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
Pro více informací důrazně doporučuji, abyste se podívali na následující odkazy:
- Použití SwarmSpawner (oficiální příklad)
- Oficiální dokumentace SwarmSpawner (JupyterHub)
- Nasazení kontejnerového serveru JupyterHub s Dockerem (článek)
- Jak spustit JupyterHub v prostředí docker swarm pomocí swarmSpawner (článek)
Konfigurace Nginx (roj)
Konfigurace Nginx zůstane nezměněna, ale pro úplnost příkladu ji uveďme sem:
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;
}
}
}
Příklad ukázky
Chcete-li spustit poskytnuté demo, spusťte následující příkaz:
docker-compose build
docker-compose up
Jakmile se služba spustí, připojte se k externí IP adrese vašeho serveru k portu 8080:
Měli byste vidět následující výstup konzoly:
V prohlížeči byste měli vidět následující stránku:
Použijte libovolné uživatelské jméno a neuvádějte žádné heslo. Klikněte na tlačítko Přihlásit se a budete přesměrováni do prostředí uživatelské laboratoře:
Shrnutí
Doufám, že vám tato malá poznámka pomůže ušetřit čas. Pokud to považujete za užitečné, pomozte to rozšířit do světa!
Zůstaňte naladěni!