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 하위에 생성하지 말 것

<! 설마 위 소스를 그냥 복&붙하곤 안 된다는 사람은 없길 바람 ㄷㄷㄷㄷ !>

 

위 소스를 실행시키면 code별로 type 유형별 합계를 얻을 수 있다.

핵심 = case([(조건1, 값), (조건2, 값), … (조건n, 값)])

  1. 8~10 line : error_handler 설정 필수
    (설정하지 않을 경우, 400 Bad Request 발생) – 아직 정확한 이유는 모르겠음
  2. 20 line : request.get_json()
    (request.form[‘data_key’] 로 접근할 경우 400 Bad Request 발생)

위 2가지 사항이 준수되어야 POST 방식의 Ajax 가 원활히 작동된다.

CSRF 프로텍션을 가동시킨 후 json 데이터를 Ajax POST 방식으로 넘겨서 request.form[‘data_key’]로 값을 받아오려하자 계속 브라우저에서 서버가 이해할 수 없는 요청을 보냈다며 400 Bad Request 발생되어 약 2시간가량 붙잡고 있었다.

아무리 구글에서 검색을 하고 최신 버전의 Flask Document를 찾아봐도 기본 예제들 뿐이었고(대부분이 전송 자체에만 포커스를 맞춰 작성된 글이었다.) Python 뉴비인 나는 헤매기 딱 좋은 조건이었다.

그러던 중 json 데이터를 받는 메소드(예, ajax_post())에서 모든 코드를 주석처리하고 단순히 ‘A’를 출력하는
print ‘A’
명령을 입력하자 거짓말 같이 200 Response 가 떴다.

결국 데이터를 받아오는 쪽에서 문제가 발견했다는 것을 깨닫고 좀 더 구글링하자 get_json() 메소드를 알게되어 변경했더니 유레카!

 

이와 같은 문제로 머리 아픈 다른 사람들이 있다면
부디 이 포스팅을 보고 나 같이 허무하게 시간 낭비하지 않길 바라며 글 작성한다.

  1. Python 2.7.x 소스를 다운 받아 압축을 해제한다.
  2. cd Python-2.7.x
  3. ./configure
  4. make && make altinstall
  5. python -V # 아직 2.6.x 뜰 것이다.
  6. mv /usr/bin/python /usr/bin/python_backup
  7. cp /usr/local/bin/python2.7 /usr/bin/python
  8. python -V # 이제 2.7 뜸

근데 문제는 yum 이 2.6에 맞춰져있어서 yum 도 건드려줘야 한다.. 이거 때문에 한참 헤맴..

  1. cp /usr/bin/yum /usr/bin/yum_backup
  2. nano ‘which yum’
  3. #!/usr/bin/python 에서 python 을 python_backup 으로 수정 (위 6번 참고)
  4. yum update 확인