[Django] Nginx & uWSGI 연동

Django 프로젝트를 Nginx 웹서버에 올리기 위해 uWSGI를 연동해야 한다.

구글에 검색되는 수많은 연동 관련 글을 보고 그에 맞게 웹서버를 설정했지만

404, 500, 502 3가지 에러가 마구 튀어나오며 실패했다.

원인을 알고 싶었지만 도무지 해결책이 나오지 않았다.

난 분명 스택오버플로우나 Django, Nginx, uWSGI 관련 문서들을 참고하며

그대로 적용했지만 그래도 결과는 똑같았다.
결국 수많은 삽질을 해가며 해결책을 찾았다.

이에 잊지 않기 위해 글로 남긴다.
* 설정에 필요한 파일 목록

1. 프로젝트 설정 파일
– /{Project Directory}/{Main}/settings.py

2. 프로젝트 Nginx 설정 파일
– /{Project Directory}/{Project Name}_nginx.conf

3. 프로젝트 uWSGI 설정 파일
– /{Project Directory}/{Project Name}_uwsgi.ini
* 예제

– /{Project Directory}/{Main}/settings.py
(…)
STATIC_URL = ‘/static/’   – A
STATICFILES_DIRS = [os.path.join(BASE_DIR, ‘devel_static‘)]   – B
STATIC_ROOT = os.path.join(BASE_DIR, ‘service_static‘)   – C
(…)

– /{Project Directory}/{Project Name}_nginx.conf
(…)
upstream django {
# /tmp 디렉토리에 소켓 파일을 지정할 경우 – 502 에러 발생
server unix:///run/{Project Name}.sock;   – D
}

server {
(…)
location /static {   – E
alias /{Project Directory}/service_static;   – F
}
(…)
}
(…)

– /{Project Directory}/{Project Name}_uwsgi.ini
(…)
socket = /run/{Project Name}.sock – G
(…)
* 디렉토리명 설명

static -> 정적파일을 불러올 URL 상의 경로명 (http://example.com/static)
devel_static -> 디버깅 모드일 때 정적파일 가져오는 디렉토리
service_static -> 실제 서비스시 정적파일 가져오는 디렉토리
* 핵심 (볼드&컬러 단어)

A, E 동일 – A 뒤에 슬래시(/) 붙어있는거 주의
C, F 동일
D, G 동일 – /tmp 하위에 생성하지 말 것