Artikel ini menjelaskan cara mengkonfigurasi Jupyter di belakang proxy terbalik Nginx, karena konfigurasi seperti itu tidak terlalu jelas bagi banyak orang. Ada banyak masalah dan inti di GitHub, dan sulit untuk memilih solusi yang tepat untuk masalah ini. Selain itu, Anda mungkin menemukan banyak artikel berbeda yang menjelaskan cara melakukannya, tetapi kebanyakan sudah usang dan tidak mencakup konfigurasi CORS dengan baik.
Karena topiknya masih trendi, saya memutuskan untuk memperbarui artikel dan menyederhanakan konfigurasi.
Terima kasih atas komentar Anda di bawah, Andrew Barker . Tangkap versi artikel yang diperbarui.
Konfigurasi buruh pelabuhan
Di bagian artikel ini, kami akan membahas kasus ketika Anda mungkin perlu meluncurkan Jupyter atau JupyterHub di lingkungan Docker biasa.
Konfigurasi JupyterHub
Pertama, mari buat folder tempat kita akan meletakkan semua file konfigurasi.
Inilah struktur akhir kami:
mkdir docker
tree docker
docker
├── docker-compose.yaml
├── jupyter_notebook_config.py
└── nginx.conf
Tulisan Docker
Untuk menyederhanakan semuanya, saya membuat docker-compose.yaml
, yang menjelaskan layanan kami:
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"
Konfigurasinya mudah – container Nginx Docker kecil sederhana di depan Jupyterhub.
Keduanya diluncurkan dari versi terbaru mereka.
Konfigurasi Nginx
Nginx duduk di port 8080 dan mendengarkan di port 8080 juga.
SANGAT PENTING: nginx.conf
berisi konfigurasi proxy terbalik.
Jika Nginx Anda menggunakan port selain 80 atau 443 , Anda perlu menggunakan arahan konfigurasi berikut:
proxy_set_header Host $host:$server_port;
Untuk Nginx, yang berada di port default, gunakan default
konfigurasi:
proxy_set_header Host $host;
Jika Anda membuat kesalahan di sini, Anda akan mulai menerima Blocking Cross Origin API request for /api/contents
pesan kesalahan.
Sekali lagi, alasan utama untuk pesan ini bukanlah port yang sama untuk pengikatan layanan dan ekspor untuk kontainer Nginx.
Ini nginx.conf
saya untuk mendengarkan di port 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;
}
}
}
Konfigurasi Jupyter
Untuk konfigurasi JupyterHub, kami akan menggunakan konfigurasi berikut yang ditempatkan ke /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 = '~/'
Meluncurkan Jupyrter di belakang Proxy Nginx
Saya tidak punya banyak waktu untuk membuat wadah baru dan/atau bermain dengan pengaturan otentikasi pengguna. Tujuan utamanya adalah memberikan solusi untuk Memblokir permintaan Cross-Origin API untuk /api/contents masalah.
Jadi, inilah cara Anda meluncurkan konfigurasi ini:
docker-compose up -d
Hubungkan ke penampung yang baru saja diluncurkan dan buat pengguna serta instal notebook paket:
docker exec -it jupyterhub /bin/bash
adduser
pip install notebook
Sekarang Anda dapat terhubung ke JupterHub dan menggunakan nama pengguna dan kata sandi yang Anda buat sebagai kredensial masuk.
Konfigurasi Docker Swarm
Di bagian artikel ini, kami akan membahas kasus saat Anda mungkin perlu meluncurkan Jupyter atau JupyterHub dalam mode Docker Swarm.
Mari kita sedikit memodifikasi folder proyek kita:
.
├── .env
├── docker-compose.yaml
├── jupyterhub
│ ├── Dockerfile
│ ├── jupyterhub_config.py
└── nginx
└── nginx.conf
3 directories, 5 files
Tulisan Docker (Swarm)
Begini cara docker-compose.yaml
kami file akan terlihat seperti:
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:
Variabel lingkungan komposisi Docker didefinisikan di .env
berkas:
# Name of our Docker Compose project
COMPOSE_PROJECT_NAME="jupyterhub"
DOCKER_JUPYTER_IMAGE="jupyterhub/singleuser:2.2"
Konfigurasi JupyterHub (swarm)
Kita perlu membuat image JupyterHub kustom kita sendiri untuk secara otomatis menyertakan dockerspawner, dummyauthenticator, dan modul lain yang mungkin Anda perlukan (misalnya, untuk mendukung metode autentikasi yang berbeda).
# Do not forget to pin down the version
FROM jupyterhub/jupyterhub
# Install dependencies (for advanced authentication and spawning)
RUN pip install \
dockerspawner \
jupyterhub-dummyauthenticator
Kami juga perlu menyediakan konfigurasi yang benar untuk 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
Untuk informasi lebih lanjut, saya sangat menyarankan Anda untuk memeriksa tautan berikut:
- Menggunakan SwarmSpawner (contoh resmi)
- Dokumentasi resmi SwarmSpawner (JupyterHub)
- Menerapkan server JupyterHub dalam container dengan Docker (artikel)
- Cara menjalankan JupyterHub di lingkungan docker swarm menggunakan swarmSpawner (artikel)
Konfigurasi Nginx (swarm)
Konfigurasi Nginx akan tetap tidak berubah, tetapi mari kita taruh di sini untuk kelengkapan contoh:
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;
}
}
}
Contoh demo
Untuk meluncurkan demo yang disediakan, jalankan perintah berikut:
docker-compose build
docker-compose up
Segera setelah layanan dimulai, sambungkan ke alamat IP eksternal server Anda ke port 8080:
Anda akan melihat keluaran konsol berikut:
Di browser Anda akan melihat halaman berikut:
Gunakan nama pengguna apa pun dan jangan berikan kata sandi apa pun. Klik tombol Masuk tombol dan Anda akan diarahkan ke lingkungan lab pengguna:
Ringkasan
Saya harap catatan kecil ini akan membantu Anda menghemat waktu. Jika menurut Anda bermanfaat, tolong bantu sebarkan ke seluruh dunia!
Tetap disini!