CentOS7にJupyter NotebookをインストールしてローカルPCから接続

はじめに

最近データ加工などのためにローカルPCでJupyter Notebookを使っています。

でも、時間のかかる処理が必要なこともあるため、そういうときはサーバ側で実行したいです。

そこで、CentOS7にJupyter Notebookをインストールして、ローカルPCから接続するまでの方法を調べてまとめました。

環境

さくらのvpsに新規でCentOS7を立ち上げた状態からJupyter Notebookをインストールして、ローカルPCから接続する想定です。

セキュリティの設定

まずはOS再インストール後すぐに、さくらVPSのCentOS7のセキュリティ設定を見て対応していきました。

(参考サイト:チュートリアル:CentOS 7(さくらのVPS)サーバ作成直後に設定しておくべき初期セキュリティ設定 – さくらのVPSニュース

上記サイトが分かりやすかったのでそのまま設定をします。

  • 一般ユーザの作成
  • 公開鍵認証の設定
  • sudo 設定
  • SSH 接続時、root でのログインを禁止
  • SSH 接続時、パスワード認証を禁止

ここで作成した秘密鍵パスフレーズは後のサーバ接続のために利用します。

公開鍵認証でのローカルからのSSH接続のコマンドをよく忘れるのでメモします。 上記設定の後だと一般ユーザで公開鍵認証でしかログインできなくなります。

ssh -i ~/.ssh/id_rsa ユーザ名@IPアドレス

Jupyter Notebookのインストール

色々インストール方法はありますが、本記事ではpyenvをインストールしてからAnacondaをインストールします。 Anacondaを入れるとpython本体に加えてデータ分析等のよく使われるライブラリも同時にインストールできます。 その中にjupyter notebookも含まれます。

自分が過去に書いたPythonインストール記事を参考にします。
以下を実行してインストールからjupyter notebook起動までを行います。

(参考サイト:CentOSにPython環境を作ってみたまとめ - 薮蛇なエンジニアの開発備忘録

yum update -y
yum install -y gcc gcc-c++ make git openssl-devel bzip2-devel zlib-devel readline-devel sqlite-devel bzip2 sqlite git
cd /usr/local/src/
git clone https://github.com/yyuu/pyenv.git
echo 'export PYENV_ROOT="/usr/local/src/pyenv"' >> /etc/profile.d/pyenv.sh
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> /etc/profile.d/pyenv.sh
echo 'eval "$(pyenv init -)"' >> /etc/profile.d/pyenv.sh
exec $SHELL -l
pyenv --version

pyenv install --list
pyenv install anaconda3-4.3.1
pyenv global anaconda3-4.3.1
pyenv rehash
python --version
cd ~
mkdir workspace
cd workspace
jupyter notebook

これでjupyter notebookを起動できます!
(でも、まだローカルPCからはアクセスできません)

notebook起動後、以下のようなメッセージが出力されるので token=以下の文字列をあとで利用します。

[NotebookApp] 
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=xxxxxxxxx(毎回異なるトークンが入る)

注意
自分が過去にpyenvを使ったので今回も利用しましたが、 改めてPython環境周りを調べると構成を再検討した方が良さそうでした。
でも、今回は取り急ぎjupyter notebookをインストールする一例としてこのまま進めます。

SSHポートフォワーディングについて

サーバにインストールしたnotebookにアクセスする方法を調べたところ次の2つが見つかりました。 個人的な利用を想定しているため(2)を採用しました。

(1) notebookを公開してパスワードをつける
(2) SSHポートフォワーディングでサーバに接続する

ポートフォワーディングについては次のように理解しています。

SSHコマンドに-L オプションをつけるとポートフォワーディングできる

 例:ssh -L 7777:localhost:8888 ユーザ名@IPアドレス

■ローカル指定ポートにアクセスで、サーバ上から指定場所にアクセスできる

 例:上記のコマンドのあとローカルPCでlocalhost:7777にアクセスするとサーバ側から繋いだlocalhst:8888にアクセスできる(つまり、jupyternotebookがサーバ内部でしか見れなかったとしてもポートフォワーディングすればローカルPCから閲覧可能)

(ポートフォワーディングの参考サイト:サーバー上の Jupyter Notebook を SSH Port Forwarding を通して使う | kuune.org

ローカルPCからの接続

ssh -L 7777:localhost:8888 ユーザ名@IPアドレス -i ~/.ssh/id_rsa

jupyterを起動したのとは別のターミナルを立ち上げて、
公開鍵認証でポートフォワーディングする上記のコマンドを実行します。

その後ブラウザでlocalhost:7777に接続すると、次のような画面が出てきます。

f:id:h2shiki:20170817225406p:plain

「Passsword or token:」の部分に、jupyter起動時のtoken=以下の文字列をコピペして「Log in」ボタンを押します。

これでローカルPCからサーバのjupyter notebookにアクセスできます!

使いやすくする工夫

■jupyter notebookがターミナルを閉じると止まる

これまでの方法だと、jupyter notebookを起動したターミナルを閉じるとjupyterも停止してしまいます。

ターミナルを閉じた後も停止させないようにするためにはnohupをつけると良いようです。

(参考サイト1:Jupyter Notebook を永続的に起動させる方法 - 約束の地

(参考サイト2:プロセス管理: nohup, disown, kill - Heavy Watal

nohup jupyter notebook >~/jupyter_out.txt 2>~/jupyter_err.txt &

上記のコマンドを打つとターミナルを閉じた後も、ポートフォワーディングさえできていればローカルPCからjupyterに接続できました。

バックグラウンド実行中でtokenを確認したくなったときはjupyter notebook listで見れます。

SSH接続がタイムアウトする

ターミナルをしばらく操作しないでいるとタイムアウトされるため、頻繁に接続しなおすことになり面倒です。

なるべくタイムアウトを引き伸ばす方法を調べました。

(参考サイト:ターミナルのSSH接続が切れすぎるので設定いじった話 - helen's blog

以下のようにsshd_configを修正して再起動しました。

sudo vim /etc/ssh/sshd_config
sudo systemctl restart sshd

変更前

# ClientAliveInterval
# ClientAliveCountMax

変更後

ClientAliveInterval 60
ClientAliveCountMax 12

これでだいぶ切断頻度が下がりました!

まとめ

CentOS7のサーバにJupyter Notebookをインストールし、ローカルPCから接続する方法をまとめました。

これで時間のかかる処理を実行したときにファンの音などPCを気にせずにすみそうです。また、iPadSafariからでもサーバで起動したnotebookを表示できたので、くつろぎながら進捗確認をしたり色々捗りそうです。