JupyterLab 설치 · 6 min read · Oct 21, 2025
Rocky Linux 9에서 JupyterLab 환경 설치 및 구성 방법

JupyterLab은 Project Jupyter를 위한 차세대 웹 기반 개발 환경입니다. Project Jupyter는 여러 프로그래밍 언어에서 대화형 컴퓨팅을 위한 오픈 소스, 오픈 표준 및 서비스를 개발하는 것을 목표로 개발되었습니다. JupyterLab은 개발자가 Jupyter 노트북, 텍스트 편집기, 터미널 및 사용자 정의 구성 요소와 같은 문서 및 활동을 유연하고 통합된 방식으로 작업할 수 있도록 하는 유연한 인터페이스를 제공합니다. JupyterLab은 Jupyter Notebook의 차세대 버전이며 궁극적으로 이를 대체할 예정입니다. R, Python, Scala 및 Julia를 포함하여 40개 이상의 프로그래밍 언어를 지원합니다.
이 튜토리얼에서는 Rocky Linux 9 서버에 JupyterLab을 설치하고 구성하는 방법을 배웁니다.
전제 조건
- Rocky Linux 9에서 실행되는 서버.
- sudo 권한이 있는 비루트 사용자.
- 서버를 가리키는 완전한 도메인 이름(FQDN). 우리의 목적을 위해
jupyterlab.example.com을 도메인 이름으로 사용합니다. - SELinux가 비활성화되어 있습니다.
- 모든 것이 업데이트되었는지 확인하십시오.
$ sudo dnf update - 기본 유틸리티 패키지를 설치합니다. 일부는 이미 설치되어 있을 수 있습니다.
$ sudo dnf install wget curl nano unzip yum-utils -y
1단계 - 방화벽 구성
첫 번째 단계는 방화벽을 구성하는 것입니다. Rocky Linux는 Firewalld 방화벽을 사용합니다. 방화벽의 상태를 확인하십시오.
$ 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 버전을 확인해 보겠습니다.
$ 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://를 열면 다음 화면이 표시됩니다.

비밀번호를 입력하고 로그인 버튼을 클릭하여 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을 설치합니다. Snapd를 설치합니다.
$ 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
다음 명령을 사용하여 Certbot 명령이 /usr/bin 디렉토리에서 실행될 수 있도록 심볼릭 링크를 생성합니다.
$ 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 [email protected] -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의 모든 인스턴스를 도메인으로 교체합니다.
## 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; # HTTP/2 서버 푸시 활성화
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;
# TLS 버전 활성화 (TLSv1.3는 다가오는 HTTP/3 QUIC에 필요).
ssl_protocols TLSv1.2 TLSv1.3;
# TLSv1.3의 0-RTT 활성화. 리버스 프록시를 사용할 때 재전송 공격을 방지하기 위해 $ssl_early_data를 사용하십시오.
#
# @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 스테이플링 ---
# ssl_certificate의 URL에서 OCSP 레코드를 가져와 캐시합니다.
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;
}
}
# 이 블록은 TLS v1.3 디버깅에 유용합니다. 원하신다면 이를 제거하고 NGINX에서 직접 노출된 `$ssl_early_data` 변수를 사용하셔도 됩니다.
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 프록시 서버를 사용하여 제공하는 튜토리얼이 마무리되었습니다. 질문이 있으시면 아래 댓글에 남겨주세요.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.