CentOS7にJupyter NotebookをインストールしてローカルPCから接続
はじめに
最近データ加工などのためにローカルPCでJupyter Notebookを使っています。
でも、時間のかかる処理が必要なこともあるため、そういうときはサーバ側で実行したいです。
そこで、CentOS7にJupyter Notebookをインストールして、ローカルPCから接続するまでの方法を調べてまとめました。
環境
- CentOS 7.2
- anaconda3-4.3.1
さくらのvpsに新規でCentOS7を立ち上げた状態からJupyter Notebookをインストールして、ローカルPCから接続する想定です。
セキュリティの設定
まずはOS再インストール後すぐに、さくらVPSのCentOS7のセキュリティ設定を見て対応していきました。
(参考サイト:チュートリアル:CentOS 7(さくらのVPS)サーバ作成直後に設定しておくべき初期セキュリティ設定 – さくらのVPSニュース)
上記サイトが分かりやすかったのでそのまま設定をします。
ここで作成した秘密鍵とパスフレーズは後のサーバ接続のために利用します。
公開鍵認証でのローカルからの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に接続すると、次のような画面が出てきます。
「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接続が切れすぎるので設定いじった話 - 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を気にせずにすみそうです。また、iPadのSafariからでもサーバで起動したnotebookを表示できたので、くつろぎながら進捗確認をしたり色々捗りそうです。