スポンサーリンク

リモートサーバーで起動したJupyterNotebookにローカルブラウザから接続する環境構築について

Python




ちょっと作業環境的なお話。
私はいつもデータのクレンジングや分析、可視化はレンタルサーバー(CentOS)上でやっていて、rbenvだったり、pyenvだったり、Rはコンソールから普通に使ったり、R-studio-serverでブラウザから使ったりしています。
Python分析者がよく扱うNumpyやMatplotlibなどの数値解析ライブラリも、手動でインストールして使っていたのですが、結構、周りの分析者やエンジニアは、Anaconda+JupyterNotebookの環境で作業をしていることが多いです。(というか私も会社PCのWindowsでは、Anaconda+JupyterNotebookを使いますが)
で、レンタルサーバーではpyenvを中心にPythonのバージョン管理をしていますが、pyenvからAnacondaを導入して、JupyterNotebookをサーバー起動して他端末のブラウザから分析できるようにしてみようということで、設定をしてみました。

設定方法

CentOSでpyenvが導入されていて、すでにPythonのバージョン管理を行っている状態とします。
下記コマンドでpyenvからAnacondaをインストールして、Anacondaを使用するディレクトリを作成します。(グローバルでも問題ないならばグローバルでもOK)

[user@host] pyenv update
[user@host] pyenv install anaconda3-4.0.0
[user@host] pyenv rehash
[user@host] pyenv versions
[user@host] cd 任意のディレクトリ
[user@host] pyenv local anaconda3-4.0.0
[user@host] pyenv rehash
[user@host] pyenv versions
[user@host] python --version
Python 3.5.1 :: Anaconda 4.0.0 (64-bit)

この状態で、JupyterNotebookを実行すると、テキストベースのブラウザが立ち上がって、何だかよくわからない状態になります。(実行しても、終了コマンド[Q]で閉じることは可能です)
下記コマンドで、JupyterNotebookのconfigファイルを生成します。

[user@host] jupyter notebook --generate-config
Writing default config to: <パス>/jupyter_notebook_config.py

このファイルを下記のように編集します。

<略>
143 ## The IP address the notebook server will listen on.
144 #c.NotebookApp.ip = 'localhost'
145 c.NotebookApp.ip = '*' # ローカル以外から接続できるようにする
<略>
179 ## The directory to use for notebooks and kernels.
180 #c.NotebookApp.notebook_dir = ''
181 c.NotebookApp.notebook_dir = '<ディレクトリパス>'  # 開始ディレクトリ
<略>
182 ## Whether to open in a browser after starting. The specific browser used is
183 #  platform dependent and determined by the python standard library `webbrowser`
184 #  module, unless it is overridden using the --browser (NotebookApp.browser)
185 #  configuration option.
186 #c.NotebookApp.open_browser = True
187 c.NotebookApp.open_browser = False # ブラウザが自動で開かないようにする。これないとサーバー側でもテキストベースのブラウザが立ち上がってしまい、ブラウザをいちいち終了させないといけない
<略>
197 ## The port the notebook server will listen on.
198 #c.NotebookApp.port = 8888
199 c.NotebookApp.port = 9999 # ポート番号変更
<略>

以上の編集を終えて保存すれば、http://<サーバーのIPアドレス>:9999でJupyterNotebookに接続できます。
ちなみによくグラフをプロットとかしたくなりますが、画像はその場でプロットは出来ないため、下記コードのように画像保存して閲覧する形になるようです。
ちょっとここは不便...

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pylab as plt
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
x = np.arrange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.savefig("hoge.png")

パスワードの設定

また、この状態ですとIPとポート番号が分かれば、誰でも接続可能です。
普通にポート番号などで制限をかける方法もありますが、JupyterNotebook自体にも、パスワードを設定することができます。
パスワードを設定するには、まずiPythonコンソールで、パスワードを作成する必要があります。
下記のようにしてiPythonコンソールを起動して、パスワードを作成します。

[user@host] iPython
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:3fe6951c5fa7:458ff078f0ad39a0b4a7cc8f07f33479e896975d' # これをコピー
In [3]:exit

そして、先ほどのconfigファイルを下記部分を編集してコピーしたパスワードを貼り付けます。

<略>
190 ## Hashed password to use for web authentication.
191 #
192 #  To generate, type in a python/IPython shell:
193 #
194 #    from notebook.auth import passwd; passwd()
195 #
196 #  The string should be of the form type:salt:hashed-password.
197 #c.NotebookApp.password = ''
198 c.NotebookApp.password = 'sha1:3fe6951c5fa7:458ff078f0ad39a0b4a7cc8f07f33479e896975d' # ここに貼り付け
<略>

保存して、http://<サーバーのIPアドレス>:9999にアクセスすると、パスワード入力のログイン形式になっていることが確認できます。

これでリモートサーバーでJupyterNotebookを起動して、ローカルブラウザからアクセスして分析できるようになりました。



コメント