목차
개요
DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests. (And that’s how it’s gonna stay. We’re in the business of making web frameworks, not web servers, so improving this server to be able to handle a production environment is outside the scope of Django.)
프로덕션 환경에서 이 서버를 사용하지 마십시오. 보안 감사나 성능 테스트를 거치지 않았습니다. (그리고 그렇게 될 것입니다. 우리는 웹 서버가 아닌 웹 프레임워크를 만드는 비즈니스에 있으므로 이 서버를 프로덕션 환경을 처리할 수 있도록 개선하는 것은 Django의 범위를 벗어납니다.)
1. uWSGI 란?
맨 위에 인용되어있는 글은 Django Document에서 발췌한 문장이다. Django에서 개발 용도로 사용하는 runserver 명령을 프로덕션 환경에서 사용하지 말라고 되어있다.
이유는 이미 적어져 있듯 보안 감사나 성능 테스틀 거치지 않았다고 한다.
Django와 같은 WAS를 배포할 때는 WSGI를 역할을 제공해주는 소프트웨어인 gunion이나 uWSGI 둘 중 하나를 선택하게 되는데 이 두 가지 중에서 uWSGI에 대해 알아볼 것이며 다음 3가지를 중점으로 기록해보려한다.
1. uWSGI가 하는 일
2. uWSGI만 써도 되는지
3. uWSGI에서 사용하는 자원을 모니터링하는 방법
2. uWSGI가 하는 일
uWSGI는 웹 서버(Apache/Nginx) 와 Python으로 작성된 WebFramework(Flask/Django) 사이의 통신을 도와주는 역할을 한다. uWSGI를 사용할 경우 HTTP Request&Response는 흐름은 다음과 같다.
Nginx <--> uWSGI <--> Django
즉 uWSGI는 NGINX로 들어오는 HTTP 혹은 기타 요청을 중간에서 Django와 같은 Web Framework 로 전달해주는 역할을 하고 반대로 Django의 Response를 Nginx으로 다시 보내주는 역할을 한다.
3. uWSGI 만 써도 될 것 같은데?
Web Server와 Web Application Server의 역할을 알고 본인이 어떤 걸 써야되는지 판단하는 부분이라고 생각한다. 각 역할은 간단히 다음과 같다.
- Web Server는 클라이언트가 웹 브라우저에서 어떠한 페이지 요청을 하면 웹 서버에서 그 요청을 받아 정적 컨텐츠를 제공하는 서버다. 정적 컨텐츠란 단순 HTML, CSS, JavaScript, 이미지, 파일 등 즉시 응답가능한 컨텐츠다. 웹 서버가 동적 컨텐츠를 요청받으면 WAS에게 해당 요청을 넘겨주고 WAS에서 처리한 결과를 클라이언테게 전달해주는 역할도 한다.
- Web Application Server는 웹 서버 단독으로는 처리할 수 없는 데이터베이스의 조회나 다양한 로직 처리가 필요한 동적 컨텐츠를 제공한다. 이는 요구사항에 맞춰 웹 서비스가 제공된다라는 뜻이다.
여기서 uWSGI는 Web Server와 Web Application Server 사이에서 Gateway 역할이다. 그러니 uWSGI만 이용한다는 건 Web Server가 제공해주는 기능을 이용하지 않겠다고 하는 것이기 때문에 이 점을 감안하고도 uWSGI만 사용하겠다고 하면 그럴만한 선택이기 떄문에 틀린 방법은 아니다.
4. uWSGI 간단한 사용법
4.1 Installation
$ pip install uwsgi
4.2 Example Project Tree
# /django-employees-app
├── Makefile
├── README.md
├── config
│ ├── __init__.py
│ ├── __pycache__
│ ├── asgi.py
│ ├── exception.py
│ ├── settings
│ ├── type_defined.py
│ ├── urls.py
│ └── wsgi.py
├── developnote.md
├── document
│ └── employees
├── employees
├── venv
밑의 단락부터 설명할 커맨드 예시는 위 프로젝트 구조에 기반한 것이다. django로 생성한 project이며 필자가 django 연습 용도로 생성한 django project이다.
4.3 Django Project를 uWSGI로 실행하기
$ uwsgi --http :8001 --chdir /django-employees-app --module config.wsgi
- --chdir 옵션은 manage.py가 들어있는 Django Project의 절대 경로를 써주자
- --module 옵션은 Django Project 안에 들어있는 wsgi.py 파일의 위치를 적어주면 된다.
- --http 옵션은 말 그대로 http를 통해 요청을 받는것이고 이 때 어떤 포트로 요청을 받을 지 지정해주는 부분이다.
위 옵션에 표시하진 않았지만 이미 생성해둔 venv를 통해 uWSGI를 실행하고 싶다면 다음과 같이 적어주자.
$ uwsgi .. --home /django-employees-app/venv/
4.4 uWSGI.ini 파일
위에 적은 몇 가지 명령은 아주 간단한 예시이다. 실제로 uWSGI를 사용하게 될 경우 unix socket이나 master 및 worker와 같은 상황을 고려한 여러가지 옵션을 줘야하는데 매번 이 명령을 실행시키는 건 불편한 상황이다. 그러니 다음과 같이 하나의 *.ini 파일에 uWSGI를 실행시킬 때 필요한 옵션을 미리 지정해서 사용할 수 있다.
# uwsgi.ini
[uwsgi]
virtualenv = $VIRTUALENV_PATH
chdir = $MYPROJECT_PATH
module = myproject.wsgi
http = :8001
실행 옵션은 다음과 같다.
uwsgi -i uwsgi.ini
5. uWSGI Stat 서버
uWSGI 안에는 top 명령어와 같은 기능을 하는 uWSGI가 사용하는 프로세스의 특정 메트릭을 확인 가능한 옵션이 존재한다. ini 파일에 다음과 같이 적어서 사용할 수 있다.
[uwsgi]
...
stats=0.0.0.0:3031
stats-http=true
이후 로컬에 3031 port로 HTTP Request를 보내 확인할 수 있다. 허나 이를 지원하는 uwsgitop 툴이 있는데 아래 링크를 참고하자
https://github.com/xrmx/uwsgitop
'Frame Work > Django' 카테고리의 다른 글
[Django] auth_group 다루기 (0) | 2022.12.18 |
---|---|
uWSGI Socket + Nginx + Docker (0) | 2022.11.10 |
[Django] OneToOne Relation (0) | 2022.06.06 |
django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint') (0) | 2022.05.07 |
[Django] Session ! (0) | 2022.05.06 |