일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- CD
- 도커
- annotate
- Git
- Continuous Deployment
- Coroutine
- testcase
- dry-yasg
- to_attr
- database
- aws
- nestedfunction
- racecondition
- Python
- CI
- QuerySet
- docker
- F객체
- apitestcase
- django
- 백준
- Transaction
- Continuous Delivery
- DRF
- 코루틴
- Prefetch_related
- EC2
- DjangoRestFramework
- aggregate
- DjangoCache
- Today
- Total
BackEnd King KY
TIL20 - WSGI & ASGI 본문
✔️Intro
코로나가 정말 기승입니다. 저희 회사는 1주일동안 재택근무로 전환되었습니다. 인생 첫 재택근무인데 편하긴 하네요 허허
이번 포스팅에선 Django 프로젝트를 시작하면 보이는 wsgi/asgi부터 비동기구현까지 해볼 예정입니다.
✔️웹 서버
웹 서버는 웹 브라우저의 정적 요청과 동적 요청을 처리하는 서버입니다. 대표적인 웹 서버에는 Apache, Nginx 등이 있습니다. Django는 Nginx가 잘 어울리며, 저희 회사에서도 Nginx를 사용하고 있습니다.
그리고 서버에 요청할 때, 정적 페이지와 동적 페이지에 요청을 합니다. 정적페이지에 대해 쉽게 설명하자면 css, js, jpg같은 파일을 요청하는 걸 정적페이지 요청이라고 합니다. 그리고 응답이 수시로 바뀌는 요청을 동적 페이지 요청이라고 합니다.
✔️WSGI
Web Server Gateway Interface의 약자로 웹 서버 소프트웨어와 파이썬으로 작성된 웹 응용 프로그램 간의 표준 인터페이스입니다. 그리고 동적 페이지 요청을 처리하기 위해 호출합니다.
Django에서 WSGI 서버는 wsgi.py 파일을 경유하여 프로그램을 호출합니다.
✔️ASGI
Asynchronous Server Gateway Interface의 약자로 비동기 가능한 Python 웹서버, 프레임워크 및 응용 프로그램간의 표준 인터페이스를 제공하기 위한 WSGI 다음으로 나오게 되었습니다. WSGI가 동기 Python 앱에 대한 표준을 제공했다면, ASGI는 WSGI 이전 버전과의 호환성 구현과 여러 서버 및 애플리케이션 프레임워크를 통해 비동기 및 동기 앱 모두에 대한 표준을 제공합니다.
쉽게 말해, WSGI에서는 지원하지 않았던 비동기에 대해서도 가능하게 해준다는 의미이며, Uvicorn을 설치하여 실행합니다.
gunicorn과 ASGI-Uvicorn 배포에 대해 해보겠습니다.
✔️동기 vs 비동기
동기/비동기에 대해 한 번 쯤은 들어보셨을거라 생각합니다. 저는 개발을 처음 배울 때 새로고침이 일어나면 동기, 안 일어나면 비동기인줄 알았습니다.
제가 동기/비동기에 대해 가장 쉽게 이해됐던 것이 커피 줄이었습니다. 내 앞에 있는 사람이 커피를 주문하고 나올 때 까지 기다렸다가 받아간다면 이건 동기입니다. 내가 기다리는 동안 아무것도 못 하기 때문입니다. 일 있어서 주문 줄을 이탈해버리면 다시 맨 뒤로 가야하기 때문입니다. 비동기의 경우, 주문하고 진동벨을 받아가는 것을 생각하시면 됩니다. 커피가 나오는 동안 다른 일을 할 수 있기 때문입니다.
즉, 기존 작업이 모두 끝난 다음 실행된다면 동기이고 기존 작업이 끝나지 않아도 실행할 수 있다면 비동기입니다.
✔️Gunicorn with Django
Django 공식문서에는 gunicorn과 Django를 사용하는 방법이 대해 나와있습니다.
Gunicorn이란, wsgi.py를 호출하기 위해선 WSGI 서버가 필요한데, 이 서버 역할을 해주는 웹 서버입니다.
우선, gunicorn을 설치합니다
pip install gunicorn
그리고 아래 명령어를 입력하여 Gunicorn에서 Django를 실행합니다.
gunicorn projectname.wsgi
실행했다면, URL을 입력하여 서버가 잘켜졌는지 테스트해봅니다. projectname은 내가 처음 Django 프로젝트를 만들 때 시작한 이름을 써주시면 됩니다. 저는 blogs라고 시작했습니다. 이렇게 설정하고 URL을 입력했을 때 잘 작동되면 성공입니다.
아니면 다른 명령어를 사용해도 됩니다.
gunicorn projectname.wsgi:application -- bind 0:8000
✔️Uvicorn와 Django
Uvicorn은 속도를 중시하는 uvloop와 http tools에 기반을 둔 ASGI 서버입니다.
uvloop는 내장된 asyncio 이벤트 루프의 빠른 대체제입니다. uvloop와 asyncio를 사용하면 파이썬에서 고성능 네트워킹 코드를 훨씬 쉽게 작성할 수 있습니다. uvloop는 async를 빠르게 만듭니다. 자세한 사용은 아래에서 하겠습니다.
우선, Uvicorn을 사용하기 위해 설치를 해줍니다.
pip install uvicorn gunicorn
그리고 설치한 Uvicorn을 실행하기 위해 다음 명령어를 입력합니다.
gunicorn projectname.asgi:application -k uvicorn.workers.UvicornWorker
projectname에는 Django 프로젝트를 시작할 때 만든 프로젝트명을 입력합니다. 저는 blogs로 만들어서 blogs.asgi 가 됩니다.
그리고 실행했을 때 이렇게 잘 돌아가는 걸 확인할 수 있습니다.
'Server' 카테고리의 다른 글
TIL39 - flower (0) | 2022.12.11 |
---|---|
TIL38 - redis (0) | 2022.12.11 |
TIL10 - 서버기반인증과 토큰기반인증 (0) | 2022.02.26 |