Ubuntu ServerにPythonとJupyterHubをインストールする

Ubuntu Server 22.04 LTSには最初からPython (バージョン3.10)が /usr/bin ディレクトリに入っていますが、このPythonはUbuntu Serverのツールでも用いられており、別バージョンのPythonをインストールしたりパッケージを追加インストールしたりするとUbuntu Serverの安定動作に影響が起こるかもしれません。

そこで /usr/local/bin に新しくPythonをインストールして、そこにnumpyやmatplotlibなどの便利なパッケージを追加していくことにします。

また、PythonをWebブラウザの画面から便利に利用するJupyterLab (Jupyter Notebook)のサーバ版であるJupyterHubもインストールします。

Pythonのインストール

Pythonの公式サイトではLinux用のPythonをソースコードで配布していますので、まずはソースコードをビルドするために必要なパッケージをインストールします。

sudo apt update
sudo apt install build-essential libbz2-dev libdb-dev \
libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
libncursesw5-dev libsqlite3-dev libssl-dev \
zlib1g-dev uuid-dev tk-dev

ちなみにPython Developer’s GuideではPython本体を開発・デバッグするために必要なパッケージのインストール方法について説明が記載されており、上記より沢山のパッケージをインストールしていますが、Pythonをmakeする分には上記のパッケージだけインストールした場合と差はありませんでした。

Python公式サイトの「Downloads」メニューから「Source code」を選択すると、Linux用に配布されているソースコードの一覧が表示されるので、リンクを右クリックして「リンクをコピー」します。

ターミナルからUbuntu ServerにSSH接続して、先ほどコピーしたリンクをwgetコマンドでダウンロードします。

mkdir -p ~/temp
cd ~/temp
wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tar.xz  #コピーしたリンクをターミナルに貼り付ける

ダウンロードしたファイルを展開し、ソースコードのディレクトリの中でmakeとmake installを行います。makeは時間がかかるので、tmuxなどを使ってmakeすると万が一SSH接続が切れても安心です。

./configureにはPython Documentationの「3. Configure Python」で推奨されているベストパフォーマンス用のパラメータを指定しています。

tar Jxvf ./Python-3.10.12.tar.xz
cd ./Python-3.10.12/
./configure --enable-optimizations --with-lto
make -j7
sudo make install

インストールしたPythonは/usr/local/binディレクトリの中に格納されていることを確認します。また、Pythonのバージョンがインストールしたバージョンであることを確認します。

cd
which python3    # /usr/local/bin/python3であることを確認する
python3          # Pythonのバージョンを確認する

なお、/usr/local/binディレクトリに格納したPythonのpipを使ってパッケージをインストールするときはsudoコマンドを使ってroot権限でインストールしますが、pipを使う度に以下の警告メッセージが表示されてしまいます。

WARNING: Running pip as the 'root' user can result in broken permissions and 
conflicting behaviour with the system package manager. It is recommended to 
use a virtual environment instead: https://pip.pypa.io/warnings/venv

これを表示しないようにするには、以下のように/etc/pip.confを作成します。

[global]
root-user-action=ignore

pipを使ってnumpyやmatplotlibをインストールしておきます。

sudo pip3 install numpy matplotlib

JupyterHubのインストール

サーバにインストールしたPythonをリモートから利用できるように、Jupyter Lab (Jupyter Notebook)のサーバ版とも言えるJupyterHubをインストールします。

まずは前準備として、npmをインストールしてconfigurable-http-proxyパッケージをインストールします。

sudo apt install npm
sudo npm install -g configurable-http-proxy

次に、/usr/local/binディレクトリにインストールしたPythonを使ってJupyterHub関連のパッケージをインストールします。

2023年7月時点で最新のjupyterhub(==4.0.1)やnotebook(==7.0.0)をインストールすると設定通りに動作しないので、一つ前のメジャーバージョンのものをインストールします。

sudo pip3 install wheel
sudo pip3 install jupyterhub==3.* jupyterlab
sudo pip3 install notebook==6.*

/etc/jupyterhubディレクトリに環境設定ファイルのjupyterhub_config.pyを作成します。

sudo bash
mkdir -p /etc/jupyterhub
cd /etc/jupyterhub
jupyterhub --generate-config
nano ./jupyterhub_config.py

以下の設定例では、ホームディレクトリ直下のnotebooksディレクトリをノートブックの格納先にして、JupyterHubの接続ポート番号を8888にしています。

c.Authenticator.admin_users = {'【管理用のユーザー名】'}
c.Spawner.notebook_dir = '~/notebooks'
c.JupyterHub.cookie_secret_file = '/etc/jupyterhub/jupyterhub_cookie_secret'
c.JupyterHub.db_url = 'sqlite:////etc/jupyterhub/jupyterhub.sqlite'
c.JupyterHub.bind_url = 'http://:8888'
c.Spawner.default_url = '/lab' 

jupyterhub_config.pyを設定したら、初期化のためにJupyterHubのDBを更新します。

jupyterhub upgrade-db
ls        # /etc/jupyterhub配下にjupyterhub.sqliteが出来ていることを確認
exit      # sudo bashから脱出

Ubuntu Serverが起動したらJupyterHubも自動起動するように、JupyterHubのサービスを作成します。

sudo nano /etc/systemd/system/jupyterhub.service
[Unit]
Description=JupyterHub
After=syslog.target network.target

[Service]
User=root
Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
ExecStart=/usr/local/bin/jupyterhub -f /etc/jupyterhub/jupyterhub_config.py

[Install]
WantedBy=multi-user.target

systemctlコマンドでJupyterHubのサービスを起動します。

sudo systemctl daemon-reload
sudo systemctl enable --now jupyterhub
sudo systemctl status jupyterhub

systemctl statusの状態が「active (running)」になっていれば、JupyterHubのサービスが正常に動いているはずです。

● jupyterhub.service - JupyterHub
     Loaded: loaded (/etc/systemd/system/jupyterhub.service; enabled; vendor preset: enabled)
     Active: active (running) since XXX XXXX-XX-XX XX:XX:XX XXX; XXX ago
   Main PID: XXX (jupyterhub)
【以下略】

ファイアウォールのポートを開放して、クライアントのWebブラウザからアクセスできることを確認します。

sudo ufw allow from any to any port 8888

http://【Ubuntu ServerのIPアドレス】:8888/ にアクセスして以下のようにJupyterHubのSign in画面が表示されれば成功です。

しかし、HTTP通信であることを警告するメッセージが表示されてしまいます。そこで、HTTPSで接続できるように設定していきます。

HTTPS経由でのJupyterHubへの接続

HTTPSで接続するにはLet’s Encryptのような認証局(CA)が発行する証明書を用意できればよいですが、家庭内のプライベートなIPアドレスで運用しているサーバには自己署名証明書(いわゆるオレオレ証明書)を作って、家庭内のクライアントだけがHTTP接続できるように設定していきます。

ここではOpenVPNのセットアップ時に用いたEasy-RSAを使って自己署名証明書を作成します。

sudo apt install easy-rsa

/etc/easy-rsaディレクトリを作成して、CA証明書やサーバ証明書を作っていきます。

sudo bash  #  以降はroot権限でコマンドを実行する
make-cadir /etc/easy-rsa
cd /etc/easy-rsa
nano vars

varsファイルにはCA証明書に格納する情報を入力していきます。

set_var EASYRSA_DN             "org"
set_var EASYRSA_REQ_COUNTRY    "JP"
set_var EASYRSA_REQ_PROVINCE   "【都道府県名】"
set_var EASYRSA_REQ_CITY       "【都市名】"
set_var EASYRSA_REQ_ORG        "【組織名称】"
set_var EASYRSA_REQ_EMAIL      "【メールアドレス】"
set_var EASYRSA_REQ_OU         "【組織単位・部門名】"

公開鍵基盤(PKI)を初期化して、CA証明書を作成します。CA証明書は/etc/easy-rsa/pki/ca.crtに保存されます。

export EASYRSA_VARS_FILE="/etc/easy-rsa/vars"
./easyrsa init-pki
./easyrsa build-ca nopass
# Common Name (eg: your user, host, or server name) が表示されたら
# CAのCommon Nameを入力し、その他はEnterキーだけ押下する。

次にサーバ証明書を作成します。このとき、サブジェクト代替名(Subject Alternative Name, SAN)を指定しないとGoogle ChromeでHTTPSのURLを正常に開くことができませんので、–subject-alt-nameオプションでDNS名やIPアドレスを指定します。サーバ証明書は/etc/easy-rsa/pki/issued/【サーバ名】.crt、秘密鍵は/etc/easy-rsa/pki/private/【サーバ名】.keyに保存されます。

./easyrsa --subject-alt-name='DNS:【ホスト名】,IP:【IPアドレス】,DNS:localhost,IP:127.0.0.1' gen-req 【サーバ名】 nopass
./easyrsa sign-req server 【サーバ名】
# Confirm request details が表示されたら、yesと入力して続行する

サーバ証明書ができたら、JupyterHubの設定をHTTPS接続に変更します。

nano /etc/jupyterhub/jupyterhub_config.py
c.JupyterHub.bind_url = 'https://:8888'
c.JupyterHub.ssl_cert = '/etc/easy-rsa/pki/issued/【サーバ名】.crt'
c.JupyterHub.ssl_key = '/etc/easy-rsa/pki/private/【サーバ名】.key'
systemctl restart jupyterhub
exit    # sudo bashから脱出する

/etc/easy-rsa/pki/ca.crtはSambaでファイル共有して、クライアントのWindowsやMac, iPadなどにインストールして使います。

https://【Ubuntu ServerのIPアドレス】:8888/ にアクセスして、以下のようにHTTPS接続でJupyterHubのSign in画面が表示されれば成功です。UsernameとPasswordにはUbuntu Serverのユーザ名・パスワードを入力してSign inします。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする