기타 프로그래밍

 개인정보보호법의 안전성 확보 조치에 따라 국.공립 사립대학은 웹서비스에 SSL 인증서 도입이 의무화되어 있다. 우리학교에서도 이에 따라 행정전자서명인증센터로부터 발급받은 SSL 인증서를 웹서버에 적용하고 있는데, 최근 Node.js 기반으로 개발된 웹서비스에 적용이 필요해졌다. 일명 G-SSL이라고도 하는 행정안전부 보안서버인증서(GPKI)는 싱글 도메인, 와일드카드(*) 도메인, 멀티 도메인을 지원하며 Apache HTTPd용과 IIS용, Tomcat용 포맷을 별도로 지원하고 있다.

 여담으로 G-SSL 인증서는 최신 웹브라우저와 모바일용 브라우저를 지원하지 못하는 등 문제가 많아서 행정망 업무시스템으로 발급을 제한하였다. 2019년 6뤌 이후부터 대학은 발급대상에서 제외되었으며 기존 발급된 인증서의 유효기간 만료일까지만 사용이 가능하도록 해서 민간 SSL 인증서로 전환을 강제하고 있다.

 G-SSL 인증서는 2015년에 웹트러스트 국제인증을 획득하여, 최상위(Root) CA 역할을 하는 행정안전부 보안서버인증(GPKI)과 하위(sub) CA 기관인 교육부 보안서버인증(EPKI)을 통해 대학기관의 인증을 처리하는 구조이다. 그렇기 때문에 G-SSL 인증서의 경우 인증서 소유자(대학)로부터 트러스트의 체인이 시작되는 Root CA까지 인증 경로라고도 하는 인증서 체인을 위해 Root CA 행정안전부(GPKI) 인증서 및 교육부 CA (EPKI) 인증서를 모두 등록해야 한다.

 위의 2가지 인증서는 대학의 경우 교육부 행정전자서명인증센터 자료실을 통해 내려받으면 된다.

 Node.js는 http 대신 https 클래스를 이용하며, 실제 서비스에서는 비동기 구현이 필요하겠으나, 인증서 체인의 동작만 확인할 목적이므로 간단히 동기방식으로 코드를 작성했다.

프로그램 소스 코드와 같이 구문 강조(code highlight) 기능이 필요한 코드를 블로그에 포함(embeded)시키기 위해서는 페이스트빈(pastebin)이라는 서비스가 필요하다. 물론 티스토리나 네이버의 경우 자체 편집기에 프로그램 소스 등을 포함시키기 위한 별도의 기능을 제공하고 있다. 특히 티스토리의 경우 SyntaxHightlight 플로그인을 추가하면 좀 더 다양한 구문 강조 기능을 사용할 수 있다.

대표적인 페이스트빈 서비스로는 자바스크립트 기반의 SyntaxHighlighter가 있으며, 이 밖에도 'code highlight'나 'syntax highlight'라는 검색어로 구글링해보면 다양한 프로그래밍 언어로 구현된 온라인 서비스와 SyntaxHighlight와 같이 블로그 소스내에 끼워 넣을 수 있는 소스로 제공되는 페이스트빈 서비스를 찾을 수 있다.

여기서는 깃허브에서 제공하는 페이스빈 서비스인 Gist를 이용하여 블로그에 소스 코드를 포함시키는 방법을 알아보겠다.

우선 깃허브를 가입하고 계정을 생성한다. 그리고 Gist로 접속하여 파일을 생성하면 끝!

https://gist.github.com

먼저 확장자를 포함한 파일 이름를 입력한다.

본문에 소스를 입력한 뒤에 gist를 생성한다.

이때 secret과 public을 구분하여 만들 수 있는데 public은 외부의 검색을 허용한다는 정도만 이해하면 된다. Github의 private와 public 저장소의 차이와 비슷.

우측 상단에 끼워넣기(embed)를 위한 복사 기능이 있으므로 복사한 후 블로그 소스에 <script> 블럭을 붙여넣기 하면 완료.

참고로 이 기능은 HTML 코드 편집을 지원하는 블로그에만 가능하며 HTML 코드 편집을 지원하지 않을 경우 Color Scripter와 같은 온라인 페이스트빈 서비스를 이용하면 된다.

Raspberry Pi 모니터링

 Grafana는 오픈소스 기반의 강력한 대시보드 플랫폼이다. 서버나 임베디드 장비의 운영상태 등을 Prometheus, ElasticSearch와 같은 data source를 플러그인 방식으로 연결해서 다양한 그래픽 요소로 나타낸다.

 여기서는 대표적인 오픈소스 모니터링 솔루션인 Prometheus를 이용하여 요즘 메이커들 사이에 사물인터넷의 주요 디바이스로 자리매김하고 있는 라즈베리 파이의 운영상태를 모니터링 해보기로 하겠다.

Raspberry Pi 3 B+

 라즈베리 파이는 영국의 라즈베리 파이 재단에서 학교와 개발도상국에서의 기초 컴퓨터 과학 교육 증진을 목표로 제작한 초소형 PC이다. 메인보드에 내장된 GPIO핀을 이용하여 다양한 센서모듈을 조합하여 메이커들에게는 사물인터넷의 핵심 기기로 각광받고 있다.

 서버나 사물인터넷 허브와 같이 중단없이 장시간 운영되는 장비의 경우 안정적인 운영을 위해 실시간 서비스 모니터링이 필수적인데, Prometheus를 이용하면 다양한 정보를 수집하여 로그를 저장하고 이를 Grafana와 연동하여 세련된 그래픽 환경으로 운영이 가능하다. 게다가 오픈소스로 제공되기 때문에 설치와 운영 등 기술 비용(!)을 제외하면 소프트웨어 라이선스 비용은 무료이다. (제발, 소프트웨어 라이선스가 무료라고 모든게 공짜라는 생각은 버리자!)

Prometheus Architecture

 Prometheus는 그림과 같이 Prometheus 서버가 외부의 export node들로부터 metric을 pulling 방식으로 수집하고, 이를 Grafaana 등을 이용해 시각화한다. 구조는 좀 복잡해 보이지만 이 글에서 구현해 볼 모니터링 툴을 간단히 설명하면,

1. node exporter - 모니터링할 기기의 메트릭(정보)을 제공
2. prometheus - 노드들로부터 수집한 메트릭을 집계하거나 후처리
3. Grafana - prometheus가 집계한 데이터를 시각화

 이렇게 3가지 서비스를 설치하면된다. 3가지 서비스는 모두 HTTP 프로토콜을 사용하므로 개별 장비에서 별도로 운영해도 되고 한 장비에서 운영해도 된다. 실제 운영환경에서는 모니터링 할 개별 장비에는 node exproter 서비스를 설치하고, 모니터링 서비스를 제공할 서버에 prometheus와 grafana를 설치해서 운영하게 될 것이다.

설치 준비.
최신 버전의 Raspberian이 설치된 라즈베리 파이(이 글에서 사용한 라즈베리 파이는 NOOBS 3.2.0을 이용하여  Raspberry Pi 3 B+에 설치함)


node exporter 설치하기

배포 : https://github.com/prometheus/node_exporter/

 

prometheus/node_exporter

Exporter for machine metrics. Contribute to prometheus/node_exporter development by creating an account on GitHub.

github.com

1. 설치하기

현재 사용 중인 라즈베리 파이 CPU 타입에 맞는 배포 파일을 내려받아 압축을 푼다. (설치 작업을 편리하게 하기위해 root 권한으로 실행할 것.)

$ sudo su -
# cat /proc/cpuinfo (ARM CPU 버전 확인)
# cd /opt
# curl -sSLO https://github.com/prometheus/node_exporter/releases/download/v0.16.0-rc.0/node_exporter-0.16.0-rc.0.linux-armv7.tar.gz
# tar zxvf node_exporter-0.16.0-rc.0.linux-armv7.tar.gz
# ln -s node_exporter-0.16.0-rc.0.linux-armv7 node_exporter ### 설치 진행의 편리를 위해 심볼릭 링크 생성

 

※ 여기서 잠깐!
 현재 설치하고 있는 라즈베리 파이 3 B+는 ARMv7 계열의 CPU를 사용하므로 armv7 이름이 들어간 배포 프로그램을 내려받는다.

 그리고 라즈베리 파이에서 일반적으로 많이 사용하는 라즈비안(Raspberian)은 데비안(Debian) 계열의 리눅스이므로 디렉터리 관리는 리눅스의 파일시스템 관례( http://www.pathname.com/fhs/pub/fhs-2.3.html)를 따르는게 좋을 것 같다. 리눅스에서는 통상 사용자가 직접 소스나 실행파일을 내려받아 설치할 경우 /opt나 /usr/local 디렉터리을 이용한다.

 관례에 따르면 /opt 디렉터리는 애드온 어플리케이션 소프트웨어 패키지의 인스톨 용도로 사용되며, /usr/local 디렉터리는 시스템 관리자가 필요에 의해 직접 컴파일하거나 설치하는 소프트웨어 인스톨 용도이다.

 curl 명령은 원격서버(FTP, HTTP 등)에서 데이터를 전송받을 때 사용한다. 여기서는 -s: 진행 상태 표시 안함, -S: -s와 함께 사용. 실패시 에러 표시, -L: 요청 페이지가 다른 위치로 옮겨졌을 경우(HTTP 응답코드 303) 재요청, -o: remote 데이터를 파일로 저장 옵션을 사용하였다.

2. SYSTEMD 파일 설치

# cd /etc/systemd/system/
# curl -sSLo - https://raw.githubusercontent.com/prometheus/node_exporter/master/examples/systemd/node_exporter.service \
 |sed -e 's|/etc/sysconfig/node_exporter|/etc/default/node_exporter|' |sed -e 's/^User.*//'  > node_exporter.service
# curl -sSLo - https://raw.githubusercontent.com/prometheus/node_exporter/master/examples/systemd/sysconfig.node_exporter \
 |sed -e 's/^OPTIONS/#OPTIONS/;aOPTIONS=""' >/etc/default/node_exporter
# cp /home/pi/node_exporter-0.16.0-rc.0.linux-armv7/node_exporter /usr/sbin/node_exporter
# systemctl daemon-reload
# systemctl enable node_exporter.service
# systemctl start node_exporter.service

시스템 부팅시 자동 실행을 위해 데몬 서비스로 설치하는 과정이다.

3. Query 테스트

$ curl 127.0.0.1:9100/metrics

 제대로 설치가 되었는지 확인하기 위해 웹서비스를 호출한다. 제대로 설치가 되었다면 라즈베리 파이 시스템의 다양한 정보(metric)가 출력될 것이다.


Prometheus 설치하기

공식사이트 : https://prometheus.io/

 

Prometheus - Monitoring system & time series database

Some of our users include:

prometheus.io

배포 : https://github.com/prometheus/prometheus

 

prometheus/prometheus

The Prometheus monitoring system and time series database. - prometheus/prometheus

github.com

1. 설치하기

 현재 사용 중인 라즈베리 파이 CPU 타입에 맞는 배포 파일을 내려받아 압축을 푼다. (설치 작업을 편리하게 하기위해 root 권한으로 실행할 것.)

# cd /opt
# curl -sSLo https://github.com/prometheus/prometheus/releases/download/v2.11.1/prometheus-2.11.1.linux-armv7.tar.gz
# tar zxvf prometheus-2.11.1.linux-armv7.tar.gz
# ln -s prometheus-2.11.1.linux-armv7 prometheus

2. YAML 설정 파일 편집

# vi /opt/prometheus/prometheus.yml

'scrape_configs:'섹션을 찾아서 아래와 같이 작성한다.

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']

  - job_name: 'nodes'
    scrape_interval: 1m
    scrape_timeout: 10s
    static_configs:
    - targets: ['127.0.0.1:9100']

 Prometheus가 node_exporter를 통해 1m 단위로 metric값을 수집하도록 설정하였다. Prometheus의 설정은 'global:' 섹션에서 지정한다.

3. 서비스 실행

# cd /opt/prometheus
# nohup ./prometheus &

4. Query 테스트

$ curl http://127.0.0.1:9090/metrics

Grafana 설치하기

공식사이트 :  https://grafana.com/

 

Grafana Labs

Splunk by Grafana Labs The official Splunk premium plugin from Grafana Labs,

grafana.com

1. 설치하기

 Grafana 역시 Prometheus처럼 배포 소프트웨어를 내려받아 설치할 수 있으나 다행히 Raspbian용 배포판이 있으므로 패키지 설치 프로그램을 이용하여 손쉽게 설치가 가능하다.

 공식사이트에서 'Get Grafana' 버튼을 클릭하여 현재 사용 중인 라즈베리 파이에 맞는 배포판을 내려받는다. (ARMv7)

$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt autoremove -y
$ curl -sSLo https://dl.grafana.com/oss/release/grafana_6.2.5_armhf.deb
$ sudo dpkg -i grafana_6.2.5_armhf.deb
$ sudo apt-get upgrade -y
$ sudo systemctl daemon-reload
$ sudo systemctl enable grafana-server
$ sudo systemctl start grafana-server

2. Grafana  실행

 라즈베리 파이에서 웹브라우저를 띄우거나, 사용 중인 PC에서 웹브라우저를 띄워서 라즈베리 파이에 설정한 IP 주소를 포함한 URL 주소를 입력한다. 정상적으로 설치가 완료되었다면 아래와 같이 Grafana 로그인 화면이 표시된다.

Grafana 로그인

 디폴트 ID와 Password인 'admin'을 입력하여 로그인한다.

 「Data Sources」 메뉴를 선택하여 Prometheus를 등록한다. 

「Add data sources」 버튼을 클릭하여 「Prometheus」를 선택한다.

 다음과 같이 입력란에 값을 입력한다.

Name: Prometheus
URL: http://localhost:9090
Access: Server(default)

 Save & Test」 버튼을 클릭하여 Data source를 등록한다.

 「+」 > 「Import」 메뉴를 선택한다.

Dashboard ID: 1860을 입력하여 미리 준비된 Dashboard를 등록한다.

 드디어 설치 완료! 라즈베리 파이의 모니터링 화면을 볼 수 있다. Good luck!

티스토리에서 소스코드 표시를 위해 두어가지 Code Highlight 스크립트들을 사용했지만 테마 변경 등을 하면 매번 초기화되거나 스크립트가 제대로 동작하지 않는 경우가 발생해서 불편했다.

그런 가운데 우연히 다른 블로그에서 소스코드를 살피다가 발견한 웹서비스이다.

제작자가 남긴 로그를 보니 최초에는 ActionScript로 구현을 했다가 JavaScript로 다시 구현을 해서 웹서비스를 제공하고 있다고 한다.

Color Scripter (http://colorscripter.com)

네이버 같이 별도의 도구 설치가 막혀있는 블로그 서비스에 유용한 툴인 듯 싶다.

루비온레일즈 윈도우8에서 설치하기

파이썬을 이용하면 웹 어플리케이션의 생산성을 폭풍 향상 시킬 수 있다는 다수의 포스팅에 기운을 받아 파이썬과 장고를 이용하여 Hello, Django 를 실행해봤다. 그런데 웹 어플리케이션 생산성하면 당연 빼놓을 수 없는 것이 '레일즈'. 기왕 Hello 실행이라면 레일즈도 가능하리라 생각되어 Hello Rails 를 시도해봤다.

참고로 레일즈의 경우 생산성은 획기적이나 레일즈 프레임워크의 한계가 품질과 기능의 한계를 결정짓는 반면 파이썬의 경우는 웹 개발의 대표적인 프레임워크로 자리잡은 장고를 사용하더라도 프레임워크의 한계가 아닌 파이썬 프로그래머의 프로그래밍 능력이 한계를 결정짓는 경향이 크다고 한다. 그래서 레일즈의 경우는 기반 프로그래밍 언어인 루비보다 프레임워크인 레일즈가 더 강조되나보다. 실용성이 있는지는 모르겠지만 자바버전의 레일즈도 있으니까. 참고. Java on Railis (http://www.javaonrails.net)

이 글은 말 그대로 Hello, Rails. 이며 당연히 루비언어를 공부해 본 적이 없이 무작정 따라하기와 구글링 만으로 진행하는 것임을 밝힌다.

------------------------------------------------------------------------------

설치환경

운영체제 : Windows 8.1 Enterprise K

설치환경 : Ruby 1.9.3 + Gem 1.8.29 + Rails 4.2.0 + Sqlite3

레일즈 설치순서

1. 루비 설치

루비 인스톨러 (RubyInstaller for Windows) 에서 ruby 1.9.x 버전을 내려받아 설치한다. (2.x 버전 설치는 무의미하게 시간만 낭비하는 삽질의 길로 들어서는 길이니 절대 비추!!! 만일 성공기가 있다면 꼭 공유해 주시길;;; 여기서는 1.9.3 버전 설치)

설치시 PATH 지정 관련 옵션을 체크한다. (tcl/tk는 윈도우용 응용프로그램 개발시 필요한 것으로 알고 있음. 일단 제외하고 나머지 2개 옵션만 체크.)

2. DevKit (RubyInstaller Development Kit) 설치

루비가 설치된 폴더 아래에 'DevKit' 폴더를 만들고, 해당 폴더에 루비 인스톨러의 애드온인 DevKit (Ruby 버전에 따라 선택) 을 내려받아 설치한다.

예)

> cd \Ruby193 (※ Ruby 1.9.3 설치되 있음)

C:\Ruby193> mkdir DevKit

C:\Ruby193> cd DevKit

C:\Ruby193\DevKit>

3. 레일즈 설치

C:\Ruby193\DevKit> ruby dk.rb init

C:\Ruby193\DevKit> ruby dk.rb install

C:\Ruby193\DevKit> gem install rails

C:\Ruby193\DevKit> rails -v (레일즈 버전 확인 여기서는 4.2.0 설치)

4. 레일즈 어플리케이션 생성

C:\Ruby193\DevKit> mkdir \Rails

C:\Ruby193\DevKit> cd \Rails

C:\Rails> rails new blog (현재 폴더 아래에 blog 폴더 생성되고 필요한 파일들 자동 생성)

C:\Rails> cd blog

C:\Rails\blog> bundle install (레일즈 어플리케이션 실행에 의존적인 잼 자동 설치)

설치 중 오류 발생시 로그 확인하여 아래와 같이 RubyGems 로 해당 패키지를 설치후 bundle install 재실행.

> gem install 잼이름 -v '버전'

------------

ISSUE: debugger 1.6.8 인스톨 오류 발생

gem install debugger -v '1.6.8'

debugger 잼 설치시 다음과 같이 오류가 발생하여 더이상 진행이 불가능했다.

 Makefile:nnn: *** target pattern contains no `%'. Stop.

몇 번의 반복후 구글링하여 시행착오 끝에 StackOverFlow 사이트에서 윈도우 환경의 Ruby 1.9.3과 이전 버전에서 RubyGems 2.4.1 빌드 문제가 있으므로 1.8.29 버전으로 다운그레이드하여 진행해야 한다는 내용을 찾았다.

http://stackoverflow.com/questions/24950844/issue-with-ruby-gem-install 

>gem update --system 1.8.29

위의 명령을 실행하여 RubyGems 버전을 다운그레이드하니 debugger가 정상 설치가 되었다. 그리고 이후 번들러를 이용한 잼의 설치가 문제없이 진행이 되었다. (bundle install)

5. 데이터베이스 설정

레일즈 어플리케이션에 의존적인 잼이 모두 성공적으로 설치되었다면 Sqlite3이 설치되었을 것이다. Rails는 기본적으로 Sqlite3을 포함하고 있으며, 그외 다양한 DB들을 지원하고 있다.

C:\Rails\blog> rake db:create

6. 레일즈 어플리케이션 시작

간단하게 아래와 같이 명령을 실행한다.

C:\Rails\blog> rails server

웹서버가 자동 시작하며, 종료는 Ctrl+C.

웹브라우저로 레일즈 어플리케이션을 호출한 모습.


이상 루비와 레일즈를 설치하고 웹서버를 구동시켜 확인한 과정을 마친다. 설치 중간에 오류들이 없었다면 5분 내외로 확인이 가능할 듯 했으나, 윈도우 환경에서는 약간의 삽질은 피해갈 수 없는 듯하다. 운이 나쁘다면 스스로의 능력부족으로 위와같은 화면 확인은 물건너감 :-( 레일즈 사이트에서도 리눅스 환경을 권하고 있을 정도. 그리고 다시 한 번 강조하지만 루비 1.9 버전으로 진행할 것! 2.x 버전을 설치하는 순간 삽으로 태산을 건드렸다는 자괴감에 빠져 레일즈 공포증에 걸릴지도...

하지만 RubyGems의 버전과 의존성 문제만 로그를 보면서 해결한다면 가능할지도 모르겠다는 생각이...


참고!!!

RailsInstaller (http://railsinstaller.org) 에서 윈도우 환경에서 사용할 수 있는 루비+레일즈+SQLite 통합팩을 제공하고 있었다. 혹시나 하는 마음으로 Rails 2.1.5 + Rails 4.1 을 설치하여 사이트를 생성하였으나 rake 잼이 설치 안되는 오류에 봉착! 바로 언인스톨 후 Ruby 1.9.3 + Rails 3.2.21 로 다시 인스톨하여 사이트를 생성하니 bundler 를 이용한 설치가 진행됨. 역시 Ruby 2.x 는 상당한 구력이 필요할 듯.

+ Recent posts