Daphne#
Daphne는 Django Channels를 위해 개발된 HTTP, HTTP2 및 WebSocket 프로토콜 서버이다.
Django 프로젝트 팀에 의해 유지 관리되며 ASGI(Asynchronous Server Gateway Interface) 서버의 참조 구현으로 작동한다.
Django Channels와 함께 사용할 때, Redis나 다른 백엔드를 channel layer로 사용하여 실시간 통신을 구현할 수 있다.
이는 MongoDB의 Change Streams이나 MySQL의 CDC(Change Data Capture)와 같은 실시간 데이터 동기화 기능을 구현할 때 유용하다.
Daphne의 주요 특징#
- 프로토콜 지원: Daphne는 HTTP, HTTP2, WebSocket 프로토콜을 모두 지원한다.
- 자동 프로토콜 협상: Daphne는 들어오는 요청을 자동으로 분석하여 적절한 프로토콜로 처리한다.
- ASGI 호환성: ASGI 애플리케이션과 호환되며, 특히 Django Channels를 위해 설계되었다.
- 개발 및 프로덕션 사용: Daphne는 개발 환경과 프로덕션 환경 모두에서 사용할 수 있다.
Daphne 설치#
pip를 사용하여 Daphne를 설치한다:
Django 프로젝트의 settings.py
파일에 Daphne를 추가한다:
1
2
3
4
| INSTALLED_APPS = [
'daphne',
# 다른 앱들…
]
|
Daphne 설정#
settings.py
파일에 ASGI 애플리케이션 설정을 추가한다:
1
| ASGI_APPLICATION = "myproject.asgi:application"
|
프로젝트의 asgi.py
파일을 다음과 같이 구성한다:
1
2
3
4
5
6
| import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = get_asgi_application()
|
Daphne 실행#
Django 프로젝트에서 Daphne를 실행하려면 다음 명령을 사용한다:
1
| daphne myproject.asgi:application
|
기본적으로 Daphne는 localhost:8000에서 실행되지만, 바인딩 주소와 포트를 지정할 수 있다:
1
| daphne -b 0.0.0.0 -p 8001 myproject.asgi:application
|
주의사항 및 팁#
- 정적 파일 처리: Daphne는 정적 파일 처리에 최적화되어 있지 않으므로, 프로덕션 환경에서는 Nginx와 같은 웹 서버를 함께 사용하는 것이 좋다.
- 환경 변수 설정: Daphne 실행 시 DJANGO_SETTINGS_MODULE 환경 변수를 설정해야 할 수 있다.
- 성능 고려사항: 대규모 프로덕션 환경에서는 여러 Daphne 인스턴스를 실행하고 로드 밸런서를 사용하는 것이 좋다.
- 보안: Daphne를 직접 인터넷에 노출시키는 것보다는 Nginx나 Apache와 같은 검증된 웹 서버 뒤에 두는 것이 보안상 좋다.
프로덕션 환경 설정#
프로덕션 환경에서는 Daphne를 데몬으로 실행하고 Nginx와 함께 사용하는 것이 좋다:
- systemd 서비스 파일을 생성하여 Daphne를 데몬으로 실행한다.
- Nginx를 리버스 프록시로 설정하여 정적 파일 처리와 요청 라우팅을 담당하게 한다.
- WebSocket 요청은 Nginx에서 Daphne로 프록시한다.
Nginx와 함께 사용할 때는 다음과 같은 설정도 고려해야 한다:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # /etc/nginx/sites-available/myproject
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://0.0.0.0:8001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
|
Daphne 환경 설정#
Daphne의 설정은 크게 서버 동작, 성능, 보안, 로깅의 네 가지 카테고리로 나눌 수 있다.
각각의 설정이 어떤 의미를 가지는지 살펴보겠습니다.
다양한 설정 옵션#
기본 서버 설정#
이러한 설정들은 서버의 기본 동작을 결정한다.
1
2
3
4
5
6
7
8
| # daphne_settings.py
DAPHNE_SERVER = {
'bind': '0.0.0.0', # 서버가 바인딩할 주소
'port': 8000, # 리스닝 포트
'unix_socket': '/tmp/daphne.sock', # Unix 소켓 경로 (선택적)
'fd': None, # 파일 디스크립터 (선택적)
'access_log': True, # 접근 로그 활성화
}
|
최적화 설정#
성능과 관련된 설정들은 서버의 처리 능력과 응답 시간에 직접적인 영향을 미친다:
1
2
3
4
5
6
7
8
| # performance_settings.py
DAPHNE_PERFORMANCE = {
'application_close_timeout': 10, # 애플리케이션 종료 대기 시간(초)
'websocket_timeout': 86400, # WebSocket 연결 타임아웃(초)
'http_timeout': 120, # HTTP 요청 타임아웃(초)
'ping_interval': 20, # WebSocket ping 간격(초)
'max_request_size': 1048576, # 최대 요청 크기(바이트)
}
|
보안 설정#
보안 관련 설정은 서버의 안전성을 확보하는 데 중요하다:
1
2
3
4
5
6
7
8
| # security_settings.py
DAPHNE_SECURITY = {
'proxy_headers': True, # 프록시 헤더 처리 활성화
'ssl_cert_file': '/path/to/cert.pem', # SSL 인증서 경로
'ssl_key_file': '/path/to/key.pem', # SSL 키 파일 경로
'ssl_verify_client': False, # 클라이언트 인증서 검증
'websocket_handshake_timeout': 20, # WebSocket 핸드셰이크 타임아웃
}
|
로깅 설정#
로깅은 서버 모니터링과 문제 해결에 필수적이다:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # logging_settings.py
import logging
DAPHNE_LOGGING = {
'log_level': 'INFO', # 로그 레벨 설정
'access_log_format': '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"',
'error_log': '/var/log/daphne/error.log', # 에러 로그 경로
'access_log': '/var/log/daphne/access.log', # 접근 로그 경로
'log_colors': True, # 로그 색상 활성화
}
# 로그 핸들러 설정
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s',
handlers=[
logging.FileHandler('daphne.log'),
logging.StreamHandler()
]
)
|
Channel Layer 설정#
Django Channels와 함께 사용할 때의 Channel Layer 설정이다:
1
2
3
4
5
6
7
8
9
10
11
| # channels_settings.py
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
'hosts': [('redis', 6379)],
'capacity': 1000, # 채널당 최대 메시지 수
'expiry': 60, # 메시지 만료 시간(초)
},
},
}
|
리소스 관리 설정#
시스템 리소스 사용과 관련된 설정:
1
2
3
4
5
6
7
8
| # resource_settings.py
DAPHNE_RESOURCES = {
'worker_connections': 1000, # 워커당 최대 연결 수
'limit_request_line': 4094, # 요청 라인 길이 제한
'limit_request_fields': 100, # 요청 필드 수 제한
'limit_request_field_size': 8190, # 요청 필드 크기 제한
'graceful_timeout': 30, # 그레이스풀 종료 타임아웃
}
|
프로덕션 환경 설정#
실제 운영 환경에서 사용할 때의 추가 설정들:
1
2
3
4
5
6
7
8
9
10
| # production_settings.py
DAPHNE_PRODUCTION = {
'proxy_protocol': False, # PROXY 프로토콜 지원
'proxy_protocol_ports': [443], # PROXY 프로토콜 사용 포트
'http_keepalive': True, # HTTP keepalive 활성화
'http_keepalive_timeout': 5, # keepalive 타임아웃(초)
'statsd_host': 'localhost', # statsd 호스트
'statsd_port': 8125, # statsd 포트
'statsd_prefix': 'daphne', # statsd 메트릭 접두사
}
|
에러 핸들링 설정#
에러 처리와 관련된 설정들:
1
2
3
4
5
6
7
| # error_handling_settings.py
DAPHNE_ERROR_HANDLING = {
'debug': False, # 디버그 모드 비활성화
'error_template': 'errors/500.html', # 에러 페이지 템플릿
'reload': False, # 코드 변경 시 자동 리로드
'verbosity': 1, # 로그 상세도
}
|
이러한 설정들은 서버의 용도와 환경에 따라 적절히 조정되어야 한다.
특히 실제 운영 환경에서는 보안과 성능 관련 설정에 주의를 기울여야 한다.
또한, 모니터링과 로깅 설정을 통해 서버의 상태를 지속적으로 관찰하고 문제가 발생했을 때 신속하게 대응할 수 있도록 해야 한다.
각 설정값들은 서버의 규모, 트래픽 패턴, 하드웨어 리소스 등을 고려하여 최적화되어야 하며, 정기적인 성능 테스트를 통해 조정될 필요가 있다.
시스템 서비스 등록#
Systemd 서비스 파일을 작성#
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
| [Unit]
Description=Daphne ASGI Server
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/path/to/your/project
Environment=DJANGO_SETTINGS_MODULE=myproject.settings
Environment=PYTHONPATH=/path/to/your/project
ExecStart=/path/to/virtualenv/bin/daphne \
-b 0.0.0.0 \
-p 8001 \
--access-log /var/log/daphne/access.log \
--proxy-headers \
myproject.asgi:application
# 자동 재시작 설정
Restart=always
RestartSec=5
# 시스템 리소스 제한
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
|
서비스 파일을 시스템에 등록하고 활성화하는 방법#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 서비스 파일 복사
sudo cp daphne.service /etc/systemd/system/
# systemd 데몬 리로드
sudo systemctl daemon-reload
# 서비스 시작
sudo systemctl start daphne
# 부팅 시 자동 시작 설정
sudo systemctl enable daphne
# 서비스 상태 확인
sudo systemctl status daphne
|
참고 및 출처#
GitHub - django/daphne: Django Channels HTTP/WebSocket server