Django + Channels + Gunicorn + Uvicorn + Nginx 조합으로 채팅 기능 배포 시,
아래 디지털 오션 문서를 참고했었는데
그대로 따라해도 채팅 기능이 동작하지 않았다.
여러 삽질 끝에 패키치 재설치 및 설정값을 추가로 줘야 작동하는 것을 확인하였다.
1. Nginx 설정
웹소켓 도메인 처리
location /ws/ {
proxy_pass [ 도메인 또는 Sock EX: http://unix:/run/gunicorn.sock ];
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
2. asgi.py 설정
gunicorn 으로 asgi 테스트 시,
gunicorn --bind 0.0.0.0:8000 [프로젝트 명].asgi -w 4 -k uvicorn.workers.UvicornWorker
위 부분 실행 시, 에러가 발생하였다.
django.setup() 호출 부분을 넣어줬더니 이상없이 동작했다.
찾아보지는 않았지만 gunicorn에서 asgi.py 내의 웹소켓이 포함된 라우팅 부분(직접 만든 소스)을 읽어들이지 못하는 것으로 보인다.
import django
import os
from django.core.asgi import get_asgi_application
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '[Project name].settings')
django.setup()
from [앱 이름] import routing
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
routing.websocket_urlpatterns
)
)
})
3. Uvicorn[standard] 설치
Uvicorn 설치 시, pip install uvicorn 으로 설치하는데 해당 패키지는 웹소켓이 미포함된 것으로 보인다.
이에 따라, pip install 'uvicorn[standard]' 로 재설치해야 채팅 웹소켓이 동작한다.
'Python > Django' 카테고리의 다른 글
loop argument must agree with lock 해결 방법 (0) | 2023.07.10 |
---|