Raspberry Pi 3 64bit OS openSUSE: Nginx, Node JS, Jupyter

Raspberry Pi 3 64bit OS openSUSE 는 이글은 5개 글타래로 구성되며, openSUSE 설치, 개발도구 구성 및 서버 구축 사용에 대해 작성한다.

Opensuse 에서 Raspberry Pi 3를 위한 64bit OS openSESE Leap 42.2 을 제공하고 있다.

  1. Install 64bit openSUSE Leap 42.3 / JeOS
  2. openSUSE: Managing Service daemon
  3. openSUSE: Basic OS Security for Server
  4. Install & Configuration - Nginx, Node JS, Jupyter
  5. Build MongoDB 3.4.x

Nginx, Node JS, Jupyter Notebook

  • Raspberry Pi 3
  • openSUSE LEAP 42.2 / JeOS

Target services

  • Nginx
  • Nginx Proxy
    • www app : nodejs (PORT 50000)
    • jupyter notebook: PORT 8585
  • Node.js with nvm
  • Python and virtualenv, jupyter notebook

nginx

nginx는 1.8 버전으로 당연히 사용하던 데비안 계열과 설정 파일 구성이 조금 다르다.

  • nginx 사용자: nginx
  • /etc/nginx/nginx.conf 가 sites-_ 폴더가 아닌 vhost_ 폴더를 가르킨다.
    • 여기서는 sites-* 폴더를 그대로 사용한다.
  • 기존 데비안 계열 형식 sites-* 폴더를 사용하고 사용자먄 nginx 사용.

설치

zypper 로 nginx 배포본을 설치한다. 현재는 1.8.1-10.5.1 버전이다.

1
sudo zypper in nginx

설치하면 사용자 nginx:nginx 가 추가된다.

nginx.conf

nginx 설정은 Nginx - Install, WebDAV, Proxy on Ubuntu/Debian 에 설명되어 있다. 이 구성을 기초로 우분투/데비안 계열 같이 site-* 폴더를 구성해서 사용한다.

1
2
cd /etc/nginx
mv nginx.conf nginx.orig

nginx.conf 에 include 지시자를 사용해 sites-enabled 를 추가한다.

1
2
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

그리고 sites-available, sites-enabled 폴더를 생성하고 사이트 파일을 만든다.

1
2
3
cd /etc/nginx
sudo mkdir sites-available sites-enabled
sudo touch sites-available/my-site

my-site 가상호스트 파일은 [my-site](/2017/04/03/ubuntu-nginx#my-site) 내용의 파일을 site-available 에 작성하고, 그 링크를 site-enabled에 링크를 걸어 준다.

1
2
cd /etc/nginx
sudo -s /etc/nginx/sites-available/my-site /etc/nginx/sites-enabled/my-site


### node.js

nvm을 설치한다.

1
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash

Node.js 설치와 개발환경 설치에 대해서는 NodeJS / nvm 기반 개발환경 설치 글을 참조할 수 있다.

node.js 설치

최신 v8 버전을 설치한다.

1
2
3
> nvm install v8
Downloading and installing node v8.8.1...
Creating default alias: default -> v8 (-> v8.8.1)
1
2
> which node
/home/qkboo/.nvm/versions/node/v8.8.1/bin/node

pm2 설치

node.js 앱을 시스템 서비스로 등록하기 위해서 pm2 를 설치한다.

1
npm i -g pm2

예를 들어 express 앱이 있으면 다음 같이 pm2로 시작한다.

1
2
cd www-app
pm2 start -n "www-app" bin/www

pm2 startup

startup 시 pm2 start 로 생성되는 .pm2 디렉토리의 pid 와 app.js 파일을 실행해 준다.

pm2 startup systemd 로 스타트를 하면 2개의 프로세스가 만들어 진다.

방법은,,,

  1. 먼저 앱을 시작해 둔다.
1
pm2 start -n "www-app" bin/www
  1. dump를 생성한다.

pm2로 현재 실행중인 프로세스 정보를 save로 덤프하게 저장한다. systemd 서비스 스크립을 작성하는데 유용하다.

1
pm2 save
  1. pm2 startup 명령

pm2 startup 명령은 pm2로 실행중인 프로세스를 systemd 서비스 유니트 파일로 제어 할 수 있다. 명령을 실행하면 sudo 명령으로 실행할 수 있는 스크립을 출력해 준다.

1
2
3
$ pm2 startup systemd
...
sudo env PATH=$PATH:/home/foo/.nvm/versions/node/v8.8.1/bin /home/foo/.nvm/versions/node/v8.8.1/lib/node_modules/pm2/bin/pm2 startup systemd -u foo --hp /home/foo

이 스크립을 실행해 주면 pm2-foo.service 서비스 유니 파일이 생성된다.

1
2
Target path
/etc/systemd/system/pm2-foo.service

이 서비스 파일을 활성화하고 시작해준다.

1
systemctl enable pm2-foo

이제 시스템을 재시작해도 pm2 로 실행중인 프로세스는 자동으로 시작된다.



### Python

Python 개발 환경을 virtualenv 를 이용해서 구성하고, jupyter 를 설치한다. 그리고 시스템 시작 스크립으로 자동으로 시작하는 jupyter notebook 환경 구성까지 진행한다.

python3 설치

openSUSE에 python2.7 만 설치되어 있어서, python3 를 설치한다. 다른 버전을 설치하면 openSUSE에서는 자동으로 update-alternatives로 pip를 등록해준다.

1
2
3
sudo zypper in python3

update-alternatives: using /usr/bin/pip3.4 to provide /usr/bin/pip (pip) in auto mode

개발자 패키지 설치

jupyter 등 개발, 서버 개발에 필요한 시스템 개발도구를 설치한다.

1
sudo zypper in devel_basis

파이썬 개발과 패키지등에서 필요한 파이썬 헤더를 설치한다.

1
sudo zypper in python3-devel python-devel

jupyter에서 필요한 zmq 라이브러리를 설치한다.

1
sudo zypper in python-distutils-extra libczmq3 libgdal20
  • libzmq3 : jupyter 에서 필요
  • libgdal : geospatial analysis with geopandas.

openSUSE 에서는 curses 관련 파이썬 모듈을 설치해야 한다.

1
sudo zypper in python-curses python3-curses
  • python-curses: Python이 (N)Curses Libr에 대한 인터페이스이다

virtualenv

pip 로 user scheme 에서 설치했다.

1
pip install --user virtualenv virtualenvwrapper

Scientific 과 Pandas 개발환경

사용하려는 Python 버전에 따라 혹은 모두 아래 과학계산용 모듈을 시스템 패키지로 설치한다.

1
2
3
sudo zypper in python-decorator python-numpy python-scipy python-matplotlib
sudo zypper in python3-decorator python3-numpy python3-scipy python3-matplotlib
sudo zypper in python3-sympy python3-nose

라즈베피라이, 오드로이드 등 환경에서 pip로 위 모듈을 설치시 시간이 많이 걸린다.

pip install –user pandas decorator numpy scipy matplotlib sympy nose
그래서 시스템 패키지로 설치했다.

겨로가적으로 앞선 scipy, matplotlib 설치하며 아래 모듈이 의존성에 따라 함게 설치된다.

1
python3-requests python3-pil python3-scrapy python3-geopy python3-shapely python3-pyproj

Jupyter Notebook

Jupyter notebook 으로 파이선, typescript, javascript, c/c++ 등의 IDE 역할을 할 수 있다. 도한 Markdown 을 지원해서 문서화에도 휼륭한 플랫폼이다.

jupyter 가상환경 만들기

mkvirtualenv 명령으로 jupyter 라는 가상환경을 만드는데, 과학계산용 라이브러리를 시스템 패키지로 설치했으므로 여기서는 가상환경 생성시 시스템 패키지를 함께 참조하도록 생성한다.

1
2
mkvirtualenv -p python3 --system-site-packages jupyter
(jupyter) $

가상환경에서 파이썬 버전을 확인하고 과학계산 개발 등에 필요한 라이브러리가 설치됐는지 확인하자.

1
2
(jupyter) $ python --version
Python 3.4.6

필수 모듈이 설치되고 사용이 가능한지 확인한다. 버전 정보가 출력되면 관련 라이브러리가 제대로 설치되었고 가상환경에서 잘 접근되는 것이다. 다음 두 모듈이 없으면 jupyter 설치가 제대로 안된다.

설치가 안되었으면 앞의 파이썬 개발자 패키지 설치 단락을 확인한다.

1
2
python -c "import numpy;print(numpy.__version__)"
1.9.3
1
2
python -c "import numpy;print(numpy.__version__)"
0.16.0

그리고 Jupyter 가상환경에서 pipJupyter를 설치한다.

1
(jupyter)$ pip install jupyter

주피커 노트북 파일이 저장되는 위치가 iPython 디렉토리라고 하면 아래 같이 시작할 수 있다.

1
(jupyter)$ jupyter-notebook --no-browser --ip=* --port=8000 ./iPython

옵션은

  • --no-browser : 로컬 브라우저는 시작하지 않는다.
  • --ip : 접속 가능 *는 모든 곳에서 접근 가능
  • --port:

이런 시작 구성을 설정 파일을 이용해서 저장할 수 있고 이 파일을 이용해서 시작하는 것을 권장한다.

Jupyter 설정 파일 이용

사용자 JUPYTER_DATA_DIR 인 홈 디렉토리 밑 ~/.jupyter 에 설정 파일을 구성해야 한다.

1
2
(jupyter)$ jupyter notebook --generate-config
(jupyter)$ cd .jupyter && mv jupyter_notebook_config.py mynotebook.py

systemd

jupyter notebook을 시스템 서비스로 등록해 보자. jupyter.service라는 시스템 서비스 파일을 /etc/systemd/system/jupyter.service 에 생성하고 아래 내용을 입력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=HomePi Jupyter-Notebook

[Service]
Type=simple
PIDFile=/run/homepi-jupyter.pid
ExecStart=/home/foo/.virtualenvs/jupyter/bin/jupyter-notebook --config=/home/foo/.jupyter/mybook_config.py
User=qkboo
Group=users
WorkingDirectory=/home/foo/iPython
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

그리고 이 시스템 서비스 파이을 활성화하고 시작한다.

1
2
3
sudo systemctl enable jupyter.service
sudo systemctl daemon-reload
sudo systemctl restart jupyter.service

Typescript kernel

jupyter notebook에서 Typescript 을 작성하고 컴파일한 결과를 확인할 수 있다.

먼저 Nodejs용 itypescript 모듈을 global로 설치한다.

1
npm install -g itypescript

its 명령으로 Jupyter kenel로 설치해 준다.

1
its --ts-install=local

Jupyter-notebook Nginx 설정

Jupyter-notebook 을 nginx 뒤에서 실행시 아래 같은 동작이 반복적으로 보이이면

1
2
3
4
5
6
[I 19:26:48.843 NotebookApp] Adapting to protocol v5.1 for kernel 97e659cd-0509-4f56-878e-10e2c31803e2
[I 19:26:48.853 NotebookApp] Restoring connection for 97e659cd-0509-4f56-878e-10e2c31803e2:b4d78dff5dff4563b0e5fc7195fefca1
[I 19:26:48.881 NotebookApp] Starting buffering for 97e659cd-0509-4f56-878e-10e2c31803e2:b4d78dff5dff4563b0e5fc7195fefca1
[I 19:26:51.904 NotebookApp] Adapting to protocol v5.1 for kernel 97e659cd-0509-4f56-878e-10e2c31803e2
[W 19:26:51.930 NotebookApp] Replacing stale connection: 97e659cd-0509-4f56-878e-10e2c31803e2:b4d78dff5dff4563b0e5fc7195fefca1
[W 19:26:51.957 NotebookApp] Replacing stale connection: 97e659cd-0509-4f56-878e-10e2c31803e2:b4d78dff5dff4563b0e5fc7195fefca1

jupyter-notebook-keeps-reconnecting 설명 처럼 nginx proxy 에서 http 버전을 명시해 준다.

If you are using jupyter behind a nginx proxy, this post may be effective.

Add this line to nginx conf.

1
proxy_http_version 1.1;

http_proxy_module 에 따르면 keepalive 를 사용하기 위해서 1.1 버전을 꼭 사용해야 할 것 같다.

Sets the HTTP protocol version for proxying. By default, version 1.0 is used. Version 1.1 is recommended for use with keepalive connections and NTLM authentication.

참조용 jupyter-notebook conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
upstream my-notebook-workhorse {
server 127.0.0.1:8888 fail_timeout=0;
}

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

# let my-notebook deal with the redirection
server {
listen 80;
server_name my-notebook.wh;
server_tokens off;
root /dev/null;

# Increase this if you want to upload larger attachments
client_max_body_size 20m;

# individual nginx logs for this vhost
access_log /var/log/nginx/my-notebook_access.log;
error_log /var/log/nginx/my-notebook_error.log;

location / {
proxy_pass http://my-notebook-workhorse;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
auth_basic "Restricted Content";

# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Origin "";
proxy_read_timeout 86400;
}
}

참조

Raspberry Pi 3 64bit OS openSUSE: Nginx, Node JS, Jupyter

https://blog.thinkbee.kr/opensuse-jeos-nginxjupyter-de42d79d18f3/

Author

Gangtai Goh

Posted on

2017-10-21

Updated on

2023-08-08

Licensed under

댓글