Study/django

django의 daphne 사용법 정리 - 명령어 실행, 설정 파일로 실행

bluebamus 2024. 7. 15. 00:16

 - 해당 글에는 channel과 관련된 정보를 정리하는게 아닌, asgi 서비스를 위한 daphne 설치 관련 정보만 담는다.

 - channel과 관련된 내용은 reference에 추가 정리만 한다.

 

 - 참고 페이지 : https://fly.io/django-beats/asgi-deployment-options-for-django/

 

ASGI deployment options for Django

Documentation and guides from the team at Fly.io.

fly.io

 

 - 공식 저장소 : https://github.com/django/daphne

 

GitHub - django/daphne: Django Channels HTTP/WebSocket server

Django Channels HTTP/WebSocket server. Contribute to django/daphne development by creating an account on GitHub.

github.com

 

 - channel 공식 문서 내 정보 : https://channels.readthedocs.io/en/stable/deploying.html

 

 

 

 1. 기본 설치 및 설정 방법

   - Daphne 패키지 설치

      - pip 설치

python -m pip install Daphne

pip freeze > requirements.txt

 

   - poetry 설치

poetry add Daphne

 

   - settins.py에 설정

# config/settings.py

INSTALLED_APPS = [
    "daphne",  # 최상위 위치에 입력
    ...,
]

ASGI_APPLICATION = "config.asgi.application"

 

   - 서버 실행

daphne -b 0.0.0.0 -p 8000 config.asgi:application

 

 2. 옵션

usage: daphne [-h] [-p PORT] [-b HOST] [--websocket_timeout WEBSOCKET_TIMEOUT]
              [--websocket_connect_timeout WEBSOCKET_CONNECT_TIMEOUT]
              [-u UNIX_SOCKET] [--fd FILE_DESCRIPTOR] [-e SOCKET_STRINGS]
              [-v VERBOSITY] [-t HTTP_TIMEOUT] [--access-log ACCESS_LOG]
              [--log-fmt LOG_FMT] [--ping-interval PING_INTERVAL]
              [--ping-timeout PING_TIMEOUT]
              [--application-close-timeout APPLICATION_CLOSE_TIMEOUT]
              [--root-path ROOT_PATH] [--proxy-headers]
              [--proxy-headers-host PROXY_HEADERS_HOST]
              [--proxy-headers-port PROXY_HEADERS_PORT] [-s SERVER_NAME]
              [--no-server-name]

 

   - 옵션을 사용한 명령어 실행 방법

daphne -e tcp:port=8000 \
       -t 120 \
       --websocket_timeout 60 \
       --websocket_connect_timeout 20 \
       --ping-interval 20 \
       --ping-timeout 30 \
       --root-path /myapp \
       --proxy-headers \
       -v 2 \
       --application-close-timeout 30 \
       -s my_daphne_server \
       myproject.asgi:application

 

   - 옵션 : 

      1. -p PORT:
         - 설명: Daphne가 사용할 TCP 포트를 지정합니다.

         - 예시: daphne -p 8001

 

      2. -b HOST :
         - 설명: 바인딩할 호스트를 지정합니다.

         - 예시: daphne -b 0.0.0.0

 

      3. --websocket_timeout WEBSOCKET_TIMEOUT:
         - 설명: WebSocket 연결의 타임아웃(초)을 설정합니다.

         - 예시: daphne --websocket_timeout 60

 

      4. --websocket_connect_timeout WEBSOCKET_CONNECT_TIMEOUT:
         - 설명: Daphne가 수신 대기할 엔드포인트 목록을 지정합니다.
         - 예시: daphne --websocket_connect_timeout 30

 

      5. -u UNIX_SOCKET:
         - 설명: UNIX 소켓 경로를 지정합니다

         - 예시: daphne -u /var/run/daphne.sock

 

      6. --fd FILE_DESCRIPTOR:
         - 설명: 파일 디스크립터를 사용하여 소켓을 지정합니다.

         - 예시: daphne --fd 3

 

      7. -e SOCKET_STRINGS:
         - 설명: 여러 소켓 경로나 설정을 콤마로 구분하여 지정합니다.

         - 예시: daphne -e tcp:port=8000,unix:/var/run/daphne.sock

 

      8. -v VERBOSITY:
         - 설명: 로그 출력의 상세도를 설정합니다. (0부터 4까지 가능)
         - 예시: daphne -v 2

 

      9. -t HTTP_TIMEOUT:
         - 설명: HTTP 요청의 타임아웃(초)을 설정합니다.

         - 예시: daphne -t 120

 

      10. --access-log ACCESS_LOG:
         - 설명: Daphne가 수신 대기할 엔드포인트 목록을 지정합니다.
         - 예시: daphne --access-log /var/log/daphne/access.log

 

      11. --log-fmt LOG_FMT:
         - 설명: 로그의 형식을 지정합니다.
         - 예시: daphne --log-fmt '[%(asctime)s] %(levelname)s: %(message)s'

 

      12. --ping-interval PING_INTERVAL:
         - 설명: ping 요청에 대한 타임아웃(초)을 설정합니다.

         - 예시: daphne --ping-timeout 30

 

      13. --ping-timeout PING_TIMEOUT:
         - 설명: ping 요청에 대한 타임아웃(초)을 설정합니다.
         - 예시: daphne --ping-timeout 30

 

      14. --application-close-timeout APPLICATION_CLOSE_TIMEOUT:
         - 설명: 애플리케이션 종료 타임아웃(초)을 설정합니다.

         - 예시: daphne --application-close-timeout 45

 

      15. --root-path ROOT_PATH:
         - 설명: 루트 경로를 설정합니다.

         - 예시: daphne --root-path /myapp

 

      16. --proxy-headers:
         - 설명: 프록시 헤더를 사용합니다.
         - 예시: daphne --proxy-headers

 

      17. --proxy-headers-host PROXY_HEADERS_HOST:
         - 설명: 프록시 헤더의 호스트를 설정합니다.
         - 예시: daphne --proxy-headers-host example.com

 

      18. --proxy-headers-port PROXY_HEADERS_PORT:
         - 설명: 프록시 헤더의 포트를 설정합니다.
         - 예시: daphne --proxy-headers-port 443

 

      19. -s SERVER_NAME:
         - 설명: 서버 이름을 설정합니다.

         - 예시: daphne -s my_daphne_server

 

      20. --no-server-name:
         - 설명: 서버 이름을 사용하지 않음을 설정합니다.

         - 예시: daphne --no-server-name

 

 * daphne은 아직 설정 파일로 실행하는 방버을 지원하지 않는다.

 * 서비스 포트와 SOCKET_STRINGS의 포트가 동일하면 중복 포트 사용의 에러가 발생한다.

 * root-path가 정의되면 redirect시 url에 추가되어 문제가 된다.

 * 테스트 완료한 명령어는 다음과 같다.

daphne -p 8000 -b 0.0.0.0 --websocket_timeout 60 \
--websocket_connect_timeout 20 -v 2 -t 120 \
--access-log /log/uvicorn/daphne.log --ping-interval 20 \
--ping-timeout 30 --application-close-timeout 30 \
-s config config.asgi:application

 

 - reference :

https://gunjoon.tistory.com/54

 

Django Channels 배포

Deubot 프로젝트 Django와 Django Channels로 만든 앱을 배포하기 위해 검색을 한 결과 Nginx, Daphne, Gunicorn 세개의 서버로 구축하게 되었다. Deubot 프로젝트 구조를 간략하게 도식화하면 아래와 같다. 우선

gunjoon.tistory.com

https://blog.mirisu.co.kr/entry/DjangoDaphneSupervisordNginx-%EC%84%A4%EC%A0%95-VI-1

 

장고 channels를 위한 Daphne + nginx + supervisord 서비스 설치

이제 서비스를 위한 준비는 되었습니다. 제가 준비하는 서비스는 django + Channels 서비스입니다. Channels를 사용하려면 asgi를 사용하여 서비스를 하여야 합니다. asgi서비스를 위해서는 uwsgi를 사용하

blog.mirisu.co.kr

https://medium.com/@soverignchriss/chat-application-with-django-channels-htmx-dd8174f59a03

 

Chat Application with Django-channels & Htmx

WebSocket is a computer communications protocol, that provides simultaneous two-way communication channels over a single Transmission…

medium.com

https://sungbinlee.dev/django/django-channels/

 

Django/Channels 실시간 채팅을 구현하려면?

개요 이 문서는 Django 기반의 채팅 서비스를 구축하는 방법에 대해 다룹니다. HTTP Polling, Long Polling, HTTP Streaming, 그리고 WebSocket과 같은 다양한 통신 방식을 소개하며, Redis Pub/Sub를 통한 메시지 전

sungbinlee.dev

https://github.com/ESTsoft-Ormi-1/LiveChatDjango

 

GitHub - ESTsoft-Ormi-1/LiveChatDjango: Django와 Channels를 활용하여 구축한 실시간 채팅 어플리케이션입니

Django와 Channels를 활용하여 구축한 실시간 채팅 어플리케이션입니다. Contribute to ESTsoft-Ormi-1/LiveChatDjango development by creating an account on GitHub.

github.com

https://oraange.tistory.com/22

 

[Django] Channels 사용하기 - 1

Django의 Chaanels는 Django에서 웹 소켓을 사용할 수 있게 해주는 라이브러리이다. Channels는 django에서 HTTP이외의 웹 소켓이나, IoT 프로토콜과 같은 다양한 프로토콜을 지원하기 위해 만들어졌다. Channe

oraange.tistory.com

https://oraange.tistory.com/23?category=1007661

 

[Django] Channels 사용하기 - 2

이 글은 [Django] Channels 사용하기 - 1에서 이어집니다. room view 추가 특정 채팅방에서 게시된 메세지를 볼 수 있는 room view를 추가하도록 하자. chat/templates/chat/room.html파일을 추가하자. chat/ __init__.py t

oraange.tistory.com

https://oraange.tistory.com/24?category=1007661

 

[Django] Channels 사용하기 - 3

이 글은 [Django] Channels 사용하기 - 2에서 이어집니다. 비동기 consumer 작성하기 기존에는 동기적인 consumer를 만들었다. 동기 consumer는 특별한 코드없이 Django 모델에 동기적으로 접근할 수 있어서 편

oraange.tistory.com

https://oraange.tistory.com/25?category=1007661

 

[Django] Channels 사용하기 - 4

이 글은 [Django] Channels 사용하기 - 3에서 이어집니다. views 테스트하기 Selenium을 사용하여 end-to-end 테스트를 할 것이다. 메시지를 보낼 때, 같은 방에 있는 모두가 그 메시지를 보는가 메시지를 보

oraange.tistory.com

https://velog.io/@mimijae/AWSDjango-DRF%EB%A1%9C-%EB%A7%8C%EB%93%A0-%EC%9B%B9%EC%86%8C%EC%BC%93-%EC%B1%84%ED%8C%85%EC%84%9C%EB%B2%84%EB%A5%BC-Docker-nginx-daphne%EB%A5%BC-%EC%9A%A9%ED%95%98%EC%97%AC-AWS-EC2%EC%97%90-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B01

 

[AWS][Django] DRF로 만든 웹소켓 채팅서버를 Docker, nginx, daphne를 이용하여 AWS EC2에 배포하기(1)

이번 포스팅은 저번시간까지 만들었던 웹소켓 채팅을 서버에 배포를 해보고자한다. 나는 github repository에 private로 저장 및 관리를 해오고 있었고 이제 클라우드 플랫폼인 AWS의 EC2에 배포를 해보

velog.io

https://velog.io/@mimijae/AWSDjango-DRF%EB%A1%9C-%EB%A7%8C%EB%93%A0-%EC%9B%B9%EC%86%8C%EC%BC%93-%EC%B1%84%ED%8C%85%EC%84%9C%EB%B2%84%EB%A5%BC-Docker-nginx-daphne%EB%A5%BC-%EC%9A%A9%ED%95%98%EC%97%AC-AWS-EC2%EC%97%90-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B02

 

[AWS][Django] DRF로 만든 웹소켓 채팅서버를 Docker, nginx, daphne를 이용하여 AWS EC2에 배포하기(2)

이제 저번 포스팅에이어 채팅서버를 배포하는 절차를 이어 나가보겠다. github에 있는 내 프로젝트를 git clone하여 EC2 서버에 끌고와야한다. repository가 public으로 되어있다면 git clone하면 바로 될것

velog.io

https://velog.io/@mimijae/AWSDjango-DRF%EB%A1%9C-%EB%A7%8C%EB%93%A0-%EC%9B%B9%EC%86%8C%EC%BC%93-%EC%B1%84%ED%8C%85%EC%84%9C%EB%B2%84%EB%A5%BC-Docker-nginx-daphne%EB%A5%BC-%EC%9A%A9%ED%95%98%EC%97%AC-AWS-EC2%EC%97%90-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B03

 

[AWS][Django] DRF로 만든 웹소켓 채팅서버를 Docker, nginx, daphne를 이용하여 AWS EC2에 배포하기(3)

우분투 업데이트 및 도커 설치 > sudo apt-get update 명령어로 우분투에서 소프트웨어를 설치할때 주로 사용하는 apt-get을 최신정보로 업데이트합니다. > sudo apt install docker.io 명령어로 도커를 설치합

velog.io

https://victorydntmd.tistory.com/265

 

[Django] Django Channels 배포 ( Nginx + Daphne + SSL )

Daphne Django와 WebServer가 주고 받기 위해서는 WSGI 프로토콜을 사용합니다. 이와 관련된 글은 여기를 참고해주세요 ! Django Channels를 배포하기 위해서는 HTTP 요청은 uWSGI 프로토콜로 받고, WS( Web Socket )

victorydntmd.tistory.com

https://victorydntmd.tistory.com/261

 

[Django] 실시간 채팅 - Channels 튜토리얼 (1)

Channels 라이브러리가 개선됨에 따라 해당 시리즈의 내용이 유효하지 않은것 같습니다. 참고용으로만 봐주시길 바라며, 공식 문서를 참고해주세요! [Django] 실시간 채팅 - Channels 튜토리얼 (1) [Django

victorydntmd.tistory.com

https://victorydntmd.tistory.com/262

 

[Django] 실시간 채팅 - Channels 튜토리얼 (2)

Channels 라이브러리가 개선됨에 따라 해당 시리즈의 내용이 유효하지 않은것 같습니다. 참고용으로만 봐주시길 바라며, 공식 문서를 참고해주세요! [Django] 실시간 채팅 - Channels 튜토리얼 (1) [Django

victorydntmd.tistory.com

https://victorydntmd.tistory.com/263

 

[Django] 실시간 채팅 - Channels 튜토리얼 (3)

Channels 라이브러리가 개선됨에 따라 해당 시리즈의 내용이 유효하지 않은것 같습니다. 참고용으로만 봐주시길 바라며, 공식 문서를 참고해주세요! [Django] 실시간 채팅 - Channels 튜토리얼 (1) [Django

victorydntmd.tistory.com

https://victorydntmd.tistory.com/266

 

[Django] Django Channels 스케일 업 ( 대용량 트래픽 해결 )

이전 글에서 Django Channels를 배포하는 방법에 대해 알아보았습니다. ( 링크 )이번에는 Nginx worker, uWSGI worker를 조정하고 또한 Daphne 인스턴스를 늘리고 load balancing을 통해 대용량 트래픽에 대한 해결

victorydntmd.tistory.com