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します。