제수기 - 제발 수업내용을 기억해라 / 단순 수업정리 시리즈
우리가 사용하는 프로그래밍 언어는 python이다. 이걸로 웹앱을 만들 때, django라는 프레임워크를 사용하지만 장고만 있는 게 아니다. fastapi, flask 등 여러가지가 있다. 이걸 가지각색으로 웹앱을 만들어버리면 안되니까 구조에 대한 약속이라고 보면 된다. 이런 프레임워크들은 WSGI나 규격에 맞춰서 만들어진 제품들이다. Djago는 WSGI를 구현한 프레임워크였다. 동기적인 프레임워크. 이게 직렬방식이라 웹 방식에서 조금 한계가 있어서 나중에는 flask 비동기 방식도 쓰게 된다.
원래는 동기적 처리 WSGI라는 개념이 있었는데, 이걸 상속해서 비동기처리까지 되는 ASGI라는 규격이 나온거다. ASGI를 하면 동기적, 비동기적 처리 모두 할 수 있다.
동기적 처리를 한다는 것
이거는 개발용이고, 이제 더이상 이걸 안 쓰고, WSGI 방식을 지원하는 gunicorn을 이용해서 django를 배포하게 된다. 이걸 바로 테스트하면 좋은데 윈도우에서 안 돌아간다. 설치는 할 수 있는데 안 돌아간다. 그래서 얘는 어쩔 수 없이 리눅스 환경에서 돌려봐야 한다. 리눅스 환경에서 돌려보려면 docker를 일단 이용해보겠다. docker는 일단 기본적으로 리눅스 후에 돌아가는 거라서.
코드..
내부 서버인 런서버로 돌려보면 여러개로 쓰이지가 않는다. 병렬처리가 안 되는 건 아닌데 잘 안 된다.
gunicorn이용해서 처리해보자
환경변수 명령 env
루트 밑에 앱이라는 디렉토리를 만들고 거기서 작업을 하겠다.
여기 내용을 리눅스 안에 app에 넣어주세요
구니콘, -c 옵션. gunicorn.conf.py "실행할 거 이름"
expose 8000 나중에 8000번 호스트를 배포해주세요. 로컬 8000과 나중에 연결될 수 있게.
구니콘은 멀티 프로세스를 위한 패키지다. 실제 CPU에 따라서 멀티 프로세스 수가 정해진다. 그걸 정해주는 게 wokers.
물리코어가 6이면 논리코어를 12로 해줘서 ? 실제로는 25개의 멀티프로세스를 띄워주게 된다.
timeout = 30 최대 30초까지 기다렸다가 안 되면 오류를 내라.
i/o bound면 쓰레드는 2~4개 / cpu bound면 1~2개 추천
콘솔
docker build -t django-wsgi .
.은 dockerfile 경로다.
docker image ls
로 확인
docker run -d -p 8000:8000 django-wsgi
호으트에 8000번으로 요청이 오면 8000번으로 응답?하겠다.
그러면 실제 접속을 해보면 구니콘을 실행해보면
PID가 다르다. 실제로 요청이 들어올 때 나눠주고 있는 것.
docker rm -f 이름
삭제
ASGI 버전
WSGI를 사용하려면 gunicorn을 사용하고
ASGI 버전은 uvicorn을 사용한다.
requriments.txt에 unicorn도 넣어놔야 한다.
views에 동기적 처리 sync 비동기 async 모두 만들어놨다.
실행 코드가 다르다. wsgi가 아니라 asgi.
docker run -d -p 8000:8000 django-asgi
docker ps -a
5초 기다리지만 병렬로 처리된다. 하나가 끝나자마자 아래도 끝난다. 멀티 쓰레드를 이용한 처리를 하고 있다.
async로 요청을 보내면 이벤트 루프 기반으로 하기 때문에 쓰레드까지도 하나다.
제일 좋은 건 multi-process - 구니콘
multi-thread or eventloop(single thread)로 하면 io 기반도 처리할 수 있다. - 유비콘
실제로는 이 두개를 섞어서 쓴다.
이걸 준비해놓은 게 wsgi-asgi
dockerfile에서 이렇게 다르다.
워커 프로세스를
구비콘이 여러 개의 워커를 제어하고
유니콘은 멀티 쓰레드는 이벤트 루프를 제어한다.
아래처럼 써주면 이제 둘 다 쓰게 되는 거다.
docker ps -a
docker rm -f 907
docker run -d -p 8000:8000 django-wsgi-..놓침
멀티프로세스로 작동
보통 배포 환경에서 아래와 같이 작동시킨다.
docker 명령어
FROM
LABEL
ENTRYPOINT
...
관례적으로 대문자.
docker build -t 도커허브username / django-wsgi(이미지 이름) / (tag 이름. 생략하면 자동으로 latest)
docker run -d -p 8000:8000 dockerhubusername/django-wsgi-asgi
docker ps -a
docker logs 컨테이너id
컨테이너 통해서 사이트 열 때, 앞에 localhost: 붙여주기.
다른 브라우저에서 똑같은 링크 넣어주면 PID 프로세스 아이디와 쓰레드 수가 다른 걸 볼 수 있다... 근데 방금 뭔가 실수했는지 똑같이 나왔다ㅠㅠ 이렇게 나오면 내장런으로 돌린 게 되는 건데ㅎㅎ..
질문 드려보니까 그냥 우연으로 저렇게 겹칠 수 있다고 한다. 새로고침하니까 잘 나온다.