02. 우분투(Ubuntu) 서버에 R + R Studio + Shiny 설치

- Step-by-step 따라하기 -


이 글은 '데이터 분석 결과를 웹에 반응형으로 시각화하기 (Ubuntu Server + R + Shiny)' 의 연속 포스트입니다.

데이터 분석 결과를 웹에 반응형으로 시각화하는 과정을 정리하고 있습니다.




R Studio 서버 설치

지난 포스트에 이어 본격적으로 우분투 서버에 R Studio를 설치해 보겠습니다.

먼저 발급받은 가상서버, VPS에 접속을 합니다.다.


#. R 설치

R Studio를 설치하기 전, 먼저 R을 설치해야 합니다.

R Studio는 R 언어의 IDE (Integrated Development Environment, 통합개발환경) 이기 때문이죠.

아래와 같이 명령어를 입력합니다.

$ sudo apt-get install r-base


-- 생략 --

Do you want to continue? [Y/n] [Y 입력 후 Enter]


처음 설치하는 것이라면, 시간이 다소 걸릴 수 있습니다.


설치가 잘 됐는지 R의 버전을 확인하는 명령을 내려봅시다.


$ R --version


R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree"

Copyright (C) 2015 The R Foundation for Statistical Computing

Platform: x86_64-pc-linux-gnu (64-bit)


R is free software and comes with ABSOLUTELY NO WARRANTY.

You are welcome to redistribute it under the terms of the

GNU General Public License versions 2 or 3.

For more information about these matters see

http://www.gnu.org/licenses/.


위와 같이 R 버전이 출력된다면 정상입니다.


#. R Studio 서버 설치

다음으로는 R Studio 서버를 설치합니다.

포스팅 시점에 64bit 최신 버전이 1.1.456 이었네요. 지금 이 글을 읽고 계신 시점에는 더 최신버전이 나왔을 수 있습니다.

https://www.rstudio.com/products/rstudio/download-server/

위 페이지 하단부에 R Studio 설치 Section 을 참조하셔서 최신 버전의 명령어를 사용하시면 좋을 것 같습니다.

$ sudo apt-get install gdebi-core

$ wget https://download2.rstudio.org/rstudio-server-1.1.456-amd64.deb

$ sudo gdebi rstudio-server-1.1.456-amd64.deb


-- 생략 --

Do you want to install the software package? [y/N] [y 입력 후 Enter]


설치가 잘 됐는지 R Studio 서버의 상태를 확인해봅시다.


rstudio-server status


rstudio-server.service - RStudio Server

   Loaded: loaded


-- 생략 --


systemd[1]: Starting RStudio Server...

systemd[1]: Started RStudio Server.


보안을 위해 내용을 생략했지만, 'Started' 이라는 문구가 있다면 정상일 것입니다.


만약 문제가 있다면, 아래 설치 점검 명령어로 추가적인 지시사항을 따르면 됩니다.

( 아무런 반응이 없으면 정상입니다. )


sudo rstudio-server verify-installation


다음으로 앞 포스팅처럼 우분투 방화벽을 잘 설정했다면,

외부에서 R Studio가 접속이 되지 않을 것입니다. 확인해봅시다.


http://<server-ip>:8787


위 URL이 웹 브라우저로 접속이 되지 않아야 좋은 상태입니다. ( <server-ip> 부분을 자신의 VPS 서버 IP 로 변경해야 합니다 )

방화벽에 R Studio가 사용하는 Port인 8787을 허용하지 않았기 때문이죠.


아래와 같이 방화벽에 8787번 포트를 허용해 봅시다.


$ sudo ufw allow 8787


다시 접속해보면 잘 되는 것을 확인할 수 있습니다.


아이디 비밀번호는 앞 포스트에서 생성한 리눅스 계정으로 접속하시면 됩니다.




Shiny 서버 설치

다음으로는 Shiny 서버를 설치하겠습니다.

먼저 아래 명령어로 R에 Shiny 패키지를 설치합니다.


$ sudo su - \

-c "R -e \"install.packages(c('shiny', 'rmarkdown'), repos='https://cran.rstudio.com/')\""


위 명령어는 R을 Root 권한으로 실행한 다음,

shiny 패키지를 rstudio repository에서 다운받아 설치하는 과정입니다.


포스팅 시점에 64bit 최신 버전이 1.5.7.907 이었네요. 지금 이 글을 읽고 계신 시점에는 더 최신버전이 나왔을 수 있습니다.

https://www.rstudio.com/products/shiny/download-server/

위 페이지 하단부에 설치 Section 을 참조하셔서 최신 버전의 명령어를 사용하시면 좋을 것 같습니다.

$ wget https://download3.rstudio.org/ubuntu-14.04/x86_64/shiny-server-1.5.7.907-amd64.deb

$ sudo gdebi shiny-server-1.5.7.907-amd64.deb


-- 생략 --

Do you want to install the software package? [y/N] [y 입력 후 Enter]


Shiny 데몬(서버)을 시작하고, 서버가 부팅될 때마다 자동으로 실행되게끔 설정합니다.

그 다음, 잘 시작됐는지 확인합니다.


$ sudo systemctl start shiny-server

$ sudo systemctl enable shiny-server


shiny-server.service - ShinyServer


-- 생략 -- Started ShinyServer.


보안을 위해 내용을 생략했지만, 'Started' 이라는 문구가 있다면 정상일 것입니다.


외부에서 Shiny를 통한 Interactive Visualization을 사용하기 위해, 필요한 3838번 포트를 허용합시다.


sudo ufw allow 3838


웹 브라우저에서 잘 접속이 되는지 확인합니다.


http://<server-ip>:3838





마치며

지금까지 우분투 서버에 R이랑 R Studio IDE, Shiny 까지 세팅을 마쳤습니다.
이제부터는 Shiny 튜토리얼을 보면서 직접 나만의 Interactive 하게 분석 결과를 시각화 해봅시다.

포스팅 내용에 오류가 있거나, 궁금한 사항 등이 있으시면 코멘트 주세요.

읽어주셔서 감사합니다.



참고 문헌

http://docs.rstudio.com/ide/server-pro

http://docs.rstudio.com/shiny-server

https://cran.r-project.org/bin/linux/ubuntu/README.html

서울 치킨집 폐업 예측 프로그램 (ver 0.10)

http://analytics.hyeongeun.com/chicken_place/

Ubuntu + R + Shiny


계속 공부로 진행하는 프로젝트입니다. 아직은 재미로만! 봐주세요 ^^

추후 만든 과정을 정리할 생각입니다..




01. 가상서버 호스팅(VPS) 및 우분투(Ubuntu) 서버 준비

- 서비스 신청과 기본적인 보안 설정, 한글 등 -


이 글은 '데이터 분석 결과를 웹에 반응형으로 시각화하기 (Ubuntu Server + R + Shiny)' 의 연속 포스트입니다.

데이터 분석 결과를 웹에 반응형으로 시각화하는 과정을 정리하고 있습니다.




서버가 필요한 이유

포스팅의 최종 목표인 R과 Shiny로 반응형 시각화 결과를 웹에 올려 사람들과 공유하려면,

홈페이지를 구동하기 위한 웹호스팅 서비스가 아닌 '직접 프로그램(ex : 데몬)을 돌릴 수 있는 서버'가 필요합니다.


이런 서버 관련 서비스 중 VPS를 선택한 이유는 뭐니뭐니해도 '저렴'하고 '간편'하기 때문입니다.

고가의 장비를 구하는 비용이나 회선료를 여러 사람과 나눠 부담한다고 생각하시면 편할 것 같습니다.

기본적인 유지보수와 기술지원도 업체에서 해주니 상당히 편리합니다.



가상서버 호스팅(VPS)이란

가상서버 호스팅(Virtual Private Server Hosting, VPS)이란 이미 구축된 서버로부터 자원을 할당받아 사용하는 서비스입니다.

다시 말해, 서버에 필요한 물리적인 장비를 구매하거나 임대하지 않고도 독립적으로 서버를 관리하고 운영할 수 있는 상품입니다.


그림으로 쉽게 설명하자면 좌측(Physical World)과 같이 일반적인 서버 시스템은 하나의 물리적 서버에 하나의 OS와 App을 서비스하지만, (1:1)

VPS를 사용하면 우측(Virtual World)과 같이 하나의 물리적 서버에 여러 OS와 App이 자원을 나누되 독립적으로 운영하기에 경제적입니다. (n:1)


(이미지 출처 : 한국데이터통신, http://www.startit.co.kr/service/imagine.jsp)


단점도 존재합니다. VPS는 소수의 물리적인 서버를 여러 사람이 나눠쓰다 보니 불안정할 수 있습니다.

하지만 서버호스팅이나 코로케이션은 비용면에서 학습 목적으로 적합하지 않을 수 있습니다.


참고로 VPS와 비슷한 서비스가 요즘 대세(?)인 '클라우드'입니다.
클라우드는 가상서버와 달리 필요에 따라 자원 할당량(CPU/메모리/저장공간 등)을 유연하게 확장하거나 축소할 수 있다는 차이가 있습니다.



VPS 서비스 업체의 선택

가상서버 호스팅 서비스를 제공하는 다양한 회사들이 있고, 아래 링크처럼 일목요연하게 정리된 자료가 있습니다. (Lael님 블로그)

KOREA VPS 가상서버호스팅 목록 - https://laelbe.s3.amazonaws.com/blog/44/index.html 

필요에 따라 서비스 사양을 선택하시면 될 것 같습니다.


추후 필요하면 직접 홈 서버를 구축해서 포스팅할 생각입니다.



우분투 서버 준비

VPS 서비스를 신청하실 때, OS를 선택하게 됩니다.

보통 CentOS나 Ubuntu(우분투) 등의 선택지가 있습니다.

Shiny 패키지 정보들을 찾아보니, Ubuntu와 함께 기술된 Reference가 많아 우분투를 선택하였습니다.


#. VPS 서버 Root 접속

우선, Root란 윈도우 운영체제에서 관리자라고 보시면 됩니다. (가장 최상위 권한을 가지고 있는 계정)

서버에 아무런 세팅이 되어있지 않기 때문에, 우선 Root로 서버에 접속하셔야 됩니다.

뒤에서 다루겠지만, 나중에 보안을 위해 Root로의 로그인을 차단할 것입니다. (Brute-force Attack, 비밀번호 무작위 대입 공격에 대비)


서비스를 결제하시고, 세팅이 끝나면 해당 업체 사이트를 참고하시거나 고객센터를 통해 안내받아 'SSH'에 접속하시면 됩니다.

제가 사용하는 서비스 기준으로 접속 방법을 정리할까 했지만, 업체마다 서비스 방식이 다를 수 있음을 유의 바랍니다.


보통 우분투를 포함한 리눅스 서버는 'SSH' 프로토콜을 통해 접속해 운영, 관리합니다.

SSH는 무료 소프트웨어인 'Putty' 를 통해 접속할 수 있습니다.

일반적으로 윈도우 32bit 실행 파일을 사용하시면 됩니다 : https://the.earth.li/~sgtatham/putty/latest/w32/putty.exe

다른 버전은 공식 사이트(http://www.putty.org)에서 받아 사용하시면 됩니다.



Putty를 실행하시고, 'Host Name' 에는 업체로부터 발급받은 서버의 IP 주소를 적으시고, 'Port' 는 SSH 접속에 사용될 값을 적으시면 됩니다.



위와 같은 화면이 나오면 '예' 버튼을 누르시면 됩니다.



login as: 


라고 떴을 때 'root'라고 입력하시면, 아래처럼 연속으로 비밀번호 입력하라고 나옵니다.


login as: root

root@[서버 아이피]'s password: [비밀번호]


비밀번호를 입력하시고 [Enter] 키를 누르시면 위 캡처 화면처럼 접속이 됩니다.

참고로, 아무리 키보드를 두드려도 화면에 ***** 같은 글자나 반응이 안 나타납니다. (처음에 당황..)


#. 우분투 버전 확인

작성일('17.03.22) 기준 16.04가 최신의 'Long Term Support version (LTS)' 버전입니다.

안정적이면서 가장 최근에 배포된 버전이므로, 앞으로의 작업은 'Ubuntu Server 16.04'에서 이뤄질 것입니다.


여기서 하나 짚고 넘어가야 할 부분이 있습니다.


대부분의 리눅스 관련 자료들은 명령어를 입력할 부분에 '#'이나 '$'를 붙입니다.

이를 통해 독자는 '아, 명령어 입력 부분이구나!' 라고 인식하게 됩니다.


'#'은 Root 권한일 때를 의미하며, '$'은 일반 사용자인 상태를 의미합니다.


[아이디]@[서버명]:~

편의상 이 부분을 생략하고 바로 '#'이나 '$'를 적는 것이 보통입니다.


그리고, 저의 모든 포스팅에서는 진한 보라색을 직접 사용자가 입력해야 하는 부분의 표식으로 사용하겠습니다.



우선 설치된 우분투 OS의 버전을 다음 명령어로 확인해봅니다.


# lsb_release -a


No LSB modules are available.

Distributor ID: Ubuntu

Description:    Ubuntu 16.04.2 LTS

Release:         16.04

Codename:     xenial


만약 Release가 16.04 미만이면, 이 포스팅처럼 진행하다 문제가 발생할 수도 있습니다.

아래 링크를 참고해서 업데이트를 먼저 진행하시길 권장해드립니다. (do-release-upgrade 명령어로 간편하게 가능한 것 같습니다)


https://www.digitalocean.com/community/tutorials/how-to-upgrade-to-ubuntu-16-04-lts

https://help.ubuntu.com/lts/serverguide/installing-upgrading.html


아마 대다수의 VPS 업체가 최신버전의 우분투(OS)를 설치해줄 겁니다.



#. 작업용 계정 생성과 기본 보안 설정

Root는 모든 권한을 가지고 있는 계정이기 때문에 이를 직접 이용하는 건 매우 위험합니다.

보안 측면에서 큰 구멍을 하나 열어둔 것이나 마찬가지고, 관리상으로도 치명적인 실수가 발생할 수 있기 때문입니다.


가령 리눅스 시스템에서는 'rm'이 삭제 명령인데, 실수로 Root가 'rm -rf /' 라는 명령어를 내리면 최고관리자의 명령이기 때문에 군소리 없이 시스템의 모든 파일과 디렉터리를 삭제하는.. 대참사가 벌어질 수도 있습니다....

(비슷한 사례로 토이 스토리 2가 'rm *' 명령어로 전부 날아갈 뻔했다가 백업본이 있어서 겨우 살렸다는... https://youtu.be/8dhp_20j0Ys ..백업의 중요성..)


먼저, 다음과 같이 계정 생성 명령어인 'adduser'를 이용해 아이디를 만듭니다.


# adduser [사용할 아이디]


-- 생략 --


새 UNIX 암호 입력: [사용할 비밀번호]

새 UNIX 암호 재입력: [사용할 비밀번호]

passwd: password updated successfully

Changing the user information for [입력된 아이디]

Enter the new value, or press ENTER for the default

Full Name []: [엔터키 입력]

Room Number []: [엔터키 입력]

Work Phone []: [엔터키 입력]

Home Phone []: [엔터키 입력]

Other []: [엔터키 입력]

정보가 올바릅니까? [Y/n] [엔터키 입력]


가능한 비밀번호는 복잡한 것이 좋겠습니다. 영문자, 숫자, 특수문자를 포함해서 말이죠.

나머지는 필수 입력 사항이 아니므로 무시하고 엔터키를 입력했습니다.


다음으로, 방금 만든 계정이 관리자로서 작업을 수행할 수 있도록 권한을 부여해줍니다. (일반 계정은 기본적으로 관리자 권한이 없습니다.)


# usermod -aG sudo [생성한 아이디]


Putty와 같은 SSH 접속 프로그램을 하나 더 켜서 서버에 재접속합니다.

이번엔 Root가 아닌 방금 생성한 계정으로 접속합니다. (만약 접속되지 않는다면 기존에 root로 접속했던 창에서 다시 작업합니다.)


그 다음, 외부에서 Root로 바로 접근을 시도하지 못하도록 하는 등의 보안 설정을 진행합니다.


$ sudo vim /etc/ssh/sshd_config 

[sudo] password for [아이디]: [비밀번호 입력]


'sudo' 명령은 Root 권한으로 이어지는 명령을 수행하라는 뜻입니다. 이런 방식으로 관리자 권한을 부여한 계정에서 서버를 관리할 수 있습니다.

'vim' 명령은 윈도우의 메모장과 같은 프로그램으로 이어지는 경로의 파일을 수정하겠다는 의미입니다.


위 명령을 수행하면 편집 창이 나타납니다. 키보드의 [Insert] 키를 눌러 수정 모드로 변경합니다. (그래야 편집이 됩니다)

그 다음, 아래에 해당하는 부분을 찾아 값을 변경합니다. 다른 문구들은 손대지 않습니다.


# 로그인을 기다리는 시간(초). 로그인 시도 중 설정한 시간이 지나면 자동으로 접속이 종료된다.

LoginGraceTime 10


# SSH를 통한 Root 접속 가능 여부 설정. 특별한 사유가 아니면 no로 설정하고 변경하지 않는다.

PermitRootLogin no


# SSH 접근을 허용할 계정 목록. 기재된 아이디 외에는 차단된다.

AllowUsers [생성한 아이디]


'#' 은 R 언어와 마찬가지로 주석의 기능을 합니다.

저의 경우 3가지 중 상위 두 옵션은 이미 적혀있어 뒤에 옵션만 수정했고, 마지막은 아예 없어서 새로 타이핑했습니다.


편집을 마친 후, ①키보드 [Esc] 키를 누른 다음 ②[:] 키를 누르고 (Shift + ;) ③[w] 키를 누른 후 ④[Enter] 키를 누르면 저장됩니다.

그다음, ①키보드 [Esc] 키를 누른 다음 ②[:] 키를 누르고 (Shift + ;) ③[q] 키를 누른 후 ④[Enter] 키를 누르면 편집기를 종료합니다.


다음 명령어를 입력해 SSH 서버를 재시작합니다.


$ sudo service ssh restart


다시, SSH 접속 프로그램을 하나 더 켜서 root 아이디로 접속을 시도해봅니다. 불가능해야 정상입니다.

그다음, 하나 더 켜서 생성한 아이디로 접속을 시도합니다. 가능해야 정상입니다. 만약 불가능하다면 맨 처음에 root로 접속한 창에서 다시 작업합니다.


이제 방화벽을 활성화해 서버의 보안을 강화합니다.


$ sudo ufw app list


사용 가능한 프로그램:

  Apache

  Apache Full

  Apache Secure

  OpenSSH


제가 사용하는 업체의 경우 Apache와 OpenSSH가 등록 가능한 규칙으로 설정돼 있네요.

우선 가장 기본적으로 서버 관리에 필요한 SSH를 허용합시다.


$ sudo ufw allow OpenSSH


그 다음으로 SSH 접속에 무작위 대입 공격(Brute-force Attack) 방어 규칙을 다음과 같이 적용합니다.


$ sudo ufw limit ssh


이제 방화벽 설정을 마쳤으니, 다음과 같이 방화벽을 활성화함으로써 허용된 서비스 외에는 차단해 보안을 강화합니다.


$ sudo ufw enable


방화벽이 제대로 동작하는지 확인합니다.


$ sudo ufw status


상태: 활성



목적                         동작          출발

--                         --          --

22                         LIMIT       Anywhere                      

22 (v6)                    LIMIT       Anywhere (v6)


SSH는 기본적으로 22번 포트를 사용합니다. 위 결과와 같이 나온다면 제대로 설정이 된 것입니다.



#. 우분투 한글 Locale 설치하기

향후에 R에서 한글 지원이 잘 되도록 우분투에 한글 Locale 을 설치하겠습니다.

먼저, 내 서버의 Locale이 어떤지 확인해 봅시다.


locale


LANG=en_US.UTF-8

LANGUAGE=en_US.UTF-8

LC_CTYPE="en_US.UTF-8"

LC_NUMERIC="en_US.UTF-8"

LC_TIME="en_US.UTF-8"

LC_COLLATE="en_US.UTF-8"

LC_MONETARY="en_US.UTF-8"

LC_MESSAGES="en_US.UTF-8"

LC_PAPER="en_US.UTF-8"

LC_NAME="en_US.UTF-8"

LC_ADDRESS="en_US.UTF-8"

LC_TELEPHONE="en_US.UTF-8"

LC_MEASUREMENT="en_US.UTF-8"

LC_IDENTIFICATION="en_US.UTF-8"

LC_ALL=en_US.UTF-8


위처럼 영문이 기본적으로 설치, 설정되어 있음을 알 수 있습니다.

아래와 같이 한글 패키지를 설치합니다.


$ sudo apt-get install language-pack-ko


-- 생략 --

Do you want to continue? [Y/n] [Y 입력 후 Enter]


그 다음, 한글 Locale을 생성합니다.


$ sudo locale-gen ko_KR.UTF-8


Generating locales (this might take a while)...

  ko_KR.UTF-8... done

Generation complete.




마치며

기본적인 우분투 서버 세팅을 마쳤습니다.
이제 전 세계의 모든 사람이 인터넷으로 내 서버에 접근할 수 있게 된 것입니다. (아직 아무것도 없지만)

다음 과정은 여기에 R 서버를 설치해보겠습니다.

사실, SSH 접속에 Public Key Authentication을 사용하고 비밀번호를 통한 접근을 차단하는 추가적인 보안 강화 방안도 있습니다.
아래 참고 문헌 가장 첫 번째 링크를 참고하시면 설정하실 수 있습니다.


포스팅 내용에 오류가 있거나, 궁금한 사항 등이 있으시면 코멘트 주세요.

읽어주셔서 감사합니다.



참고 문헌

https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04

https://help.ubuntu.com/community/CheckingYourUbuntuVersion

https://namu.wiki/w/rm%20-rf%20/#s-4

데이터 분석 결과를 웹에 반응형으로 시각화하기

- Ubuntu Server와 R, Shiny 패키지 -


포스팅을 시작하며

데이터 분석 결과를 웹에 반응형으로 시각화하는 과정을 정리해보려 합니다.


통계학을 전공하면(학교 커리큘럼마다 조금씩 다를 수 있으나) 일반적으로 교과서에 있는 예제 데이터에서 시작해 공공데이터, 오픈 데이터, 직접 수집한 데이터, 분석 공모전이나 대회의 데이터까지 다양한 분석 프로젝트를 수행하게 됩니다.

그런데 그렇게 고생한 프로젝트를 리포트로 제출하거나, 발표 PT가 끝나면 말 그대로 끝나버리는.. 아쉬움이 항상 있었습니다.


'우리끼리 고생했다, 잘했다, 이거는 이렇게 해보면 좋았을 것 같다'로 머물지 말고,

분석 결과를 외부와 공유하고 피드백을 주고받을 수는 없을까?


여러 가지로 알아보니 R과 Shiny 패키지를 이용해 웹에 반응형으로 시각화하면 재밌을 것 같았습니다.

아래 예제처럼 말이죠. (매우 어려울 것 같지만..)



https://shiny.rstudio.com/gallery/superzip-example.html


저와 같이 통계학 전공자거나 데이터 분석에 관심이 있다면, 이런 멋진 일을 한 번쯤은 상상해보셨을 겁니다.


이를 위해서는 사람들이 외부에서 물리적으로 접근 가능한 '서버'를 구축해야 합니다.

그리고 분석 결과를 RStudio의 Shiny 패키지로 시각화할 줄 알아야겠지요.


서버나 웹 프로그래밍 등은 전공분야가 아니라서 '도전적인' 일이 될 것 같습니다.


+ Recent posts