본문 바로가기
IT(Tip)

cafe24 우분투 20.04에 파이썬 가상환경, Django, Gunicorn 설치

by good4me 2024. 5. 8.

goodthings4me.tistory.com

afe24 우분투 20.04에 파이썬 가상환경, Django, Gunicorn 설치

 

이전 포스팅(cafe24 가상서버호스팅 우분투 20.04에 파이썬 3.x, MariaDB 10.4 설치)에 이어서 파이썬 가상환경을 설치하고 그 위에서 웹 서비스를 하기 위한 장고(Django)와 Gunicorn 설치 절차를 정리해 봅니다.

 

본 글의 주요 내용은 다음과 같습니다. 

  • 파이썬 가상환경, Django 설치 (VS Code에서 원격으로 서버 접속하기, 장고 프로젝트 생성 후 개발 서버 구동하기)
  • gunicorn 설치(가상환경에서) 및 서비스 등록 (gunicorn 설치 및 접속 테스트, 서버에 Gunicorn 서비스 등록하기)

 

파이썬 가상환경, 장고( Django) 설치

파이썬 가상환경과 장고 설치용 폴더를 생성(mkdir)하고 'python3 -m venv 가상환경명'으로 가상환경을 설치한 후 장고를 설치합니다. 여기에서는 django 4.2 버전을 설치합니다.

root@xxxx:~# mkdir jejedj
root@xxxx:~# cd jejedj/
root@xxxx:~/jejedj# python3 -m venv venv
root@xxxx:~/jejedj# ls
venv
root@xxxx:~/jejedj# source venv/bin/activate
(venv) root@xxxx:~/jejedj#
(venv) root@xxxx:~/jejedj# pip3 install django==4.2
Collecting django==4.2
  Downloading Django-4.2-py3-none-any.whl (8.0 MB)
     |████████████████████████████████| 8.0 MB 22.8 MB/s
Collecting sqlparse>=0.3.1
  Downloading sqlparse-0.5.0-py3-none-any.whl (43 kB)
     |████████████████████████████████| 43 kB 7.4 MB/s
Collecting backports.zoneinfo; python_version < "3.9"
  Downloading backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl (74 kB)
     |████████████████████████████████| 74 kB 1.3 MB/s
Collecting asgiref<4,>=3.6.0
  Downloading asgiref-3.8.1-py3-none-any.whl (23 kB)
Collecting typing-extensions>=4; python_version < "3.11"
  Downloading typing_extensions-4.11.0-py3-none-any.whl (34 kB)
Installing collected packages: sqlparse, backports.zoneinfo, typing-extensions, asgiref, django
Successfully installed asgiref-3.8.1 backports.zoneinfo-0.2.1 django-4.2 sqlparse-0.5.0 typing-extensions-4.11.0
(venv) root@xxxx:~/jejedj#
(venv) root@xxxx:~/jejedj# django-admin --version
4.2
(venv) root@xxxx:~/jejedj#

 

설치한 가상환경에 진입하는 명령은  source venv/bin/activate 입니다.

장고 설치는 pip install django로 하는데, 설치 버전을 지정할 때는 pip install django==4.2 처럼 합니다.

 

VS Code에서 원격으로 서버 접속하기

파이썬 라이브러리 설치, 개발 서버 구동을 위한 명령 등을 putty에서 해도 되지만, 파이썬 가상환경 내에서 라이브러리를 설치하거나 시스템 전체(가상환경  아닌 외부)에 필요한 패키지를 설치해야 하는 경우가 종종 있어서 putty와 VS Code를 병행으로 사용하기 위한  VS Code 원격 서버 접속 방법을 소개합니다.

 

즉, VS Code를 사용해 원격 서버 접속 후 VS Code 터미널에서도 명령을 입력하여 진행할 수 있습니다. 이를 위해서 VS Code 내에서 F1키를 누른 후 아래와 같은 절차로 원격 서버 접속을 합니다.

  • F1 > Remote-SSH: 호스트에 연결… > + 새 호스트에 추가…
  • F1 > 또는 Remote-SSH: 새 호스트에 추가…
  • ssh root@xxx.xxx.xxx.xxx 입력
  • 비밀번호 입력

자세한 사항은 아래 내용 참고

 

[Visual Studio Code] VS Code로 원격 서버 remote-ssh 연결 절차 (원격 서버 접속하는 방법)

이전 포스팅 "cafe24 가상서버호스팅 신청하고 서버 셋팅과 파이썬 장고 설치하기"에 이어서 Visual Studio Code로 SSH를 통해 원격 서버에 접속하기 위한 remote-ssh 연결 절차를 알아본다. VS Code로 SSH를

goodthings4me.tistory.com

 

장고 프로젝트 생성 후 개발 서버 구동하기

vs code에서 source venv/bin/activate로 가상환경에 접속한 후 아래 명령으로 장고 프로젝트를 생성하면 config 폴더가 생성되고 그 안에 settings.py, urls.py 등의 파일을 볼 수 있습니다.

(venv) root@xxxx:~/jejedj# django-admin startproject config .

 

다음으로, mariaDB 사용을 위해 mysqlclient 설치가 필요합니다. 

 

이 설치를 위해서 mysqlclient 패키지 빌드에 필요한 libmariadb-dev, pkg-config 패키지를 우선 설치해야 하는데, putty에서 시스템 전체에 적용되는 libmariadb-dev와 pkg-config를 설치한 후

root@xxxx:~# sudo apt update
root@xxxx:~# sudo apt install libmariadb-dev build-essential
root@xxxx:~# sudo apt install pkg-config
root@xxxx:~# sudo apt install libssl-dev

 

그 다음에 vs code 가상환경에서 mysqlclient를 설치하는 것이 일반적인 절차라고 합니다.

(venv) root@xxxx:~/jejedj# pip3 install mysqlclient

 

보통은 순서적으로 장고를 설치하고 프로젝트 생성 후 migrate(sqlite db) 진행하는데, 여기서는 Gunicorn, Nginx 설치하고 MariaDB 기반으로 migrate할 것이기 때문에 장고 프로젝트만 생성하고 개발 서버를 구동해 봅니다.

▶ 개발 서버 구동

(venv) root@xxxx:~/jejedj# python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
April 20, 2024 - 10:48:34
Django version 4.2, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

 

python manage.py runserver 명령으로 개발 서버 구동하고, VS Code 하단 팝업창 클릭 시 브라우저에서 http://localhost:8000/ 으로 접속 됨

 

cafe24 IP로 접속(http://xxx.xxx.xxx.xxx) 할 수 있는지 테스트 하기 위해서는 settings.py 파일의 ALLOWED_HOSTS = [ ]를 ALLOWED_HOSTS = [''] 로 수정하고 로컬서버 구동 명령을 python3 manage.py runserver 0:80 또는 python3 manage.py runserver 0.0.0.0:80 으로 한 후 접속해 봅니다.

 

IT, 전자제품 선물

 

gunicorn 설치(가상환경에서) 및 서비스 등록

whereis 명령으로 확인해보면 서버에 gunicorn이 설치되지 않았음을 알 수 있다.

(venv) root@xxxx:~/jejedj# whereis gunicorn
gunicorn:
(venv) root@xxxx:~/jejedj#

 

gunicorn 설치(가상환경에서 설치함) 및 접속 테스트

(venv) root@xxxx:~/jejedj# pip3 install gunicorn
Collecting gunicorn
  Downloading gunicorn-22.0.0-py3-none-any.whl (84 kB)
     |████████████████████████████████| 84 kB 6.4 MB/s
Collecting packaging
  Downloading packaging-24.0-py3-none-any.whl (53 kB)
     |████████████████████████████████| 53 kB 7.8 MB/s
Installing collected packages: packaging, gunicorn
Successfully installed gunicorn-22.0.0 packaging-24.0

(venv) root@xxxx:~/jejedj# whereis gunicorn
gunicorn: /root/jejedj/venv/bin/gunicorn
(venv) root@xxxx:~/jejedj#
(venv) root@xxxx:~/jejedj# gunicorn --bind 0:8000 config.wsgi:application
[2024-04-19 16:07:24 +0900] [66766] [INFO] Starting gunicorn 22.0.0
[2024-04-19 16:07:24 +0900] [66766] [INFO] Listening at: http://0.0.0.0:8000 (66766)
[2024-04-19 16:07:24 +0900] [66766] [INFO] Using worker: sync
[2024-04-19 16:07:24 +0900] [66768] [INFO] Booting worker with pid: 66768
Not Found: /static/admin/css/fonts.css
Not Found: /favicon.ico

 

gunicorn 실행 명령(gunicorn --bind 0:8000 config.wsgi:application)은 PuTTy가 아닌 VS Code에서 해야 브라우저에서 http://localhost:8000로 접속할 수 있습니다.

 

--bind 0:8000은 8000번 포트로 WSGI 서버를수행한다는 의미이고, config.wsgi:application은 WSGI 서버와 연결된 WSGI 애플리케이션이 config/wsgi.py 파일의 application이라는 의미입니다.

 

config 폴더 밑에 보면 wsgi.py 파일이 있습니다.

import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
application = get_wsgi_application()

 

※ 참고 사항

gunicorn은 유닉스 소켓 방식(--bind unix:/tmp/gunicorn.sock)으로는 실행할 수 없기 때문에 NginX(웹 서버)가 필요하고 NginX 웹 서버에 gunicorn 서비스를 등록하여 운영하는데, 우분투 20.04에서 유닉스 소켓 방식으로 gunicorn을 사용하기 위해서 gunicorn 서비스 등록이 필요함.

 

서버에 Gunicorn 서비스 등록하기

(venv) root@xxxx:~/jejedj# ls /etc/systemd/system
dbus-fi.w1.wpa_supplicant1.service      mariadb.service.d            sockets.target.wants

 

ls /etc/systemd/system 명령으로 gunicorn.service가 없음을 확인한 후 /etc/systemd/system/ 디렉토리에 gunicorn.service 파일을 생성합니다.

(venv) root@xxxx:~/jejedj# vi /etc/systemd/system/gunicorn.service

 

※ vi 편집기 사용

vi 에디터가 활성화 되면
i 누르고 insert 모드에서 아래 내용을 복사 & 붙여넣기 후

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=root
Group=root
WorkingDirectory=/root/jejedj
ExecStart= /root/jejedj/venv/bin/gunicorn \
        --workers 4 \
        --bind unix:/tmp/gunicorn.sock \
        config.wsgi:application

[Install]
WantedBy=multi-user.target

 

ESC 누르고

:wq! 엔터

명령으로 저장합니다.

(그냥 나갈 때는 :q! 엔터)

 

▶ 위 gunicorn.service 코드 내용을 설명하면,

  • User, Group은 <서버 계정>
  • WorkingDirectory는 작업 디렉토리로 manage.py가 있는 폴더이고,
  • ExecStart는 gunicorn 설치 경로 (가상 환경에서 설치했기 때문에 위와 같이 되며, whereis gunicorn 명령으로 알 수 있음)
  • --workers 2 는 CPU 코어(Core) 개수를 의미하는 것으로 Gunicorn 프로세스를 2개 사용하라는 의미 (gunicorn Document에서 권장하는 worker process 개수는 Core 수 * 2 +1개이며, grep -c processor /proc/cpuinfo 명령으로 확인 가능)
  • --bind unix:/tmp/gunicorn.sock은 bind 할 소켓을 지정함 (unix:PATH를 사용하면 소켓 파일을 생성하는 것으로 PATH 즉, /tmp/gunicorn.sock/ 파일이 생성되며, 이 소켓 파일은 nginx에서 gunicorn으로의 reverse proxy를 구성할 때 path로 지정할 수 있음)
  • config.wsgi:application는 장고에서 wsgi.py가 있는 위치와 wsgi 애플리케이션을 지정함

여기서 장고의 프로젝트 폴더라는 개념이 좀 모호하게 느껴질 수 있어서 이 부분을 설명하면,

 

"django-admin startproject 프로젝트명" 명령을 실행하면 프로젝트명의 폴더(작업폴더)가 생성되고, 그 안에 manage.py 파일, 프로젝트명과 같은 폴더가 하나 더 생성된 것을 볼 수 있는데, 그 프로젝트명 안에 asgi.py, settings.py, urls.py, wsgi.py 등 장고 운영에 필요한 설정 파일이 있습니다.


위에서 mkdir borame를 한 후 cd borame하고 "django-admin startproject config ."로 했는데,

이렇게 프로젝트명을 config로 한 것은 작업 폴더인 borame와 헷갈리지 않게 하기 위한 것과 장고 운영 파일이 있는 폴더이기도 해서 config로 많이 사용한다고 합니다.


그리고 작업폴더 명칭은 변경해도 되지만 프로젝트명인 config는 변경할 수 없다는 점을 알아야 합니다.


결론적으로, manage.py 파일이 있는 borame 폴더는 작업 폴더, settings.py 파일이 있는 config는 프로젝트 폴더, 나머지 "django-admin startapp 앱명"으로 생성된 폴더는 앱폴더라고 기억하면 햇갈리지 않습니다.

 

위 vi 에디터 명령 실행 후 /etc/systemd/system/에 gunicorn.service 파일이 생성됩니다.

(venv) root@xxxx:~/jejedj# ls /etc/systemd/system
dbus-fi.w1.wpa_supplicant1.service      gunicorn.service             sleep.target.wants

 

위 명령 이외에 (venv) root@xxxx:~/jejedj# cat /etc/systemd/system/gunicorn.service 명령으로 내용을 확인할 수 있습니다.

 

이외에 gunicorn 실행, 상태 확인 등에 대한 명령을 정리해 봅니다.

 

"gunicorn.sock" 파일이 존재하는지, 해당 파일에 대한 권한 및 소유자 확인 명령

(venv) root@xxxx:~/jejedj# ls -l /tmp/gunicorn.sock

 

gunicorn 프로세스가 실행 중인지 확인

(venv) root@xxxx:~/jejedj# ps aux | grep gunicorn
root 65739 0.0 0.0 6432 660 pts/0 S+ 20:24 0:00 grep --color=auto gunicorn

 

gunicorn 서비스 시작, 중지, 상태 확인, 서버 시작 시 서비스 자동 시행 등록 명령

gunicorn 서비스 중지
sudo systemctl stop gunicorn.service

gunicorn 서비스 시작
sudo systemctl start gunicorn.service

gunicorn 서비스 상태 확인
sudo systemctl status gunicorn.service

서버 시작 시 gunicorn 서비스 자동 실행
sudo systemctl enable gunicorn.service

 

 

(venv) root@xxxx:~/jejedj# sudo systemctl daemon-reload
(venv) root@xxxx:~/jejedj# sudo systemctl start gunicorn.service
(venv) root@xxxx:~/jejedj# sudo systemctl status gunicorn.service
● gunicorn.service - gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-04-19 16:35:15 KST; 6s ago
   Main PID: 67045 (gunicorn)
      Tasks: 5 (limit: 1125)
     Memory: 106.9M
     CGroup: /system.slice/gunicorn.service
             ├─67045 /root/jejedj/venv/bin/python3 /root/jejedj/venv/bin/gunicorn --workers 4 --bind >
             ├─67054 /root/jejedj/venv/bin/python3 /root/jejedj/venv/bin/gunicorn --workers 4 --bind >
             ├─67055 /root/jejedj/venv/bin/python3 /root/jejedj/venv/bin/gunicorn --workers 4 --bind >
             ├─67056 /root/jejedj/venv/bin/python3 /root/jejedj/venv/bin/gunicorn --workers 4 --bind >
             └─67057 /root/jejedj/venv/bin/python3 /root/jejedj/venv/bin/gunicorn --workers 4 --bind >

Apr 19 16:35:15 jeje.cafe24.com systemd[1]: Started gunicorn daemon.
Apr 19 16:35:15 jeje.cafe24.com gunicorn[67045]: [2024-04-19 16:35:15 +0900] [67045] [INFO] Startin>
Apr 19 16:35:15 jeje.cafe24.com gunicorn[67045]: [2024-04-19 16:35:15 +0900] [67045] [INFO] Listeni>
Apr 19 16:35:15 jeje.cafe24.com gunicorn[67045]: [2024-04-19 16:35:15 +0900] [67045] [INFO] Using w>
Apr 19 16:35:15 jeje.cafe24.com gunicorn[67054]: [2024-04-19 16:35:15 +0900] [67054] [INFO] Booting>
Apr 19 16:35:15 jeje.cafe24.com gunicorn[67055]: [2024-04-19 16:35:15 +0900] [67055] [INFO] Booting>
Apr 19 16:35:16 jeje.cafe24.com gunicorn[67056]: [2024-04-19 16:35:16 +0900] [67056] [INFO] Booting>
Apr 19 16:35:16 jeje.cafe24.com gunicorn[67057]: [2024-04-19 16:35:16 +0900] [67057] [INFO] Booting>
lines 1-21/21 (END)

 

gunicorn.service - gunicorn daemon 부분에서 녹색( )이고, Active: active면 정상 실행 상태입니다.

 

 

다음 포스팅은 'Nginx를 설치(정적 파일 제공 설정 포함)하고 Gunicorn 연동 프록시 서버로 설정하는 방법'과 ' 무료 SSL을 설정하기 위해 Let's Encript SSL 설치'  절차에 관한 내용을 올립니다.

 

댓글