본문 바로가기

Web

ubuntu 12.04 + nginx 1.4.2 + django 1.5.2 + uwsgi 1.4.10 설정 방법





웹 서버는 KT의 ucloud 서버를 사용하고 있다. 잡설이지만, 아직 KT서비스가 불안정하긴하다. SSH로 서버에서 작업을 하다보면 간혹가다가 장애가 발생한다. 이유없이 서버 접속이 끊어진다.  실제로 서비스를 하기위해서 클라우드 서버를 알아 보고 있다면, KT는 아직 아이다라는 판단이다.


어쨌든..


제목처럼 Ubuntu 12.04 LTS에 Nginx 1.4.2에, django 1.5.2, uwsgi 1.4.10을 KT의 ucloud 서버에 설치하여 테스트를 하였다. 생각보다 시행착오를 좀 겪은바, 그 내용을 남겨보려고 한다.


1. KT ucloud에 SSH로 접속.


(1) SSH 접속


KT의 ucloud 포털에서 클라우드 콘솔에서 신청한 서버의 네트워크를 보면, 외부에서 접근할 수 있는 ip와 내부 ip가 존재한다. 우리는 외부에서 접속을 하는거니까, ssh로 외부 ip를 입력하고 접속한다. windows를 사용하는 사람은 putty를 이용하면 되고, 본인은 ubuntu를 사용하고 있어서, 터미널에 아래와 같은 명령어를 입력하여 서버에 접속하였다.


$ ssh -l root <서버의 외부 ip주소>


패스워드를 물어보면, 주어진 암호를 입력하면 된다.


(2) SSH 접속 타임아웃 값 조정


일단 처음에 ssh접속을 하면 TMOUT 값을 조정해 주거나 없애는 것이 좋다. 저 값은 SSH로 접속을 유지하는 타임아웃값이다. 저 값때문에 쓰다가 ssh접속이 끊어지는 경우가 종종발생하니.. 설정변경을 하지 않으면 ssh로 작업할때 조금 짜증이 날 수 있다.


/etc/bash.bashrc를 열어서 보면 맨 하단에


readonly export TMOUT=300


으로 되어있는데, 이 라인을 주석처리 한다.



2. apt-get 속도 향상


(1) ubuntu 12.04를 설치하고 apt-get으로 소프트웨어 설치하려는데, 이게 많이 느리다.. 그래서 아래와 같이 daum서버로 변경을 해주도록 하자.


$ vim /etc/apt/sources.list


로 source.list를 열고, kr.archive.ubuntu.com을 ftp.daum.net으로 변경을 해주자.


(2) 서버 변경


%s/kr.archive.ubuntu.com/ftp.daum.net 으로 source.list에 있는 내용 모두를 한번에 변경가능 하다. 변경후에는


(3) apt-get 업데이트


$ apt-get update


로 갱신을 해주자.



3. Nginx 1.4.2 설치 순서


(1) key를 적당한 위치에 다운로드 받는다. 본인은 /root/download 디렉토리를 만들고 그곳에 다운로드 받았다.


$ cd /root/download

$ wget http://nginx.org/keys/nginx_signing.key


(2) 다운로드 받은 key를 적용한다.


$ apt-key add nginx_signing.key


(3) /etc/apt/source.list 를 열어서 맨 하단에 아래 내용을 추가해준다. (ubuntu 12.04에 대한 nginx의 codename은 'precise'로 명명되어 있다.)


deb http://nginx.org/packages/ubuntu/ precise nginx

deb-src http://nginx.org/packages/ubuntu/ precise nginx


(4) source.list 를 업데이트한다.


$ apt-get update


(5) nginx를 설치한다. (1.4.2버젼이 설치된다. stable version이다.)


$ apt-get install nginx


(6) 테스트


nginx 서비스를 시작하려면


$service nginx start



4. virtualenv 설치.


서버를 돌리는데 라이브러리들의 버젼 문제가 발생하지 않도록 하기위해 가상환경을 꾸며주면 좋다. (product에서도 많이 사용하는지는 모르겠지만, virtualenv를 많이 적용하고 있는듯하다.)


(1) 설치를 하기전에 python-pip를 설치한다.


$ apt-get install python-pip


(2) pip로 virtualenv를 설치한다.


$ pip install virtualenv



5. uwsgi 1.4.10 (LTS version)설치


(1) pip로 uwsgi를 설치하기전에 컴파일러와 python-dev를 설치해줘야 한다.


$ apt-get install build-essential python2.7-dev


(2) uwsgi 1.4.10을 설치한다.


$ pip install uwsgi==1.4.10



6. Django 프로젝트 생성


여기서 부터는 아래 문서를 참조하면 된다. 일부 위치나 값의 변경은 사용자가 원하는데로 바꿔서 입력하면 된다.

http://www.collabspot.com/2012/08/14/setting-up-nginx-uwsgi-python-ubuntu-12-04/


(1) 작업할 디렉토리를 미리 만들자.


/var 디렉토리 아래에 www 디렉토리를 만들고, 그 아래에 사용할 디렉토리를 만든다.(그냥 다른곳에 만들어도 된다. 참조문서에는 /var/www/아래에 만들었다.)

그리고, 그 아래에 venv conf src logs 라는 디렉토리를 각각 만들었다.


$ mkdir /var/www/example.com

$ cd /var/www/example.com

$ mkdir venv conf src logs


최종적으로 디렉토리의 구조는 아래와 같을 것이다. (다른 설정들을 모두 다 포함하여..)


/var/www/

`- example.com/

   |- venv/

   |- conf/

   |  |- nginx.conf (include in main nginx.conf)

   |  `- uwsgi.ini 

   |- src/

   |  `- example/ (django-admin.py startproject example)

   `- logs/

      |- access.log (nginx access log)

      `- error.log (nginx error log)


(2) venv 설정 및 django 1.5.2 설치


원문에서는 pip install django로 되어있는데, 본인은 django 버젼을 지정했다. 1.5.2로..


$ virtualenv /var/www/example.com/venv

$ source /var/www/example.com/venv/bin/activate

(venv)$ pip install django==1.5.2


(3) django 프로젝트 생성


$ mkdir /var/www/example.com/src

$ cd /var/www/example.com/src

(venv)$ django-admin.py startproject example


(4) conf 디렉토리에 nginx와 uwsgi 설정 파일들을 저장


conf 디렉토리에 uwsgi.ini 파일을 만들고 아래의 내용처럼 편집한다.


[uwsgi]

# variables

projectname = example

projectdomain = example.com

base = /var/www/example.com

# config

protocol = uwsgi

venv = %(base)/venv

pythonpath = %(base)/src/%(projectname)

module = %(projectname).wsgi

socket = /tmp/%(projectdomain).sock

logto = %(base)/logs/uwsgi.log 


저장한 뒤에, nginx.conf 파일을 생성하고 아래처럼 편집한다.


server {

  listen 80;

  server_name example.com www.example.com;

  root /var/www/example.com/src/example;

  access_log /var/www/example.com/logs/access.log;

  error_log /var/www/example.com/logs/error.log;




  location / {

    include uwsgi_params;

    uwsgi_pass unix:///tmp/example.com.sock;

  }

}


원문에서는 92포트로 되어있는데, 포트를 80으로 바꿨다.


(5) nginx 디렉토리에서의 conf 파일을 변경해준다.


/etc/nginx/nginx.conf 파일을 편집해준다. (원문에서는 /etc/nginx/conf/nginx.conf라고 되어있는데, 본인이 사용하는 위치와 달랐다.)


user    www-data;

# ...

http {

  # ...

  include /var/www/*/conf/nginx.conf;   

  # ...

}


위 내용에서 user www-data; 는 사용자가 www-data이다라는 것인데, www-data라는 사용자를 만들어준다. (물론 다른이름으로 바꿔도 된다.) 새로운 사용자를 등록하는 것은 useradd로 추가하면 된다. 자세한 내용을 확인하려면 useradd -h 로...

그리고, http { ... } 안에 include/var/www/*/conf/nginx.conf 를 넣어준다. 기본적으로 configuration 파일을 include하는 라인이 들어있는데, 주석처리 해주면 된다.


7. 확인


nginx를 실행해서 django와 잘 연결되어 있는지 확인하면 된다.


$ service nginx restart

$ uwsgi --ini /var/www/example.com/conf/uwsgi.ini


이렇게 해주고 난뒤에 새로운 터미널을 열어서


$ curl http://localhost 로 확인하면 된다. 또는 웹브라우저에서 서버의 외부 ip로 접근하여 뜨는지 보면된다.



8. 문제해결


(1) 동작이 되는지 확인을 하면, 502 Bad Gateway라는 에러가 뜰 수 있다.

> 문제해결 방법은 6번과정에서 user를 root로 해주는 방법과 /tmp/ 디렉토리에 가보면 .sock 이 생성되어 있는데, 이 sock의 퍼미션을 666으로 바꾸면된다고 한다.

>[참고] user를 root로 지정하게 되면 nginx가 만들어내는 worker process가 파일 시스템의 모든 사용권한을 얻게 되는것이기 때문에 보안상 위험하므로 권장하지 않는다고 한다. 그래서, 새로운 사용자과 그룹을 만들어서 넣는것이 좋다.