[Django] Django Channels 배포 서버에서 사용하기 (Apache)
정말 도움이 많이 된 블로그를 먼저 언급하겠다. 설명이 잘 되어있어서 뭘 해야할지 이해하기가 쉬웠다.
하지만 내 프로젝트는 Apache를 사용해서 배포하기 때문에 따로 또 많이 찾아봐야 했어서 기록을 남겨본다.
1. ASGI.py 수정
asgi.py를 아래와 같이 수정한다.
import os
import django
from django.core.asgi import get_asgi_application
from channels.routing import get_default_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '프로젝트이름.settings')
django.setup()
application = get_default_application()
2. settings.py 수정
settings.py에 아래의 line을 추가해준다.
ASGI_APPLICATION = '프로젝트이름.routing.application'
이제 manage.py 파일이 있는 폴더에서 아래의 명령어를 입력하면 daphne 서버가 돌아가기 시작한다.
daphne -b 0.0.0.0 -p 8000 프로젝트이름.asgi:application
해당 서버의 8000 포트로 가면 daphne 서버가 돌아가는 것을 확인할 수 있다. 예를 들어서 사용하는 도메인이 project.cafe24.com 이라면 project.cafe24.com:8000 으로 들어가면 daphne 서버에 접속할 수 있다.
하지만 이렇게 들어가면 css와 같은 정보들이 전혀 처리가 되지 않음을 확인할 수 있다.
따라서 daphne만 사용할 수는 없기 때문에 daphne도 계속 데몬으로 실행되게 돌려주고 apache 서버도 계속 사용해야한다.
3. daphne.service
vim /etc/systemd/system/daphne.service
[Unit]
Description=daphne daemon
[Service]
User=root
Group=root
WorkingDirectory={ manage.py가 있는 directory 절대주소 }
Environment="DJANGO_SETTINGS_MODULE={ 프로젝트이름 }.settings"
ExecStart=/home/dodo/.virtualenvs/django/bin/daphne -b 0.0.0.0 -p 8000 { 프로젝트 이름}.asgi:application
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-abort
PrivateTmp=true
StandardError=file:/tmp/daphne-error.log
[Install]
WantedBy=multi-user.target
위와 같은 파일을 만들고 나서
sudo service daphne restart
하면 아까 들어가보았던 서버의 8000 port로 계속 들어가지는 것을 확인할 수 있다.
daphne를 종료하려면 아래와 같은 명령어를 사용하면 된다.
sudo service daphne stop
4. apache conf 설정
이제 이 포스트를 쓰게 된 이유인 apache configuration이다.
기존의 conf 파일이 이렇게 되어 있었는데
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /home/dodo/project/django_project/photo>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess photo python-path=/home/dodo/project/django_project python-home=/home/dodo/.virtualenvs/django_environment
WSGIProcessGroup photo
WSGIScriptAlias / /home/dodo/project/django_project/photo/wsgi.py
</VirtualHost>
아래의 부분을 추가해주었다.
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://project.cafe24.com:8000%{REQUEST_URI} [P,QSA,L]
합치면 아래와 같다.
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://project.cafe24.com:8000%{REQUEST_URI} [P,QSA,L]
<Directory /home/dodo/project/django_project/photo>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess photo python-path=/home/dodo/project/django_project python-home=/home/dodo/.virtualenvs/django_environment
WSGIProcessGroup photo
WSGIScriptAlias / /home/dodo/project/django_project/photo/wsgi.py
</VirtualHost>
5. a2enmod
필요한 apache2 module들을 활성화 시켜주지 않으면 이유도 모른채 디버깅 하느라 많은 시간을 낭비할 수도 있다. 그러니 꼭 잊지 말자.
개인적으로 나에게 필요한 module들은 아래와 같았다.
a2enmod rewrite
a2enmod proxy_http
a2enmod proxy_wstunnel
이제 아래의 명령어로 서버에 지금까지의 설정을 반영시켜보자
sudo service apache2 restart
그러면 배포 서버에서 django channels가 잘 작동하는 것을 확인할 수 있다.