1. 目的
仮想マシン上の__CentOS__に__Jupyter Notebook__を導入する。
加えて,ホストマシンなどリモートマシンからブラウザでアクセスし実行できるようにする。
2. 環境
ホストマシン | 構成 |
---|---|
OS | OS X 10.11.6 |
VitrtualBoxバージョン | 5.1.18 |
仮想マシン | 構成 |
---|---|
OS | CentOS 7.3 (minimal) |
メモリ容量 | 512MB |
CPUコア数 | 1コア |
ストレージ容量 | 8GB |
ネットワーク設定 | ブリッジアダプター |
VirtualBoxと,CentOSの導入方法は省く。
3. 導入
3.1. Yumで既存のパッケージを更新
$ sudo yum update -y
3.2. Anacondaを用いて必要なものを導入
# curlでAnacondaを入手
$ curl https://repo.continuum.io/archive/Anaconda3-4.3.1-Linux-x86_64.sh -O
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 474M 100 474M 0 0 3431k 0 0:02:21 0:02:21 --:--:-- 3837k
# bzip2を導入
# Anacondaの導入に必要
# minimalだとインストールされていない
$ sudo yum install bzip2 -y
# shファイルを実行
$ bash ./Anaconda3-4.3.1-Linux-x86_64.sh
# Pythonのバージョンを確認
$ python --version
Python 3.6.0 :: Anaconda 4.3.1 (64-bit)
# Jupyterのバージョンを確認
$ jupyter --version
4.2.1
3.3. JupyterNotebook の実行
$ jupyter notebook
JupyterNotebookが起動できることを確認する。
しかし,この状態ではリモートマシンからJupyterNotebookにアクセスできない。
よって,外部から接続できるようにコンフィグファイルを編集する。
4. リモートから接続できるようにする
4.1. configファイルの作成
# ホームディレクトリにConfigファイルのパスが通っていることを確認
$ jupyter --path
# ホームディレクトリにconfigファイルを作成
$ mkdir ~/.jupyter
$ touch ~/.jupyter/jupyter_notebook_config.py
4.2. configファイルの編集
c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
- すべてのIPアドレスから接続を受け入れる。
- Jupyterは8888番ポートで起動する。
- JupyterNotebookの起動時にブラウザを立ち上げない。
4.3. firewalld の編集
firewalldにルールを追加して,外部から8888番ポートへのアクセスを許可させる。
$ sudo firewall-cmd --add-port=8888/tcp --zone=public --permanent
success
$ sudo firewall-cmd --reload
success
$ sudo firewall-cmd --list-all --zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client http ssh
ports: 8888/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
4.4. ログインパスワードの設定
4.4.1. iPythonで暗号化された文字列を生成
# iPythonを起動
$ ipython
# 暗号化された文字列を生成するためにライブラリ読み込み
In [1]: from notebook.auth import passwd
# パスワードを入力して暗号化された文字列を生成
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:(暗号化された文字列)'
# iPythonから抜ける
In [3]:
Do you really want to exit ([y]/n)? y
4.4.2. 暗号化された文字列をJupyterのコンフィグファイルに書き込む
c.NotebookApp.password = u'sha1:(4.4.1.で生成した文字列)'
4.5. Jupyter Notebookを実行
$ jupyter notebook
Jupyter Notebookを起動したら,実行しているマシンに割り当てられているIPアドレスの8888番にアクセスする。
パスワードの入力を求められるので,先ほど設定したパスワードを入力する。
ログインに成功すると,ホームディレクトリのファイル一覧が表示される。
5. systemd で JupyterNotebook をサービス化する
5.1. Unit定義ファイルを作成
# root になる
$ su root
# Jupyterのパスを確認
\# which jupyter
# Unit定義ファイルを作成
\# touch /etc/systemd/system/notebook.service
5.2. Unit定義ファイルの編集
[Unit]
Description = Jupyter Notebook
[Service]
Type=simple
PIDFile=/var/run/jupyter-notebook.pid
ExecStart='Jupyterまでの絶対パス' notebook
WorkingDirectory='Anacondaを導入したユーザーのホームディレクトリのパス'
User='Anacondaを導入したユーザー名'
Group='Anacondaを導入したユーザー名'
Restart=always
[Install]
WantedBy = multi-user.target
- ExecStart には 5.1. で確認したJupyterのパスにnotebookを引数に持つコマンドを入力する。
- WorkingDirectory にはAnacondaを導入したユーザーのホームディレクトリのパスを指定する。
- User と Group には,Anacondaを導入したユーザー名を入力する。
5.3. 登録されたUnitの一覧を取得
\# systemctl list-unit-files --type=service
notebook.service disabled
出力された一覧の中に,先ほど定義したUnitファイルが存在していることを確認。
5.4. 起動時に実行するように設定する
# 起動時にJupyterが自動起動するように設定
\# systemctl enable notebook
# サービスを開始
\# systemctl start notebook
# Jupyterが正しく動いているか確認
\# systemctl status notebook
● notebook.service - Jupyter Notebook
Loaded: loaded (/etc/systemd/system/notebook.service; enabled; vendor preset: disabled)
Active: active (running) since 月 2017-03-20 21:27:49 JST; 2s ago
# 再起動してJupyterが起動していることを確認する
\# reboot
6. SSLの適用
6.1. OpenSSLを利用して,SSLサーバー証明書と秘密鍵を作成
自己証明書と秘密鍵の作成にあたって,Using SSL for encrypted communicationでは,次のコマンドが例として挙げられている。
$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mykey.key -out mycert.pem
Generating a 1024 bit RSA private key
OpenSSLコマンドの引数の意味については,CentOS7.2 64bit OpenSSLを使用して秘密鍵、CSRを作成し、自己署名のSSLサーバー証明書を作成の「自己署名のSSLサーバー証明書を作成」を読むと分かる。
上のコマンドの場合
- 秘密鍵作成とCSR作成を一度にする
- x509という証明書の規格
- 証明書の有効期限は365日
ということがわかる。
6.2. configファイルの編集
6.1.で作成した証明書と秘密鍵を,_~/.jupyter_フォルダに配置しておく。
$ mv mycert.pem ~/.jupyter/
$ mv mykey.key ~/.jupyter/
configファイルに証明書と秘密鍵の場所を編集する。
c.NotebookApp.certfile = u'${ホームディレクトリへの絶対パス}/.jupyter/mycert.pem'
c.NotebookApp.keyfile = u'${ホームディレクトリへの絶対パス}/.jupyter/mykey.key'
6.3. サービスを再起動してHTTPSでアクセスする
$ sudo systemctl restart notebook
$ sudo systemctl status notebook
● notebook.service - Jupyter Notebook
Loaded: loaded (/etc/systemd/system/notebook.service; enabled; vendor preset: disabled)
Active: active (running) since 月 2017-03-20 22:15:08 JST; 6s ago
7. デフォルトの作業ディレクトリを変更する
現在,デフォルトでホームディレクトリが指定されている Jupyter Notebook の作業ディレクトリを,別の場所に変更する。
7.1. config ファイルの編集
$ mkdir ~/jupyter_files
config ファイルを編集する。
c.NotebookApp.notebook_dir = u'${先に作成したディレクトリへの絶対パス}'
$ sudo systemctl restart notebook
7.2. 変更を確認
Jupyter Notebook にアクセスする。
先ほどまで表示されていた,"anaconda3"ディレクトリが表示されなくなっていることがわかる。
ターミナルで先ほど指定した作業ディレクトリにファイルを作成すると,jupyter notebookでも変更が確認できる。
$ cd ~/jupyter_files/
$ touch TEST_FILE.py