웹사이트 검색

Rocky Linux 9에서 JupyterLab 환경을 설치 및 구성하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - 방화벽 구성\n
  3. 2단계 - Nginx 설치
  4. 3단계 - JupyterLab 설치
  5. 4단계 - JupyterLab 구성
  6. 5단계 - JupyterLab 서비스 파일 만들기
  7. 6단계 - SSL 설치
  8. 7단계 - Nginx 구성
  9. 결론

JupyterLab은 Project Jupyter를 위한 차세대 웹 기반 개발 환경입니다. Project Jupyter는 여러 프로그래밍 언어에서 대화형 컴퓨팅을 위한 오픈 소스, 개방형 표준 및 서비스를 개발한다는 목표로 개발되었습니다. JupyterLab은 개발자가 Jupyter 노트북, 텍스트 편집기, 터미널 및 사용자 지정 구성 요소와 같은 문서 및 활동을 유연하고 통합되고 확장 가능한 방식으로 작업할 수 있는 유연한 인터페이스를 제공합니다. JupyterLab은 Jupyter Notebook의 차세대 제품이며 결국 이를 대체할 예정입니다. R, Python, Scala 및 Julia를 포함하여 40개 이상의 프로그래밍 언어를 지원합니다.

이 튜토리얼은 Rocky Linux 9 서버에 JupyterLab을 설치하고 구성하는 방법을 알려줍니다.

전제 조건

  • A server running Rocky Linux 9.

  • A non-root user with sudo privileges.

  • A fully qualified domain name (FQDN) pointing to your server. For our purposes, we will use jupyterlab.example.com as the domain name.

  • SELinux is disabled.

  • Make sure everything is updated.

    $ sudo dnf update
    
  • Install basic utility packages. Some of them may already be installed.

    $ sudo dnf install wget curl nano unzip yum-utils -y
    

1단계 - 방화벽 구성

첫 번째 단계는 방화벽을 구성하는 것입니다. Rocky Linux는 Firewalld Firewall을 사용합니다. 방화벽 상태를 확인하십시오.

$ sudo firewall-cmd --state
running

방화벽은 다른 영역에서 작동하며 공개 영역은 우리가 사용할 기본 영역입니다. 방화벽에서 활성화된 모든 서비스와 포트를 나열합니다.

$ sudo firewall-cmd --permanent --list-services

다음 출력이 표시되어야 합니다.

cockpit dhcpv6-client ssh

Wiki.js가 작동하려면 HTTP 및 HTTPS 포트가 필요합니다. 열어보세요.

$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --add-service=https --permanent

변경 사항을 적용하려면 방화벽을 다시 로드하십시오.

$ sudo firewall-cmd --reload

2단계 - Nginx 설치

Rocky Linux 9는 이전 버전의 Nginx와 함께 제공됩니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 다운로드해야 합니다.

공식 Nginx 리포지토리를 만들기 위한 /etc/yum.repos.d/nginx.repo 파일을 만들고 엽니다.

$ sudo nano /etc/yum.repos.d/nginx.repo

다음 코드를 붙여넣습니다.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

Nginx 서버를 설치합니다.

$ sudo dnf install nginx -y

설치를 확인하십시오.

$ nginx -v
nginx version: nginx/1.22.1

Nginx 서버를 활성화하고 시작합니다.

$ sudo systemctl enable nginx --now

서버의 상태를 확인하십시오.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
     Active: active (running) since Tue 2022-12-13 06:07:05 UTC; 31s ago
       Docs: http://nginx.org/en/docs/
    Process: 146475 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 146476 (nginx)
      Tasks: 2 (limit: 5911)
     Memory: 1.9M
        CPU: 15ms
     CGroup: /system.slice/nginx.service
             ??146476 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??146477 "nginx: worker process"

3단계 - JupyterLab 설치

우선 파이썬 버전을 확인해보자.

$ python -V
Python 3.9.14

PIP 패키지 관리자를 설치합니다.

$ sudo dnf install python3-pip

JupyterLab용 디렉터리를 만듭니다.

$ mkdir jupyterlab

새로 만든 디렉터리로 전환합니다.

$ cd ~/jupyterlab

jupyterlab_env라는 가상 환경을 설정합니다.

$ python3 -m venv --system-site-packages jupyterlab_env

환경을 활성화합니다.

$ source jupyterlab_env/bin/activate

Pip 패키지 관리자를 업그레이드합니다.

(jupyterlab_env) $ pip install --upgrade pip

JupyterLab을 설치합니다.

(jupyterlab_env) $ pip install jupyterlab

4단계 - JupyterLab 구성

기본적으로 JupyterLab은 인터페이스에 대한 액세스 권한을 부여하기 위해 시작할 때마다 새 토큰을 생성합니다. 비밀번호 인증으로 대체합시다.

암호 해시를 생성합니다. YOUR_PASSWORD를 선택한 강력한 암호로 바꾸십시오.

(jupyterlab_env) $ python3 -c "from jupyter_server.auth import passwd; print(passwd('YOUR_PASSWORD'))"

위의 명령은 긴 암호 해시를 생성합니다. Argon2 암호 해싱 기능을 사용합니다. 해시를 기록해 둡니다.

JupyterLab 구성 파일을 만듭니다.

(jupyterlab_env) $ jupyter lab --generate-config

위의 명령은 기본값으로 구성 파일을 생성하고 ~/.jupyter 디렉토리에 저장합니다.

편집할 파일을 엽니다.

(jupyterlab_env) $ nano ~/.jupyter/jupyter_lab_config.py

다음 변수를 찾아 주석을 해제하고 값을 아래와 같이 변경합니다. PASSWORD_HASH를 위에서 생성된 해시로 바꿉니다.

c.ServerApp.allow_remote_access = True

c.ServerApp.password = 'PASSWORD_HASH'

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

방화벽에서 포트 8888을 엽니다.

$ sudo firewall-cmd --add-port=8888/tcp --permanent
$ sudo firewall-cmd --reload

JupyterLab 서버를 실행합니다. --ip 0.0.0.0 매개변수를 사용하면 localhost뿐만 아니라 모든 IP 주소를 수신할 수 있습니다.

$ jupyter lab --ip 0.0.0.0

위의 명령은 우리가 연 기본 포트 8888에서 JupyterLab 서버를 생성합니다. 브라우저에서 URL http://:8888/을 실행하면 다음 화면이 표시됩니다.

비밀번호를 입력하고 로그인 버튼을 클릭하여 JupyterLab 인터페이스를 엽니다.

이제 액세스가 확인되었으므로 Ctrl + C를 눌러 서버를 중지하고 중지하라는 메시지가 표시되면 y를 입력합니다.

5단계 - JupyterLab 서비스 파일 생성

가상 환경을 종료합니다.

(jupyterlab_env) $ deactivate

JupyterLab에 대한 새 서비스 파일을 만듭니다.

$ sudo nano /lib/systemd/system/jupyterlab.service

다음 코드를 붙여넣습니다.

[Unit]
Description=JupyterLab Server

[Service]
User=USER
Group=USER
Type=simple
WorkingDirectory=/home/USER/jupyterlab
ExecStart=/home/USER/jupyterlab/jupyterlab_env/bin/jupyter-lab --config=/home/USER/.jupyter/jupyter_lab_config.py
StandardOutput=null
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

USER를 시스템에 현재 로그인한 사용자로 바꿉니다.

JupyterLab 서비스를 초기화합니다.

$ sudo systemctl daemon-reload

JupyterLab 서비스를 활성화하고 시작합니다.

$ sudo systemctl enable jupyterlab --now

서비스 상태를 확인합니다.

$ sudo systemctl status jupyterlab
? jupyterlab.service - JupyterLab Server
     Loaded: loaded (/usr/lib/systemd/system/jupyterlab.service; disabled; vendor preset: disabled)
     Active: active (running) since Tue 2022-12-13 11:45:26 UTC; 5s ago
   Main PID: 151675 (jupyter-lab)
      Tasks: 1 (limit: 5911)
     Memory: 59.0M
        CPU: 1.943s
     CGroup: /system.slice/jupyterlab.service
             ??151675 /home/navjot/jupyterlab/jupyterlab_env/bin/python3 /home/navjot/jupyterlab/jupyterlab_env/bin/jupyter-lab --config=/home/navjot/.jupyter/jupyter_lab_config.py

Dec 13 11:45:26 jupyter.example.com systemd[1]: Started JupyterLab Server.

6단계 - SSL 설치

계속하기 전에 도메인에 대한 Certbot 도구와 SSL 인증서를 설치해야 합니다.

Certbot을 설치하기 위해 Snapd 패키지 설치 프로그램을 사용합니다. Snapd는 항상 안정적인 최신 버전의 Certbot을 제공하므로 이를 사용해야 합니다.

Snapd 도구가 작동하려면 Epel 저장소가 필요합니다.

$ sudo dnf install epel-release -y

Snapd를 사용하여 Certbot을 설치합니다. 스냅드를 설치합니다.

$ sudo dnf install snapd -y

Snap 서비스를 활성화하고 시작합니다.

$ sudo systemctl enable snapd.socket --now

Snapd가 작동하는 데 필요한 링크를 만듭니다.

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

snapd 버전이 최신인지 확인하십시오.

$ sudo snap install core 
$ sudo snap refresh core

Certbot을 설치합니다.

$ sudo snap install --classic certbot

다음 명령을 사용하여 /usr/bin 디렉토리에 대한 심볼릭 링크를 생성하여 Certbot 명령을 실행할 수 있는지 확인하십시오.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

SSL 인증서를 생성합니다.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d jupyterlab.example.com

위의 명령은 서버의 /etc/letsencrypt/live/jupyterlab.example.com 디렉토리에 인증서를 다운로드합니다.

Diffie-Hellman 그룹 인증서를 생성합니다.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

SSL 갱신이 제대로 작동하는지 확인하려면 프로세스를 테스트 실행하십시오.

$ sudo certbot renew --dry-run

오류가 표시되지 않으면 모든 설정이 완료된 것입니다. 인증서가 자동으로 갱신됩니다.

7단계 - Nginx 구성

편집을 위해 /etc/nginx/conf.d/jupyterlab.conf 파일을 만들고 엽니다.

$ sudo nano /etc/nginx/conf.d/jupyterlab.conf

jupyterlab.conf 파일에 다음 코드를 붙여넣습니다. jupyterlab.example.com의 모든 인스턴스를 도메인으로 바꿉니다.

## enforce HTTPS
server {
  listen 80;
  listen [::]:80;
  server_name jupyterlab.example.com;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name jupyterlab.example.com;

  access_log /var/log/nginx/jupyterlab.access.log;
  error_log /var/log/nginx/jupyterlab.error.log;
  client_max_body_size 20m;

  http2_push_preload on; # Enable HTTP/2 Server Push

  ssl_certificate     /etc/letsencrypt/live/jupyterlab.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/jupyterlab.example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/jupyterlab.example.com/chain.pem;
  ssl_session_timeout 1d;

  # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
  ssl_protocols TLSv1.2 TLSv1.3;

  # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
  # prevent replay attacks.
  #
  # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
  ssl_early_data on;

  ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
  ssl_prefer_server_ciphers on;
  ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;

  # OCSP Stapling ---
  # fetch OCSP records from URL in ssl_certificate and cache them
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;

  add_header X-Early-Data $tls1_3_early_data;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header X-Scheme $scheme;
    proxy_buffering off;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8888;
  }
}

# This block is useful for debugging TLS v1.3. Please feel free to remove this
# and use the `$ssl_early_data` variable exposed by NGINX directly should you
# wish to do so.
map $ssl_early_data $tls1_3_early_data {
  "~." $ssl_early_data;
  default "";
}
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

위의 구성은 모든 HTTP 요청을 HTTPS로 리디렉션하고 JupyterLab 서비스가 도메인을 통해 서비스를 제공하도록 프록시 역할을 합니다.

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

편집을 위해 /etc/nginx/nginx.conf 파일을 엽니다.

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.

server_names_hash_bucket_size  64;

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

Nginx 구성을 확인합니다.

$ sudo nginx -t

오류가 표시되지 않으면 잘 진행된 것입니다. Nginx 서버를 다시 로드합니다.

$ sudo systemctl reload nginx

이제 브라우저에서 URL https://jupyterlab.example.com을 방문하여 JupyterLab에 액세스할 수 있습니다.

결론

이것으로 Rocky Linux 9 서버에 JupyterLab을 설치 및 구성하고 Nginx 프록시 서버를 사용하여 제공하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.