Web/Django

[Django] Django Channels 배포 서버에서 사용하기 (Apache)

도도9 2020. 9. 6. 00:38

정말 도움이 많이 된 블로그를 먼저 언급하겠다. 설명이 잘 되어있어서 뭘 해야할지 이해하기가 쉬웠다. 

victorydntmd.tistory.com/265

 

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

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

victorydntmd.tistory.com

하지만 내 프로젝트는 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가 잘 작동하는 것을 확인할 수 있다.