[AWS] EC2를 이용한 Node.js 웹소켓 서버 구축하기

류명운

·

2016. 8. 27. 18:52

반응형

[AWS] EC2를 이용한 Node.js 웹소켓 서버 구축하기


들어가기에 앞서

  • 목표 : 명우니닷컴(http://myeonguni.com) 에서 배경단에서 실시간 그림판을 제공하기 위해 필요한 웹서버를 AWS의 EC2 서비스를 이용하여 구축해보도록 하겠습니다.

  • AWS(Amazon Web Services) : 웹 서비스 호스팅, 원격 컴퓨팅 서비스를 제공하는 기업

  • EC2 : Elastic Computur Cloud의 줄임말로 AWS에서 제공하는 독립적인 서비스로, 다양한 운영체제의 한대의 독립된 컴퓨터를 제공


목차

  • 1. AWS console
  • 2. EC2 인스턴스 생성하기
  • 3. 인스턴스 접속
  • 4. 웹 서버환경 구축(nodejs, npm modules 설치)
  • 5. Server / Client 소스코드 작성 및 테스트


1. AWS console

래 AWS console URL에 접속하여 회원가입 혹은 로그인을 한다.

https://console.aws.amazon.com/console/home


2. EC2 인스턴스 생성하기

* Instance : 컴퓨터 하나를 인스턴스라고 한다. 예를들어 인스턴스 4개를 만든다는 표현은 4개의 컴퓨터를 AWS 인프라 위에 생성한다는 뜻이 된다.

상단 Services 카테고리의 EC2를 클릭


Launch Instance 클릭


Step 1: Choose an Amazon Machine Image (AMI)

* 생성할 컴퓨터의 운영체제 선택, 본 포스팅에서는 Ubuntu Server를 사용할 것이기에 해당 OS의 [Select] 버튼 클릭


Step 2: Choose an Instance Type

* [Free tier eligible] 체크, [Next: Configure Instance Details] 클릭


▶ [Step 3: Configure Instance], [Step 4: Add Storage], [Step 5: Tag Instance]

* 그냥 "아 이런게 있구나~~" 하고 기본 설정 냅두고 [Next: ....] 클릭


Step 6: Configure Security Group

* 이번 단계에서 보안 설정을 해주어야 한다([Add Rule]을 사용하면 추가가 가능).

* 웹 서버를 사용할 것이니 HTTP, HTTPS는 기본적으로 추가해주고 여기에 nodejs에서 사용할 웹소켓 포트(Custom TCP Rule)를 추가해준다.

* Source 부분은 해당 포트에 허용가능한 사용자를 설정하는 것이다. Anywhere로 설정해준다.

* 설정이 완료되었으면 [Review and Launch] 클릭


Step 7: Review Instance Launch

* 셋팅된 Instance에 대해 확인해보고 [Launch] 클릭하여 실제 Instance를 생성


 해당 인스턴스에 접근하기 위한 키 생성

* [Create a new key pair] 선택 → [Key pair name] 입력 → 해당 키 다운로드 [Download Key Pair] 클릭

* 생성된 해당 키 파일은 여태 우리가 만든 UbuntuServer에 SSH 접속하기 위해 꼭 필요하므로 잘 관리해야 한다.

* [Launch Instances] 클릭


 생성된 인스턴스에 대한 상태정보. [View Instances] 클릭


인스턴스 리스트 목록에서 방금 생성한 인스턴스를 클릭하면 위 그림과 같이 설정 정보를 볼 수 있다.



3. 인스턴스 접속

인스턴스에 접속 할 때는 SSH 라는 방법을 이용한다.

* SSH : Secure Sell의 약자로 원격지에 있는 컴퓨터를 안전하게 제어하기 위한 프로토콜 또는 이 프로토콜을 사용하는 프로그램들을 의미한다. SSH 클라이언트와 SSH 서버의 관계로 상호작용하면서 SSH 서버가 설치된 운영체제를 제어한다. 클라이언트와 서버 사이에는 강력한 암호화 방법을 통해서 연결되어 있기 때문에 데이터를 중간에서 가로채도 해석 할 수 없는 암호화된 문자만이 노출된다.

인스턴스에 접속하기 위해서는 우선 인스턴스에 접근 할 수 있는 URL을 알아야 하고, 두번째로는 인스턴스를 제어할 수 있는 클라이언트가 필요하다. SSH는 원격에 있는 컴퓨터를 제어하는 프로그램 혹은 통신방법인데, 리눅스나 맥에는 내장되어 있고, 윈도우에서는 따로 설치를 해야 한다.


자 그럼, SSH를 이용하여 인스턴스에 접속하는 방법을 알아보자.


우선 방금 생성한 인스턴스를 선택하고 오른쪽 클릭을 해서 [Connect] 항목을 선택한다.


[A standalone SSH client] 항목에 체크가 되어있으면 Public DNS의 항목이 있는데 이 값이 인스턴스에 접근할 수 있는 URL이다. 이 정보를 바탕으로 인스턴스에 접속해보도록 하겠다. 해당 값은 복사해두도록 한다.


윈도우에서 SSH을 사용하기 위해 여러 프로그램이 제공된다. putty, Xshell 등이 이에 해당하는데 우리는 Xshell을 사용해보도록 하겠다. 기업에서는 유료지만 학생이나 가정, 학교에서는 무료로 사용할 수 있다.

아래 URL을 참고하여 Xshell을 다운로드 받기 바란다.

http://www.netsarang.co.kr/download/main.html


Xshell을 다운로드 한 후에 실행하면 다음과 같은 화면이 나타날 것이다.

[파일] → [새로 만들기] → [새 세션 등록 정보]에 들어간다.


인스턴스의 이름을 입력하고, 호스트에 아까 복사해두었던 URL(Public DNS)을 입력한다.

좌측 사용자 인증 카테고리를 클릭한 후, 사용자 인증 [방법]을 [Public Key]로 변경한다. [사용자 이름]에는 'ubuntu'를 입력하여 준다. [사용자 키] 오른쪽의 찾아보기 버튼을 클릭

[가져오기] 버튼을 클릭하여 인스턴스 생성시 발급받은 키(Key) 파일을 가져온다. 가져온 키를 선택한 후 [확인] 버튼을 클릭한다.


이제 생성된 인스턴스에 SSH 접속을 할 준비가 됐다. Xshell 프로그램의 [파일] → [열기] 버튼을 누르거나 [Alt+O] 단축키를 이용해서 세션창을 띄우고 생성한 접속 정보를 더블클릭 한다. 이때 "알 수 없는 호스트 키"라는 메시지가 출력되면 [수락 및 저장] 버튼을 클릭한다.

아래와 유사한 화면이 출력되면 성공적으로 접속된 것이다.


여기까지 AWS EC2 서비스를 이용하여 생성한 UbuntuServer 인스턴스에 접속을 완료하였다.


이제 실제 명령을 입력해서 원격에 있는 인스턴스를 제어하여 nodejs 웹소켓 서버를 구축해보도록 하겠다.



4. nodejs, npm modules 설치

우선, nodejs 및 npm modules 설치에 앞서 apt-get의 업데이트 및 libssl-dev, g++, make에 대한 설치 작업이 필요하다.

부분들을 먼저 설치해야한다.


우분투의 apt-get을 업그레이드 해준다.

sudo apt-get update

* sudo : root 권한으로 명령어를 실행

* apt-get : 리눅스 쉘에서 프로그램 패키지를 다운로드하고 설치하는 명령어

* apt-get update : 패키지 목록을 업데이트


sudo apt-get install libssl-dev g++ make

* libss-dev : SSL 개발에 필요한 라이브러리와 헤더파일을 포함한 패키지

* g++ : c++ 컴파일러

* make : makefile을 통해 빌드를 수행

* apt-get install : 해당 패키지를 설치

y


자 여기까지해서 필요한 기본적인 사항들을 셋팅하였다. 그럼 바로 nodejs를 설치해보자.

아래 주소는 https://nodejs.org/en/download/ 에 접속하여 'Source Code' 부분의 주소를 복사한 것이다.

wget https://nodejs.org/dist/v5.0.0/node-v4.5.0.tar.gz

* wget : URL을 통해 파일을 직접 내려받음

(설치 진행 중)


ls 명령어를 통해 다운로드 받은 파일이 존재하는지 확인하여 준다.

ls


해당 파일의 압축을 풀어준다.

tar -xvf node-v4.5.0.tar.gz

* tar : 압축 풀기

* tar -xvf : cvfb로 묶은 tar파일인 rfd1의 압축을 풀 경우


다시한번 ls 명령어를 통해 압축이 제대로 풀렸는지 확인하여 준다.

ls


node-v4.5.0 폴더가 생성된 것을 확인할 수 있다. 해당 폴더로 이동하여 준다.

 cd node-v4.5.0


ls 명령어를 통해 해당 폴더의 하위 파일들을 확인해본다. 여기서 configure 파일이 존재하는지 확인하고 아래와 같이 설치를 진행하여 준다.

ls

 ./configure && make && sudo make install

* configure 파일은 makefile이기에 make 명령어를 통해 설치를 진행한다.

* (소요시간이 꾀 오래 걸린다)

* 만약 /usr/bin/env 'python' no such file or directory 와 같은 메시지가 뜬다면 다음 명령어를 실행시켜 준다.

 sudo apt-get install python-software-properties python g++ make


설치가 완료되었다면 ls 명령어를 통해 아래 그림과 같이 이전에 없던 새로운 파일들이 추가되었는지 확인해보자.


여기까지 nodejs의 설치가 끝났다. nodejs에서 websocket 모듈을 사용하기 위해 이번에는 npm과 websocket 모듈을 설치해보도록 하겠다.

npm이 설치하기에 앞서 기존의 경로(~/node-v4.5.0/)에서 root 경로로 이동을 하여 준다.

cd


Ubuntu에 내장되어 있는 npm 패키지를 설치한다.

sudo apt-get install npm

y


이어서 해당 디렉토리(root)에 websocket module를 설치하여 준다.

npm install websocket


자 이제 정말 nodejs에서 websocket module을 이용한 웹서버 구축을 위한 준비가 모두 끝났다. 이제 실제 동작이 가능한 서버단 소스코드를 작성하여 테스트하는 일만 남았다.



5. Server / Client 소스코드 작성 및 테스트

앞으로의 작업 순서는 다음과 같다.

  • 5. 1 nodejs를 이용하여 웹 서버로 사용할 파일(.js) 생성 및 소스코드 작성

  • 5. 2 해당 파일 구동(백그라운드 단에서 운용)

  • 5. 3 해당 서버파일을 테스트할 클라이언트 파일 생성 및 소스코드 작성

  • 5. 4 AWS의 Public DNS와 인스턴스를 생성할 당시 설정해주었던 port를 사용하여 최종 동작 테스트하기


5. 1 nodejs를 이용하여 웹 서버로 사용할 파일(.js) 생성 및 소스코드 작성

vim 명령어를 이용하여 웹 서버로 사용될 파일을 생성하여준다(동시에 편집창으로 이동)

vim myeonguniNodeS.js

준비한 websocket 서버 소스코드를 작성하여 준다.

* 본인의 경우, HTML5에서 제공하는 Canvas 태그를 이용하여 다중 이용자를 위한 실시간 그림판에서 사용자(클라이언트)들이 Canvas에 낙서를 하는 좌표값을 저장하여 공유해주는 서버를 구현하였는데 이에 맞게 소스코드를 작성하여 셋팅해보도록 하겠다.

* 아래는 본인이 사용한 소스코드

* 여기서 확인해야할 것은 'server.listen(9000, ...' 부분이다. 아래 5. 4에서 확인할 수 있겠지만 해당 포트는 인스턴스 생성당시 Security Group 설정에서 Custom TCP port로 접근이 가능하도록 열어두었던 포트이다. 

작성이 완료되었으면 [ESC] 버튼을 누른 뒤 [:x]를 입력하고 엔터를 누르면 저장하고 편집창을 빠져나오게 된다.


5. 2 해당 파일 구동(백그라운드 단에서 운용)
위에서 작성한 myeonguniNodeS.js 파일을 nodejs를 통해 웹 서버로 구동해보도록 하겠다. 여기서 중요한 것은 보통의 경우 'node myeonguniNodeS.js'의 명령어를 통해 웹 서버를 구동하지만 지금의 경우는 AWS의 EC2 인스턴스를 사용하여 SSH을 통해 원격접속하였다. 원격접속이 끊어지게되면 해당 프로세스(웹서버)도 죽게되는데 이를 방지하기 위해 백그라운드에서 해당 프로세스를 실행시키는 방법을 사용하도록 하겠다.
아래 그림과 같이 nohup & 명령어를 사용하여 웹 서버를 구동하도록 하자.

 sudo nohup node myeonguniNodeS.js &
* 관리자 권한(sudo)으로 프로세스를 실행해야 SSL Protocol이 끊겨도 지속적으로 실행된다.
* nohup & : 백그라운드 방식으로 프로세스를 실행, 로그아웃(서버와의 세션이 종료되는 것)이 되어도 백그라운드로 해당 명령을 계속 수행하게 해주는 명령어
* node : nodejs 실행 명령어

이렇게 프로세스를 실행시키면 위 설명과 같이 백그라운드에서 해당 프로세스는 계속해서 구동을 하고 있다. 이는 ps -ef라는 명령어를 통해 확인이 가능하다.


5. 3 해당 서버파일을 테스트할 클라이언트 파일 생성 및 소스코드 작성

서버는 구동까지 완료가 되었고 이제는 클라이언트 단을 작성할 차례이다. 해당 소스코드는 본 포스팅에 첨부하기에는 너무 길어서.. URL로 대체를 한다.

▶ http://myeonguni.com



5. 4 AWS의 Public DNS와 인스턴스를 생성할 당시 설정해주었던 port를 사용하여 최종 동작 테스트하기

자이제 마지막 테스트가 남았다. 다시 AWS Console 웹 페이지로 가보자.

여태껏 웹서버 셋팅을 진행한 해당 인스턴스(UbuntuServer)를 클릭하면 하단에 여러 정보들이 표시되는 것을 확인할 수 있다. 이 중 Public DNS에 해당하는 값이 바로 웹서버(Websocket을 이용하여 작성한 nodejs 서버파일→myeonguniNodeS.js)의 주소값에 해당한다.

▶ Websocket 클라이언트단에서 작성한 소스코드의 웹서버 주소에 해당 Public DNS + ":" + Port Number를 입력하여 준다.

ws = new WebSocket("ws://ec2-52-78-105-50.ap-northeast-2.compute.amazonaws.com:9000");
ws.onopen = function() {
  // 웹 소켓 연결
}


이제 실제 테스트를 위해 SSH 통신을 끊고 작성된 클라이언트 페이지를 통해 테스트를 진행해보자.

SSH 접속을 끊었음에도 불구하고 이상없이 웹서버가 동작하고 있는 것을 확인할 수 있다.


이상 [AWS] EC2를 이용한 Node.js 웹소켓 서버 구축하기에 대한 포스팅을 마치겠다. 




반응형