사용한 기술 : redis, channels, daphne
프로젝트에서 채팅 시스템은 Django Channels과 WebSocket을 사용하여 구현되었고 daphen 서버와 Redis를 통해 비동기적인 실시간 통신을 처리하였다.
채팅 시스템을 구현하는 동안에 테스트 진행을 위해 postman을 이용해 WebSocket Request를 선택하여 WebSocket 서버를 연결하여 메세지를 전송하는 방식으로 진행하였다.
문제점
ws://localhost:8000/ws/chat/<room_name>/
서버를 연결하려고 시도 했으나 404 Not found 와 함께 서버를 찾을 수 없다는 오류로그를 확인할 수 있었다.
오류 로그를 통해 웹 검색을 해본 결과 같은 8000포트로 HTTP 요청과 WebSocket 요청을 같이 진행할 경우 충돌이 일어나는 것을 알 수 있었다.
해결방법
docker-compose.yml
ports:
- "8000:8000"
- "8001:8001"
redis:
image: redis:alpine
volumes:
- redis_data:/data
Django에서 HTTP 요청을 8000 포트 에서 처리하고 daphen는 ASGI 서버로서 WebSocket 연결을 8001 포트에 처리할 수 있도록 설계하기로 결정을 하였다.
start.sh
set -e
python manage.py migrate
python manage.py collectstatic --no-input
# python manage.py runserver
daphne -b 0.0.0.0 -p 8001 config.asgi:application &
exec gunicorn config.wsgi:application \
--bind 0.0.0.0:8000 \
--workers 5 \
--timeout 30
start.sh 파일에서 기존에 파일에서는 python manage.py runserver으로 Django 개발 서버를 실행하였지만 블로킹 방식으로 작동하므로 이후의 명령은 실행이 되지가 않아
그 이후 daphne -b 0.0.0.0 -p 8001 config.asgi:application & 명령어로 Daphne 서버를 백그라운드에서 실행하게 되면 서버 충돌할 가능성이 생기기에 스크립트 파일을 수정시키도록 하였다.
이후에 WebSocket 서버를 ws://localhost:8001/ws/chat/<room_name>/ 으로 다시 진행한 결과 문제가 해결되었다.
'프로젝트' 카테고리의 다른 글
[GCP] 인증서 관리자를 이용한 SSL 인증서 발급 및 적용 (0) | 2025.01.16 |
---|---|
웹소켓 Operational Error : database timeout or blocking (0) | 2024.12.30 |
Docker 네트워크 오류 (1) | 2024.12.19 |
OpenAI 연결 방법 (2) | 2024.12.19 |
EC2 Amazon Linux 이미지 - 버전 관리 (1) | 2024.12.18 |