SW개발/Django

[Django]Django + Nginx + Gunicorn 연동하기 1

저번 포스팅에서는 가상환경 설정과 그 위에 Django 를 설치하였다.

이번에는 Django, Nginx, Gunicorn 을 서로 연동하는 작업을 해볼 것이다.

 

Gunicorn 사용 이유

"Django의 내장서버 (runserver)는 실서비스에 부적합하다"

Django 에는 개발용으로 runserver 라는 내장 서버를 탑재하고 있다. 실제 서비스를 하기 전에 개발을 하면서 이용하게 되는 서버이다.

특징 중 하나는 소스코드의 수정이 이루어지면 이를 detect 하여 바뀐 것이 있을 경우 서버를 reload 하게 된다.

하지만 실제 서비스를 하기에 성능상의 한계, 보안 등 다양한 문제점이 존재해 was + wsgi 조합(Nginx + Gunicorn)을 사용하게 된다.

 

Django.core.servers.basehttp 파일

```
DON'T USE IT FOR PRODUCTION USE!
```

위의 파일에 아래와 같은 문구가 주석으로 담겨져 있다. 즉 실제 서비스에 runserver 를 이용하면 안된다는 뜻을 내포하고 있다.

이러한 이유로 사용할 수 없는 것을 알게되었고, gunicorn 을 가상환경에 설치할 것이다.

 

Gunicorn 설치

$ (venv) $ pip install gunicorn # gunicorn 설치

pip 로 간단하게 Guniciorn 을 설치할 수 있다. 

 

Gunicorn 실행

(venv) $ gunicorn --bind 0:8000 앱이름.wsgi:application
# 포트와 앱이름을 설정하여 위의 명령으로 구니콘을 실행할 수 있다.

[2021-02-22 17:14:41 +0900] [29741] [INFO] Starting gunicorn 20.0.4
[2021-02-22 17:14:41 +0900] [29741] [INFO] Listening at: http://0.0.0.0:8000 (29741)
[2021-02-22 17:14:41 +0900] [29741] [INFO] Using worker: sync
[2021-02-22 17:14:41 +0900] [29744] [INFO] Booting worker with pid: 29744

위의 명령어를 통해 Gunicorn 을 실행할 수 있고 위와 같은 메시지가 출력된다면 정상적으로 서버를 구동시켰다고 볼 수 있다.

즉, python manage.py runserver 0:8000 의 명령어를 대체한 것이다.

 

Gunicorn 서비스 등록하기

지금까지의 설정은 runserver를 실행시킨 것과 동일하다. 이제부터는 systemd에 서비스 파일을 등록하여 서버가 재시작할때 Gunicorn 도 실행되도록 설정해볼 것이다.

# vi /etc/systemd/system/gunicorn.service 파일 생성하기 (파일명은 바뀌어도 상관없다)

[Unit]
Description=gunicorn daemon (설명란)
After=network.target

[Service]
User=root (실행할 계정)
Group=root (실행할 그룹)
WorkingDirectory=프로젝트 경로 (ex : /test/django/mysite
ExecStart=gunicorn이 설치된 가상환경 위치(ex: /test/django/venv/bin/gunicorn) --bind 127.0.0.1:8000 mysite(앱이름).wsgi:application

[Install]
WantedBy=multi-user.target

 

시스템 데몬 재시작

(venv) $ sudo systemctl daemon-reload
# 데몬 리로드

서비스를 새로 등록하거나 수정할 경우 데몬을 리로드 해주어야 한다.

 

서비스 실행하고 등록하기

(venv) $ sudo systemctl start gunicorn # 작성한 서비스 실행하기
(venv) $ sudo systemctl enable gunicorn # 서버 재시작시 자동으로 실행
(venv) $ sudo systemctl status gunicorn.service # 실행한 서비스 상태 보기
(venv) $ sudo systemctl stop gunicorn # 서비스 중지
(venv) $ sudo systemctl restart gunicorn # 서비스 재시작

차례대로 start(실행) -> enable(자동) -> status(상태 확인) 의 과정을 거치고 나면 아래와 같이 성공적으로 Gunicorn 이 실행됨을 확인할 수 있다.

 

Gunicorn 실행 확인

(venv) $ sudo systemctl status gunicorn-django.service
# 실행 상태 확인

● gunicorn-django.service - gunicorn daemon
   Loaded: loaded (/etc/systemd/system/gunicorn-django.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-02-22 16:22:49 KST; 1h 3min ago
 Main PID: 26718 (gunicorn)
    Tasks: 2
   Memory: 43.6M
      CPU: 936ms
   CGroup: /system.slice/gunicorn-django.service
           ├─26718 /practice/python_projects/django/venv/bin/python3.6 /practice/python_projects/django/venv/bin/gunicorn --bind
           └─26724 /practice/python_projects/django/venv/bin/python3.6 /practice/python_projects/django/venv/bin/gunicorn --bind

Feb 22 16:22:49 pd135 systemd[1]: Stopped gunicorn daemon.
Feb 22 16:22:49 pd135 systemd[1]: Started gunicorn daemon.
Feb 22 16:22:49 pd135 gunicorn[26718]: [2021-02-22 16:22:49 +0900] [26718] [INFO] Starting gunicorn 20.0.4
Feb 22 16:22:49 pd135 gunicorn[26718]: [2021-02-22 16:22:49 +0900] [26718] [INFO] Listening at: http://127.0.0.1:8000 (26718)
Feb 22 16:22:49 pd135 gunicorn[26718]: [2021-02-22 16:22:49 +0900] [26718] [INFO] Using worker: sync
Feb 22 16:22:49 pd135 gunicorn[26718]: [2021-02-22 16:22:49 +0900] [26724] [INFO] Booting worker with pid: 26724
Feb 22 17:03:28 pd135 gunicorn[26718]: Not Found: /favicon.ico

정상적으로 실행될 경우 위와 비슷한 메시지가 나오게 된다. runserver 를 실행하였을 때와 마찬가지로 해당 링크 http://127.0.0.1:8000

에 접속해보면 정상적으로 장고 기본 페이지를 볼 수 있다.

여기까지 완료하였다면 Django와 Gunicorn을 연동하게 된 것이다.

 

다음 포스팅에서는 Nginx 까지 연동하여 Django + WAS(Nginx) + wsgi(Gunicorn)를 구성하는 방법에 대해 알아볼 것이다.

 

728x90