JupyterをNginxリバースプロキシでどこにいても使えるようにする
Jupyter Lab を、リバースプロキシでホスト
大学にいても家の GPU を積んだ PC で機械学習を行うために、Jupyter をどこからでもつかえるようにしました。
SSH してもいいんですが、どうせならと思ったので。
同じような人がいれば参考になれば幸いです。
環境
- nginx 1.20.1
- Oracle Linux 9.1(Red Hat Enterprise Linux release 9.1 (Plow))
- jupyterlab 3.6.1
やること
- JupyterLab の公開設定
- Nginx でのリバースプロキシの設定
- (オプション)Jupyterlab を systemd のサービスとして設定
前提
- Nginx,Jupyter はインストールされているものとする
- Jupyter はすでに使えるようにしてあるものとする
1.JupyterLab の設定
設定ファイル生成
jupyter lab --generate-config
で、設定ファイルを生成。
設定ファイルの場所は、jupyter --config-dir
で確認できます。
記事では、~/.jupyter/jupyter_notebook_config.py
だと仮定します。
パスワードなどの設定
hash 値を用います。
from notebook.auth import passwd
password = input("Enter password: ")
print(passwd(password))
以下のように生成してその出力内容を保存します。
設定ファイルを以下のように変更します。
c.NotebookApp.password='argon2:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
c.NotebookApp.open_browser = False
c.NotebookApp.allow_remote_access = True
c.NotebookApp.port = 8888
ポートは好きなものを選んでください。ですが、Nginx でリバースプロキシを設定するときに、ポート番号が必要になるので記録してください。
2.Nginx の設定
サブドメインにホストすることを想定しています。
メインにホストする場合は、nginx.conf の server の中身を変更してください。
設定ファイルの作成
sudo vim /etc/nginx/conf.d/jupyter.conf
で設定ファイルを作成します。
ファイル名は拡張子が.conf であればなんでもいいです。
server {
server_name jupyter.example.com;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:8888/;
}
listen [::]:443 ssl;
listen 443 ssl;
}
server {
if ($host = jupyter.example.com) {
return 301 https://$host$request_uri;
}
server_name jupyter.example.com;
listen 80;
listen [::]:80;
return 404;
}
-
proxy_pass
のポート番号は、Jupyter の設定ファイルで設定したポート番号に変更してください。
nginx -t
で設定ファイルの構文チェックを実行してエラーがないことを確認してください。
systemctl restart nginx
またはsystemctl reload nginx
で設定を反映します。
3.(オプション)JupyterLab を systemd のサービスとして設定
systemctl restart jupyter-lab
などを使えるようになります。
完全に自分の趣味で記事の内容と離れているので興味があり、かつ RHEL 系を使っている人はどうぞ。
Cockpit で観測できるようになります。また、nohup を使わなくて済みます。
[Unit]
Description={説明文}
[Service]
Type=simple
WorkingDirectory={作業ディレクトリ}
ExecStart={jupyterコマンドの絶対パス} lab
Restart=always
StartLimitBurst=5
StartLimitIntervalSec=10
User={ユーザー名}
Group={グループ名}
[Install]
WantedBy=multi-user.target
systemctl start jupyter-lab
で起動できます。
確認
systemctl status jupyter-lab
で起動しているか確認できます。
systemctl status nginx
で起動しているか確認できます。
うまくいけば、jupyter.example.com
にアクセスすると、以下のような画面が表示されます。
最初に設定したパスワードを入力すると、いつもの JupyterLab が表示されます。
おわりに
かなり雑な記事ですが、参考になれば幸いです。
質問があれば、コメント等でお願いします。
Twitter でもいいですし、Discord でもいいです。
Discussion