ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] Django Channels 배포 서버에서 사용하기 (Apache)
    Web/Django 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가 잘 작동하는 것을 확인할 수 있다. 

Designed by Tistory.