프레임워크 설치 · 10 min read · Oct 14, 2025

우분투 22.04에 Django 파이썬 프레임워크 설치하는 방법

Django는 동적 웹사이트 및 애플리케이션 개발에 사용되는 파이썬 프레임워크입니다. MVC(모델-뷰-컨트롤러) 아키텍처를 따릅니다. Django를 사용하면 대부분의 기본 작업이 처리되므로 개발 프로세스가 빨라집니다.

이 튜토리얼에서는 우분투 22.04 서버에 Django 프레임워크를 설치하는 방법을 배웁니다. 또한 데모 프로젝트를 생성하고 테스트할 것입니다.

전제 조건

  • 우분투 22.04가 실행되는 서버.
  • 비루트 sudo 사용자.
  • 모든 것이 업데이트되었는지 확인하십시오. $ sudo apt update $ sudo apt upgrade

Django 설치

Django를 설치하는 방법에는 여러 가지가 있습니다. 어떤 방법이 가장 적합한지는 개발 환경을 구성하는 방법과 필요에 따라 다릅니다. 각 방법에는 장단점이 있습니다. 이 모든 방법을 살펴보겠습니다.

우분투 저장소에서 설치

Django를 설치하는 가장 간단한 방법은 우분투의 저장소를 사용하는 것입니다. 우분투 22.04는 Python 3.10과 함께 제공됩니다. 다음 명령어를 사용하여 확인할 수 있습니다.

$ python3 -V
Python 3.10.4

다음 명령어를 사용하여 Django를 설치합니다.

$ sudo apt install python3-django

다음 명령어를 실행하여 성공적으로 설치되었는지 확인합니다.

$ django-admin --version
3.2.12

우분투와 함께 제공되는 Django 버전은 2024년까지 지원되는 현재 LTS 버전입니다. 그러나 현재 버전은 아닙니다. 최신 릴리스를 설치하려면 이 방법은 적합하지 않습니다.

pip를 사용하여 설치

이것은 Django를 설치하는 가장 일반적인 방법입니다. 권장되는 방법은 가상 Python 환경을 만드는 것입니다. 이렇게 하면 시스템에 영향을 주지 않고 Python 패키지를 설치할 수 있습니다.

pipvenv 모듈을 설치합니다. venv는 Python 가상 환경을 만드는 데 사용되며 pip는 Python 패키지를 설치합니다.

$ sudo apt install python3-pip python3-venv

데모 프로젝트 디렉토리를 생성합시다.

$ mkdir ~/sampleproject
$ cd ~/sampleproject

다음 명령어를 사용하여 가상 환경을 생성합니다. sample_env를 원하는 가상 환경 이름으로 바꾸십시오.

$ python3 -m venv sample_env

이렇게 하면 프로젝트 디렉토리에 Python, pip의 휴대용 버전이 설치됩니다. 프로젝트에 패키지를 설치하려면 다음 명령어를 사용하여 환경을 활성화해야 합니다.

$ source sample_env/bin/activate

셸 프롬프트가 가상 환경을 반영하도록 변경됩니다.

(sample_env) navjot@django:~/sampleproject$

이제 가상 환경이 활성화되었으므로 pip를 사용하여 Django를 설치합니다. 다음 명령어를 실행하여 Django를 설치합니다.

(sample_env) $ pip install django

설치를 확인합니다.

(sample_env) $ django-admin --version
4.0.5

프로젝트 요구 사항에 따라 다음과 같은 방법으로 다른 버전의 Django를 설치할 수 있습니다.

(sample_env) $ pip install django==3.2.1

설치를 확인합니다.

(sample_env) $ django-admin --version
3.2.1

보시다시피, 이 방법은 우분투 저장소에서 얻은 버전보다 최신 버전의 Django를 설치합니다.

가상 환경에서 나가려면 다음 명령어를 실행합니다.

(sample_env) $ deactivate

개발 버전 설치

pip를 사용하여 Django의 개발 버전을 설치할 수도 있습니다. 이를 위해 Django의 Github 저장소에서 개발 버전을 가져옵니다.

다음 명령어를 사용하여 ~/django-dev 디렉토리에 저장소를 클론합니다.

$ git clone https://github.com/django/django ~/django-dev

새로 생성된 디렉토리로 전환합니다.

$ cd ~/django-dev

가상 환경을 생성합니다.

$ python3 -m venv dev_django_env

환경을 활성화합니다.

$ source dev_django_env/bin/activate

pip를 사용하여 Django를 설치합니다. -e 플래그는 버전 제어에서 설치할 때 필요한 편집 가능한 모드로 설치합니다.

(dev_django_dev) $ pip install -e ~/django-dev

설치를 확인합니다.

(dev_django_dev) $ django-admin --version
4.2.dev20220628195651

보시다시피, 여기의 버전은 최신 개발 버전입니다. Django의 개발 버전은 프로덕션 환경에서는 유용하지 않습니다.

샘플 프로젝트 생성

샘플 Django 프로젝트를 만들어 보겠습니다. 샘플 프로젝트를 위한 디렉토리를 생성합니다.

$ mkdir ~/dj-sample
$ cd ~/dj-sample

Python 가상 환경을 생성합니다.

$ python3 -m venv sample_proj

환경을 활성화합니다.

$ source sample_proj/bin/activate

Django를 설치합니다.

(sample_proj) $ pip install django

프로젝트를 빌드하려면 startproject 명령어를 사용해야 합니다. 이 명령어는 다음을 포함하는 또 다른 디렉토리를 생성합니다:

  • Django 특정 작업을 관리하는 데 사용되는 관리 스크립트인 manage.py
  • 프로젝트 코드를 포함하는 프로젝트와 동일한 이름의 디렉토리.

현재 작업 디렉토리에 프로젝트 디렉토리를 생성하겠습니다. 그렇게 하려면 다음 명령어의 끝에 점(.) 문자를 사용하십시오.

(sample_proj) $ django-admin startproject demoproject .

다음으로, migrate 명령어를 사용하여 데이터베이스를 마이그레이션해야 합니다. Django의 마이그레이션은 모델에 대한 변경 사항을 데이터베이스 스키마로 전파합니다. Python은 기본적으로 SQLite 데이터베이스를 사용합니다.

(sample_proj) $ python manage.py migrate

다음과 같은 출력을 받게 됩니다.

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

다음으로, Django의 관리 인터페이스에 접근하기 위해 관리 사용자를 생성합니다.

(sample_proj) $ python manage.py createsuperuser

사용자 이름, 이메일 및 비밀번호를 입력하라는 메시지가 표시됩니다.

Username (leave blank to use 'navjot'):
Email address: [email protected]
Password:
Password (again):
Superuser created successfully.

개발 서버 테스트

이제 애플리케이션을 테스트할 시간입니다. 이를 위해 Django 설정에서 ALLOWED_HOSTS 지시어를 수정해야 합니다. 이 지시어는 Django 애플리케이션에 접근할 수 있는 IP 주소 및 도메인 이름 목록을 정의합니다.

다음 명령어를 사용하여 설정 파일을 엽니다.

(sample_proj) $ nano demoproject/settings.py

다음 항목을 찾습니다.

ALLOWED_HOSTS = []

대괄호 안에 서버 IP 주소를 입력합니다. 각 항목은 따옴표로 묶어야 하며 여러 항목은 쉼표로 구분해야 합니다. www.example.com을 입력하면 정확하게 일치합니다. 그러나 .example.comexample.com, www.example.comexample.com의 다른 하위 도메인과 일치합니다. 따라서 도메인 이름을 접두사로 붙여서 일치시키고 하위 도메인도 포함하는 것이 좋습니다.

ALLOWED_HOSTS = ['']

우리는 서버와 일치시키기 위해 IP 주소를 사용했습니다. Ctrl + X를 눌러 파일을 저장하고 프롬프트가 표시되면 Y를 입력합니다.

개발 서버를 테스트하기 전에 Django가 작동할 수 있도록 방화벽을 구성해야 합니다. Django는 기본적으로 포트 8000을 사용합니다. Uncomplicated Firewall(UFW)를 사용하여 포트를 엽니다.

(sample_proj) $ sudo ufw allow 8000

개발 서버를 시작합니다.

(sample_proj) $ python manage.py runserver 0.0.0.0:8000

브라우저에서 URL http://:8000을 열면 다음 화면이 표시됩니다.

Django 홈페이지

관리 인터페이스에 접근하려면 URL http://:8000/admin/를 따라가면 다음 로그인 화면이 표시됩니다.

Django 로그인 페이지

이전에 생성한 자격 증명을 입력하여 아래의 관리 패널에 로그인합니다.

Django 관리 패널

데모 프로젝트를 마치면 터미널에서 Ctrl + C를 눌러 서버를 종료할 수 있습니다.

Gunicorn 설치 및 테스트

nohup을 사용하여 지속적인 Django 서버 실행

지금까지 Django의 서비스는 지속적이지 않습니다. 서비스를 지속적으로 만들기 위해 두 가지 방법이 있습니다. 첫 번째 방법은 nohup 유틸리티를 사용하는 것입니다. nohupno hang up을 의미하는 POSIX 명령입니다. 사용자가 로그아웃하더라도 중단되지 않도록 명령을 실행하는 데 사용됩니다.

터미널에서 Ctrl + C를 눌러 서버에서 나갔는지 확인하십시오.

다음 명령어를 실행하여 Django의 개발 서버를 실행합니다.

(sample_proj) $ nohup python manage.py runserver 0.0.0.0:8000 &

이제 Django 서버는 수동으로 종료할 때까지 계속 실행됩니다. 명령어는 프로세스 ID를 제공하고 다른 명령어를 출력합니다.

[1] 42595
(sample_proj) $ nohup: ignoring input and appending output to 'nohup.out'
^C

종료하려면 Ctrl + C를 누릅니다. 원래 Django 서버는 계속 실행됩니다. 브라우저에서 URL을 열어 확인할 수 있습니다.

작업이 끝나면 프로세스를 종료해야 합니다. nohup 명령은 하나의 프로세스 ID를 제공합니다. 그러나 실제로는 두 개의 프로세스가 실행되고 있습니다. 두 프로세스의 ID를 찾으려면 다음 명령어를 실행합니다.

(sample_proj) $ ps aux | grep manage.py
navjot     42650  3.6  1.8  47792 38168 pts/0    S    02:28   0:00 python manage.py runserver 0.0.0.0.:8000
navjot     42651  7.9  2.0 344904 41708 pts/0    Sl   02:28   0:00 /home/navjot/dj-sample/sample_proj/bin/python manage.py runserver 0.0.0.0:8000
navjot     42657  0.0  0.1   6612  2172 pts/0    S+   02:28   0:00 grep --color=auto manage.py

보시다시피, ID 42650과 ID 42651을 가진 두 개의 프로세스가 실행되고 있습니다.

위에서 얻은 프로세스 ID를 사용하여 서버를 종료하려면 다음 명령어를 실행합니다.

(sample_proj) $ sudo kill -9 42650 42651

Gunicorn 설치

지속적인 Django 서버를 실행하는 두 번째 방법은 Gunicorn 및 Nginx 웹 서버를 설치하는 것입니다. Gunicorn은 Python WSGI HTTP 서버입니다. Django 애플리케이션과 인터페이스를 제공하고 Nginx는 Gunicorn에 대한 리버스 프록시 역할을 합니다. 이 방법은 Nginx를 사용하여 제공되는 보안 및 성능의 이점을 추가로 제공합니다.

Gunicorn을 설치합니다.

(sample_proj) $ pip install gunicorn

진행하기 전에 Gunicorn이 프로젝트를 제공할 수 있는지 테스트해야 합니다. 다음 명령어를 실행하여 Gunicorn을 실행합니다.

(sample_proj) $ gunicorn --bind 0.0.0.0:8000 demoproject.wsgi

이렇게 하면 Gunicorn이 Django가 실행되던 동일한 인터페이스에서 시작됩니다. 확인하려면 브라우저에서 URL http://:8000을 열면 동일한 Django 홈페이지가 표시됩니다. 이는 Gunicorn이 완벽하게 실행되고 있음을 의미합니다.

테스트가 끝나면 터미널에서 Ctrl + C를 눌러 Gunicorn을 종료합니다.

가상 환경을 비활성화하여 일반 셸로 돌아갑니다.

(sample_proj) $ deactivate

Gunicorn을 위한 소켓 및 서비스 파일 생성

첫 번째 단계는 Gunicorn 소켓 파일을 생성하는 것입니다. Gunicorn 소켓은 부팅 시 생성되며 연결을 수신 대기합니다. 연결이 발생하면 systems가 자동으로 Gunicorn 프로세스를 시작하여 이를 처리합니다.

Gunicorn 소켓 파일을 생성하고 편집을 위해 엽니다.

$ sudo nano /etc/systemd/system/gunicorn.socket

다음 코드를 붙여넣습니다.

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

프롬프트가 표시되면 Ctrl + X를 눌러 파일을 저장하고 Y를 입력합니다.

다음으로, Gunicorn 서비스 파일을 생성하고 편집을 위해 엽니다.

$ sudo nano /etc/systemd/system/gunicorn.service

다음 코드를 붙여넣습니다.

[Unit]
Description=django gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=navjot
Group=nginx
WorkingDirectory=/home/navjot/dj-sample
ExecStart=/home/navjot/dj-sample/sample_proj/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          demoproject.wsgi:application

[Install]
WantedBy=multi-user.target

프롬프트가 표시되면 Ctrl + X를 눌러 파일을 저장하고 Y를 입력합니다. navjot를 시스템 사용자 이름으로 바꾸십시오. nginx 그룹은 Nginx 서버가 Django와 통신할 수 있도록 합니다.

시스템 데몬을 새로 고쳐 systemd 파일을 새로 고칩니다.

$ sudo systemctl daemon-reload

Gunicorn 소켓 파일을 활성화하고 시작합니다.

$ sudo systemctl start gunicorn.socket
$ sudo systemctl enable gunicorn.socket

Gunicorn 소켓의 상태를 확인합니다.

$ sudo systemctl status gunicorn.socket

비슷한 출력을 받게 됩니다.

? gunicorn.socket - gunicorn socket
     Loaded: loaded (/etc/systemd/system/gunicorn.socket; disabled; vendor preset: enabled)
     Active: active (listening) since Thu 2022-06-30 01:43:24 UTC; 20s ago
   Triggers: ? gunicorn.service
     Listen: /run/gunicorn.sock (Stream)
     CGroup: /system.slice/gunicorn.socket

Jun 30 01:43:24 django systemd[1]: Listening on gunicorn socket.

Gunicorn 서비스는 아직 실행되고 있지 않음을 확인할 수 있습니다.

$ sudo systemctl status gunicorn.service
? gunicorn.service - django gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
TriggeredBy: ? gunicorn.socket

소켓 활성화 메커니즘을 테스트하려면 다음 명령어를 실행합니다.

$ curl --unix-socket /run/gunicorn.sock localhost

터미널에서 Django 홈페이지의 HTML 출력을 받게 됩니다. 이렇게 하면 Gunicorn이 애플리케이션을 제공하기 시작합니다. 서비스 상태를 다시 확인하면 이제 실행되고 있음을 알 수 있습니다.

$ sudo systemctl status gunicorn.service
? gunicorn.service - django gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-06-30 01:45:09 UTC; 12s ago
TriggeredBy: ? gunicorn.socket
   Main PID: 42365 (gunicorn)
      Tasks: 4 (limit: 2241)
     Memory: 91.7M
        CPU: 1.128s
     CGroup: /system.slice/gunicorn.service
             ??42365 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application
             ??42366 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application
             ??42367 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application
             ??42368 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application

Jun 30 01:45:09 django systemd[1]: Started django gunicorn daemon.
Jun 30 01:45:09 django gunicorn[42365]: [2022-06-30 01:45:09 +0000] [42365] [INFO] Starting gunicorn 20.1.0
Jun 30 01:45:09 django gunicorn[42365]: [2022-06-30 01:45:09 +0000] [42365] [INFO] Listening at: unix:/run/gunicorn.sock (42365)
Jun 30 01:45:09 django gunicorn[42365]: [2022-06-30 01:45:09 +0000] [42365] [INFO] Using worker: sync
Jun 30 01:45:09 django gunicorn[42366]: [2022-06-30 01:45:09 +0000] [42366] [INFO] Booting worker with pid: 42366
.......

Nginx 설치

마지막 단계는 Nginx를 설치하고 구성하는 것입니다. 우분투 22.04는 이전 버전의 Nginx와 함께 제공됩니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 다운로드해야 합니다.

Nginx의 서명 키를 가져옵니다.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Nginx의 안정 버전 저장소를 추가합니다.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

시스템 저장소를 업데이트합니다.

$ sudo apt update

Nginx를 설치합니다.

$ sudo apt install nginx

설치를 확인합니다.

$ nginx -v
nginx version: nginx/1.22.0

Nginx 구성

파일 /etc/nginx/conf.d/django-gunicorn.conf를 생성하고 편집을 위해 엽니다.

$ sudo nano /etc/nginx/conf.d/django-gunicorn.conf

다음 코드를 붙여넣습니다.

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/navjot/dj-sample;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

위 파일에서 루트 위치를 서버의 디렉토리로 바꿉니다.

프롬프트가 표시되면 Ctrl + X를 눌러 파일을 저장하고 Y를 입력합니다.

파일 /etc/nginx/nginx.conf를 편집을 위해 엽니다.

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.

server_names_hash_bucket_size  64;

프롬프트가 표시되면 Ctrl + X를 눌러 파일을 저장하고 Y를 입력합니다.

Nginx 구성을 확인합니다.

$ sudo nginx -t

오류가 없으면 준비가 완료된 것입니다.

ALLOWED_HOSTS 지시어에 도메인 이름을 추가해야 합니다. settings.py 파일을 엽니다.

$ nano ~/dj-sample/demoproject/settings.py

ALLOWED_HOSTS 변수의 값을 변경합니다.

ALLOWED_HOSTS = ['','django.example.com']

프롬프트가 표시되면 Ctrl + X를 눌러 파일을 저장하고 Y를 입력합니다.

Gunicorn 소켓 및 서비스를 재시작합니다.

$ sudo systemctl restart gunicorn.socket
$ sudo systemctl restart gunicorn.service

Nginx 서버를 시작합니다.

$ sudo systemctl start nginx

HTTP 포트를 엽니다. 더 이상 사용할 계획이 없다면 8000 포트를 삭제할 수도 있습니다.

$ sudo ufw delete allow 8000
$ sudo ufw allow http

URL http://django.example.com을 열어 확인합니다. Django 홈페이지가 로드됩니다.

SSL 설치

지금까지 Django 애플리케이션은 평문 HTTP 연결을 통해 제공되고 있습니다. SSL 인증서를 통해 보호하는 것이 강력히 권장됩니다. 이를 위해 Snapd 도구를 사용하여 Certbot 도구를 사용합니다. 이는 이미 우분투 22.04 시스템에 설치되어 있습니다.

핵심 Snapd 저장소를 설치합니다.

$ sudo snap install core

Certbot을 설치합니다.

$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

인증서를 생성합니다. 다음 명령어는 Nginx를 자동으로 구성합니다.

$ sudo certbot --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d django.example.com

먼저 HTTPS 포트를 엽니다.

$ sudo ufw allow https

브라우저에서 URL https://django.example.com을 방문하여 확인합니다.

결론

이 튜토리얼은 우분투 22.04 서버에 Django, Gunicorn 및 Nginx를 설치하는 방법을 배운 것입니다. 또한 Django 프로젝트의 보안을 강화하기 위해 SSL 인증서를 설치했습니다. 질문이 있으면 아래 댓글에 남겨주세요.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.