Anaconda가 설치되어있다는 가정 하에 Jupyterlab를 설치한다.
Jupyter Lab은 Jupyter notebook을 개선한 것이기 때문에 둘의 설정 방법은 동일하다.
실행할 때만 jupyter notebook으로 할지, jupyter lab으로 할지만 바꾸면 된다.
jupyterlab 대신 jupyter hub를 설치하려는 경우 다음 포스팅을 참고하면 된다.
1. jupyterlab 설치
참고로 Anaconda에는 Jupyter Notebook이 이미 설치되어있다.
jupyterlab을 사용할 경우 아래 커맨드를 통해 해당 패키지를 설치한다.
$ conda install jupyterlab
2. 비밀번호 설정
>>> from notebook.auth import passwd >>> passwd() Enter password: Verify password: 'sha1:<암호화된 비밀번호>'
이제 config 파일을 생성한 후 암호화된 비밀번호를 넣어주면 된다.
$ jupyter notebook --generate-config $ vi ~/.jupyter/jupyter_notebook_config.py # In vi editor # Password to use for web authentication c = get_config() c.NotebookApp.password = u'sha1:<암호화된 비밀번호>'
Jupyter notebook이나 lab을 백그라운드에서 실행하기 위해서는 백그라운드로 프로세스를 실행한 후 nohup으로 프로세스를 데몬화하면 된다.
IP나 포트를 지정하고 싶다면 아래의 커맨드에 적당히 채워주면 된다.
$ nohup jupyter notebook --no-browser > jupyter.log & or $ nohup jupyter notebook --ip=xxx.xxx.xxx.xxx --port=xxxx --no-browser > jupyter.log &
이 경우 Jupyter를 종료하고 싶으면 ps와 grep을 사용하여 프로세스를 직접 종료해야 한다.
$ ps -eaux | grep jupyter $ kill <프로세스 ID>
3. Jupyter Script
위에서 소개한 Jupyter의 실행과 종료를 스크립트화할 수 있다.
실행중인 파이썬을 모두 종료하도록 작성했는데, 적당히 수정해서 쓰면 된다.
#!/usr/bin/zsh PYTHONPATH="/usr/anaconda3/bin/python3" # Argument Validation if [ $# -ne 1 ]; then echo "Run with the correct command: <run|kill|restart>" exit fi if [ "$1" != "run" -a "$1" != "kill" -a "$1" != "restart" ]; then echo "Run with the correct command: <run|kill|restart>" exit fi # Run Jupyter Lab if [ "$1" = "run" ]; then nohup jupyter lab --ip=1.1.1.1 --port=1111 --no-browser > jupyter.log & exit fi # Kill Jupyter Lab if [ "$1" = "kill" ]; then # kill $(ps eaux | grep jupyter | awk '{print $2}' | sed -n '1p') killall -s SIGTERM $PYTHONPATH exit fi # Restart Jupyter Lab if [ "$1" = "restart" ]; then killall -s SIGTERM $PYTHONPATH && nohup jupyter lab --ip=1.1.1.1 --port=1111 --no-browser > jupyter.log & exit fi
다음의 방법으로 Jupyter를 백그라운드에서 실행하고 종료할 수 있다.
물론 스크립트기 때문에 첫 실행 전에 chmod +x jupyter.sh를 실행해주어야 한다.
$ ./jupyter.sh run $ ./jupyter.sh kill $ ./jupyter.sh restart
4. Jupyter Service
서비스를 사용할 수 있는 환경이라면 위의 스크립트보다 서비스를 사용하는 것이 훨씬 편하다.
Centos7 기준으로 다음과 같이 jupyter.service를 작성한다. (<> 안의 내용은 알맞게 수정해주면 된다)
서비스는 상대경로(소프트링크)를 사용할 수 없기 때문에 which jupyter를 통해 Jupyter 바이너리 경로를 찾아 입력해야 한다.
(예시1: /home/hooni/anaconda3/bin/jupyter)
(예시2: /home/hooni/.conda/envs/my-environment/bin/jupyter)
참고로 필자는 사용자 수준에서 service를 운영할 것이기에
~/.config/systemd/user 안에 service를 작성하였다.
[Unit] Description=Jupyter Notebook for hooni After=multi-user.target [Service] Type=simple ExecStart=<Jupyter경로> lab --ip=<IP주소> --port=<Port번호> --no-browser Restart=always RestartSec=5 ExecStop=/bin/kill $MAINPID [Install] WantedBy=multi-user.target
서비스를 만들 때 중요한 점은 서비스를 실행하기 전 ExecStart 구문이 잘 동작하는지 쉘에서 먼저 실행해보는 것이다.
아래는 서비스 동작 코드이다.
$ sudo systemctl --user daemon-reload # Service 동기화 (~/.config/systemd/user에 위치한 service들로부터 동기화) $ sudo systemctl --user enable jupyter # Jupyter 부팅 시 자동실행 $ sudo systemctl --user start jupyter # Jupyter 실행 $ sudo systemctl --user stop jupyter # Jupyter 종료
아래 게시글이 더 자세한 이해에 도움이 될 것이다.
- User-level systemd service 등록 – hooni’s playground
cf. 방화벽
방화벽이 닫혀있는 경우 당연히 외부에서 서비스에 접근할 수 없다.
예를 들어 Ubuntu의 경우 다음과 같이 (필자의 Jupyter 포트는 1111이다)
$ sudo ufw allow 1111/tcp $ sudo ufw reload
CentOS의 경우 다음과 같이 방화벽을 해제할 수 있다.
$ sudo firewall-cmd --permanent --zone=public --add-port=1111/tcp $ sudo firewall-cmd --reload
cf. environment 적용
참고로 conda에서 생성한 environment를 jupyter에 연결하고 싶을 경우 아래처럼 별도의 설정이 필요하다.
$ conda activate my-environment $ conda install ipykernel $ python -m ipykernel install --user --name=my-environment
cf. HAProxy 적용
일반적인 HAProxy 설정 방법을 사용한다.
예를 들어 필자는 DNS에서 jupyter.abc.com의 CNAME을 abc.com으로 등록한 후, jupyter.abc.com으로 온 80 요청을 abc.com의 1111포트로 포워딩하였다.
아래는 이에 대한 haproxy.cfg 예시이다.
frontend http mode http bind :80 acl is_jupyter hdr_end(host) -i jupyter.abc.com use_backend jupyter if is_jupyter default_backend deny # Backend backend deny mode http http-request deny deny_status 503 backend jupyter mode http server jupyter 1.2.3.4:1111