UWSGI 연동에 많은 수행착오를 겪은 뒤 스트레스와 두려움 때문에 proxy_pass로 버텨오다가 소셜 계정 로그인을 추가하다가 어쩔 수 없이 도입을 해야할 것 같았다. 막상 추가하고 보니 proxy_pass와 크게 다른 것은 없어 보인다. 다만 기존의 runserver로 돌리는 거보단 역시 귀찮다.


1. PIP 설치

필자는 파이썬 가상 환경에서 설치를 진행했다.

1
pip install uwsgi

기본적으로 django에서 서버를 구동시키기 위해선

1
python manage.py runserver

위와같이 구동했지만 uwsgi로 구동하려면

1
uwsgi --http :8000 --module main.wsgi

위와같이 구동한다. 현재 위 명령어에 보이는 main.wsgi는 필자에 해당하는 경로로 자신이 django project를 생성한 디렉터리 이름에 맞게 package import 하듯 실행시켜야 한다. 이후 웹에서 http://127.0.0.1:8000으로 접속하면 정상적으로 서버에 접속된다.


1_A. 사용자 앱 찾을 수 없음

uwsgi로 서버를 구동했는데 사용자가 생성한 앱 디렉터리를 찾을 수 없다는 오류가 발생한다면 __init__.py의 부재인 가능성이 크다. 사용자가 생성한 앱 디렉터리에 __init__.py를 추가해야 정상적으로 실행이 된다. __init__.py는 해당 디렉터리가 패키지 디렉터리라는 표시로 아무런 내용이 없어도 된다.


2. NGINX 설정

이제 NGINX에서 설정을 시작하자. 자세한 설정법을 모른다면 다른 페이지를 참고하는 것을 추천하지만 떠먹여 드린다고 언급했으므로 아래와 같이 설정하면 된다.

1
2
3
4
5
6
7
8
9
server {
  listen 80;
  server_name YOUR_DOMAIN_NAME;
  
  location / {
    uwsgi_pass 127.0.0.1:8000;
    include /YOUR_DJANGO_PROJECT/uwsgi_params;
  }
}

YOUR_DOMAIN_NAME에 자신이 사용할 도메인의 이름을 YOUR_DJANGO_PROJECT에는 manage.py가 있는 경로를 입력해주자. 그리고 uwsgi_params라는 파일을 만들어 주어야 하는데 해당 파일은 manage.py가 있는 곳에다가 생성하고 내용은 아래 내용을 복붙하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

이후 NGINX의 설정을 적용하기 위해서 재시작을 해준다.

1
sudo service nginx restart


3. 서비스 실행

1번에서는 http를 이용해 서버를 열었지만 NGINX와 통신을 하기 위해선 소켓으로 열어야 한다.

1
uwsgi --socket :8000 --module main.wsgi


4. 백그라운드

아마존에서 서비스를 이전했는데 쉘이 닫히면 종료되므로 백그라운드 실행하는 방법에 대해서 새롭게 알아야 했다. 먼저 다음과 같은 파일을 생성한다. 필자는 manage.py가 있는 디렉터리에 main_uwsgi.ini로 생성하였다. main은 필자의 프로젝트 이름이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[uwsgi]

# manage.py가 있는 곳
chdir           = /home/ubuntu/BLEX/src
module          = main.wsgi
home            = /home/ubuntu/BLEX/src
# 가상 환경이 설치된 경로
virtualenv      = /home/ubuntu/BLEX/mvenv

master          = true
processes       = 1
socket          = localhost:8000

chmod-socket    = 666
vacuum          = true
daemonize       = /home/ubuntu/BLEX/src/main.log
pidfile         = /tmp/main_backend.pid

enable-threads = true
single-interpreter = true
lazy-apps = true

실행

가상환경을 실행하고 우리가 생성한 ini 파일을 아래 명령어로 실행시키면 된다.

1
$ uwsgi --ini main_uwsgi.ini

종료

우리가 ini 파일에서 지정했던 pidfile을 이용해서 종료를 시도할 수 있다.

1
$ uwsgi --stop /tmp/main_backend.pid
WRITTEN BY

배진오

소비적인 일보단 생산적인 일을 추구하며, 좋아하는 일을 잘하고 싶어합니다 :D
im@baejino.com