📝

JupyterをNginxリバースプロキシでどこにいても使えるようにする

2023/03/20に公開

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

やること

  1. JupyterLab の公開設定
  2. Nginx でのリバースプロキシの設定
  3. (オプション)Jupyterlab を systemd のサービスとして設定

前提

  • Nginx,Jupyter はインストールされているものとする
  • Jupyter はすでに使えるようにしてあるものとする

1.JupyterLab の設定

設定ファイル生成

jupyter lab --generate-configで、設定ファイルを生成。
設定ファイルの場所は、jupyter --config-dirで確認できます。
記事では、~/.jupyter/jupyter_notebook_config.pyだと仮定します。

パスワードなどの設定

hash 値を用います。

test.py
from notebook.auth import passwd
password = input("Enter password: ")
print(passwd(password))

以下のように生成してその出力内容を保存します。

設定ファイルを以下のように変更します。

~/.jupyter/jupyter_notebook_config.py
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 であればなんでもいいです。

/etc/nginx/conf.d/jupyter.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 を使わなくて済みます。

/etc/systemd/system/jupyter-lab.service
[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