정보공간_1

[7기 수원 박성진] EC2에서의 django 프로젝트 생성 및 외부 접근 설정 본문

IT 놀이터/Elite Member Tech & Talk

[7기 수원 박성진] EC2에서의 django 프로젝트 생성 및 외부 접근 설정

알 수 없는 사용자 2015. 7. 2. 16:58

  지난번 포스팅에서 django를 연동하고 EC2Inbound 포트 중 8000 포트를 열어 django 웹 서버를 사용 할 준비를 완료 하였습니다. 이번 포스팅에서는 지난번 포스팅에 이어 Django 웹 프로젝트를 실행하고 외부에서 접속하기까지의 과정을 소개하도록 하겠습니다.

 

<!--[if !supportLists]-->1.       <!--[endif]-->Django Web Project 생성

  먼저 프로젝트 폴더 구성을 해 보겠습니다. 프로젝트 이름은 firstproject로 하며 그 하위 폴더에는 각종 로그 들을 남길 logs,  서버에 대한 설정 등 각 설정들을 포함할 confs, 장고 프로젝트 소스의 루트가 될 src로 나누도록 하겠습니다. 그러면 프로젝트 폴더 구조가 다음 그림과 같이 됩니다.

  그럼 프로젝트 폴더를 생성해 보도록 하겠습니다.

mkdir ~/firstproject

mkdir ~/firstproject/confs ~/firstproject/logs ~/firstproject/src

위의 명령어를 순서대로 입력하면 프로젝트 폴더 구조가 아래의 그림과 같이 생성이 되는 것을 확인 할 수 있습니다.



  (제가 위의 그림에서 사용한 tree 같은 경우 기본으로 제공되는 것이 아니기 때문에 apt-get install tree 라는 명령어로 설치를 해 주어야 합니다.)

  이제 본격적으로 장고 프로젝트를 만들어 보도록 하겠습니다. IDE에 익숙하신 분들은 조금 낯설 수도 있겠지만 django 같은 경우에는 명령어로도 프로젝트 생성이 가능합니다. firstproject/src로 가서 (cd ~/firstproject/src) django 프로젝트를 생성 해 주는 명령어를 입력합니다.

  django-admin startproject firstproject(생성할 프로젝트 이름)

  tree 명령어로 프로젝트가 생성된 것을 확인해 보겠습니다.



  위의 그림과는 다르게 src 하위에 firstproject가 생겼으며 그 밑에 여러파일과 디렉토리가 생성된 것을 확인 할 수 있습니다. 그럼 각각의 파일들과 폴더가 무엇을 의미하는지 잠시 간단하게 알아보도록 하겠습니다.

 Src/firstproject

<!--[if !supportLists]-->-       <!--[endif]-->가장먼저 src 폴더 바로 밑에 존재하는 firstproject는 장고 프로젝트 루트를 의미 합니다. 앞으로 여러분들이 구현할 django에 관련된 코드들은 전부 이 폴더 하위에 들어가게 됩니다.

  Src/firstproject/firstproject

<!--[if !supportLists]-->-       <!--[endif]-->그 다음에 있는 폴더는 아나의 앱을 의미합니다. Django프로젝트는 하위에 여러 엡을 두고 있습니다. 저 같은 경우 하나의 앱 당 한가지의 일만 하도록 구현 하는 것을 추천하고 있습니다.

<!--[if !supportLists]-->-       <!--[endif]-->Two scoops of django 책을 참조하시면 이 패턴에 대해 더 자세히 알 수 있을 것입니다.

<!--[if !supportLists]-->-       <!--[endif]-->__init__.py

<!--[if !supportLists]-->o    <!--[endif]-->파이썬 패키지라면 포함하고 있어야 할 파일입니다.

<!--[if !supportLists]-->o    <!--[endif]-->아주 간단하게 설명하자면 패키지의 초기 설정이라고 보시면 됩니다.

<!--[if !supportLists]-->-       <!--[endif]-->settings.py

<!--[if !supportLists]-->o    <!--[endif]-->각종 django의 설정을 하는 곳입니다.

<!--[if !supportLists]-->o    <!--[endif]-->여러 모듈에 관한 설정도 보통 이곳에서 합니다.

<!--[if !supportLists]-->o    <!--[endif]-->여러 설정에 대한 자세한 내용은https://docs.djangoproject.com/en/1.8/topics/settings/ 이 링크를 참조해 주세요

<!--[if !supportLists]-->-       <!--[endif]-->urls.py

<!--[if !supportLists]-->o    <!--[endif]-->URL들을 선언해 주는 파일입니다. Django에서 사용할 모든 url은 각 앱의 url.py에 들어가 있어야 합니다.

<!--[if !supportLists]-->-       <!--[endif]-->manage.py

<!--[if !supportLists]-->o    <!--[endif]-->django에 관한 각종 커멘드 라인 명령어를 지원합니다.

<!--[if !supportLists]-->o    <!--[endif]-->서버 시작이나 디비 생성, 마이그레이션 등을 할 수 있는 명령어를 지원합니다.

<!--[if !supportLists]-->o    <!--[endif]-->자세한 내용은https://docs.djangoproject.com/en/1.8/ref/django-admin/ 이 링크를 참조해 주세요.

    위의 설명 외에도https://docs.djangoproject.com 이 링크를 따라 들어가시면 더욱 더 자세한 내용의 설명을 볼 수 있으니 본격적인 프로젝트를 시작하시게 되면 잠고하시기 바랍니다.

  간단하게 각 파일들의 역할을 알아보았으니 서버를 실행시켜 외부에서 접속을 해 보는 테스트를 진행 해 보도록 하겠습니다. 일단 CLI 환경에서 django 를 실행 시키는 것은 위의manage.py에서 runserver 라는 명령어를 통해 쉽게 실행 시킬 수 있습니다. 뒤에 옵션을 안붙이면 localhost:8000 url로 실행이 되게 되는데 테스트를 한 번 해보겠습니다.



  빨간 글씨들은 무시하고 현재 htt://localhost:8000번으로 실행 된 것을 확인 할 수 있습니다. 그럼 linux curl을 이용해서 어떤 결과가 나오는지 확인해 보도록 하겠습니다. 서버가 실행되고 있는 터미널은 그대로 둔 뒤 새로운 터미널을 열어서 EC2에 접속 한 다음 아래와 같이 입력을 합니다.

  curl 127.0.0.1:8000

  그럼 아래와 같은 결과를 확인 하실수 있습니다.



  이것은 curl을 통해서 localhost:8000으로 get request를 보낸 것으로 그에 대한 response를 담고 있습니다. 맨 위를 보아 html로 보이며 브라우저로 접속하면 그 내용을 조금 더 명확히 알 수 있습니다. 하지만 위의 명령어로는 외부에서 접속 할 수 없습니다. 왜냐하면 말 그대로 localhost:8000으로 구동시켰기 때문입니다. 이럴 경우 외부에서 접속하려는 일반 물리적인 서버의 경우

  python manage.py runserver {{사용할 ip}}:{{사용할 포트}}

위의 명령어를 입력하면 됩니다. 그러면 외부에서도 접속할 수 있는 상태의 서버가 실행되게 됩니다. 하지만 EC2에서는 아예 실행 조차 안되는데요 테스트로서 알아보도록 하겠습니다.



  위와 같은 경우는 EC2에서 실행시킨 경우입니다. 위에서 확인한 바와 같이 IP 주소가 할당될 수 없다는 오류를 확인할 수 있습니다.  혹시 고정 IP를 가진 물리 서버를 가지고 있다면 위와 같은 명령어를 통해 실행을 시도한다면 성공적으로 실행이 되는 것을 확인 할 수 있습니다. 그러면 EC2에서는 어떻게 해야 할까요? 그 해답은 0.0.0.0이라는 ip 주소에 있습니다. 이제 아래와 같은 명령어를 통해 서버를 실행시키도록 하겠습니다.

  python manage.py runserver 0.0.0.0:8000

  위의 명령어를 입력하면 아래와 같이 성공적으로 서버가 실행 된 것을 확인 할 수 있을 것입니다.



그리고 웹 브라우저를 사용해 EC2에 할당 된 공용 ip:port에 접속하면 다음과 같은 화면을 볼 수 있을 것입니다.



  이제 성공적으로 django웹 서버를 실행 시킨 것을 볼 수 있습니다. 하지만 이러한 방법은 ssh에 접속된 터미널이 항상 켜져 있어야 한다는 단점을 가지고 있습니다. 이러한 단점을 저는 supervisor이라는 툴로 극복을 하였는데 supervisor란 간단히 말하면 어떤 어플리케이션을 데몬과 같은 상태로 실행 시킬 수 있는 툴입니다. 이것을 사용한다면 굳이 ssh로 연결된 터미널이 켜져 있지 않아도 계속 서버가 실행 될 수 있도록 할 수 있습니다. 자세한 내용은http://supervisord.org 이 링크를 참조하면 더 자세히 알 수 있습니다.