냐냐한 IT/냐냐한 실습 기록

Amazon EC2 Windows 인스턴스에 NodeJS 서버 띄우기

소소하냐 2020. 6. 14. 16:55

AWS EC2 Windows 인스턴스에 도메인을 연결한 상태에서 NodeJS 서버를 띄워보는 실습을 해보았습니다. 

예제 코드가 local에서는 동작하는데 외부에서 IP를 치고 들어가면 연결이 되지 않는 문제가 있었습니다. 그에 대한 내용을 기록하고자 합니다. 

 

 

NodeJS 서버, AWS 인스턴스의 로컬에서 동작 확인 

 

1. AWS 인스턴스에 원격으로 들어가서 Node.js 인스톨러를 다운로드하여 설치 ( 노드 공식 사이트 - 다운로드로 이동 [새창] )

 

2. 원하는 위치에 노드 공식 사이트의 시작가이드의 예제를 작성 ( 노드 공식 사이트 - 시작 가이드로 이동 [새창] )

 

    2-1. 아래 예제 코드를 작성후 app.js 파일명으로 저장

const http = require('http');

const hostname = '127.0.0.1';
const port = 8000; //원래는 3000으로 되어있었지만 AWS 인바운드 포트를 8000으로 열었기에 수정

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

 

    2-2. 해당 파일이 있는 폴더에서 아래 명령어 실행 (nodejs 서버 실행)

$ node app.js

 

    2-3. 브라우저를 열어 'http://localhost:8000' 으로 동작 확인 

 

 

NodeJS 서버, 외부에서 IP 또는 도메인으로 연결할 수 있도록 수정 

 

1. http://xxx.xxx.xxx.xxx:8000 (xxx.xxx.xxx.xxx는 인스턴스의 퍼블릭 IP) 또는 http://도메인명:8000 으로 연결

    > 연결 실패 

 

2. 외부 연결을 위한 내용을 검색하니 hostname을 '0.0.0.0'으로 해야 한다는 결과. 위의 app.js 파일에서 hostname 주소를 변경 후 'node app.js' 명령어로 서버 재실행

const hostname = '0.0.0.0'; //'127.0.0.1';

    ==> (2020.06.21 내용 추가 : hostname 따로 지정하지 않아도 외부 접속이 가능. 방화벽 문제였던 것으로 파악됩니다. hostname을 설정하지 않거나, 설정할 거라면 '0.0.0.0'으로 설정)

 

3. 다시 http://xxx.xxx.xxx.xxx:8000 또는 http://도메인명:8000 으로 연결

    > 연결 실패  

 

4. telnet으로 해당 IP의 8000 포트가 열려있는지 접속 확인

    > 접속 실패 

 

5. 해당 인스턴스에 원격으로 직접 들어가서 방화벽에 인바운드 포트 추가 

 

6. telnet으로 해당 IP의 8000 포트가 열려있는지 접속 확인

    > 접속 성공 

 

7. http://xxx.xxx.xxx.xxx:8000 또는 http://도메인명:8000 으로 연결 

    > 연결 성공 

 

 

결과에 따른 원인 분석 : AWS에서 인바운드 8000 포트를 열었지만, 실제 인스턴스의 방화벽에는 8000 포트가 생기지 않았습니다. 방화벽에서 인바운드 포트를 확인 후 없다면 수동 추가가 필요합니다. 

 

 

 

NodeJS 서버, 외부에서 80 포트로 연결하도록 수정 

 

nodejs 서버도 포트를 8000이 아닌 기본 포트 80으로 접속하고 싶었습니다.

이전에 설정한 IIS 사이트 2개가 모두 80 포트를 사용하고 있으니 IIS를 중지시킵니다. 

 

1. 80 포트로 변경. app.js 최종 소스 

const http = require('http');

const hostname = '0.0.0.0'; //'127.0.0.1';
const port = 80;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

 

 

2. 아래 명령어 다시 실행

$ node app.js

3. http://xxx.xxx.xxx.xxx 또는 http://도메인명 으로 연결

    > 연결 실패  

 

4. telnet으로 해당 IP의 80 포트가 열려있는지 접속 확인

    > 접속 실패 

 

5. 해당 인스턴스에 원격으로 직접 들어가서 방화벽에 인바운드 포트 추가 

 

6. telnet으로 해당 IP의 80 포트가 열려있는지 접속 확인

    > 접속 성공 

 

7. http://xxx.xxx.xxx.xxx 또는 http://도메인명 으로 연결 

    > 연결 성공 

 

결과에 따른 원인 분석 : AWS에서 인바운드 80 포트가 열려있고, 이전에 IIS의 경우 따로 방화벽에 인바운드 포트를 추가하지 않아도 자동으로 선점하는 듯합니다. 하지만 IIS가 아닌 다른 서비스로 80을 이용할 때에는 8000번과 마찬가지로 별도로 추가가 필요한 것으로 추측됩니다. 

 

AWS 인스턴스에서 80, 8000 포트를 수동으로 추가