웹사이트 검색

로컬 Django 앱을 VPS에 배포하는 방법


전제 조건

이 자습서에서는 선택한 운영 체제로 가상 사설 서버를 이미 설정했다고 가정합니다(이 자습서에는 Debian 7이 사용되었으며 Ubuntu도 작동함). 아직 그렇게 하지 않았다면 이 Django용 서버 설정을 따를 수 있습니다.

1단계: 패키지 업데이트

무엇을 하기 전에 항상 apt를 통해 관리되는 모든 패키지 또는 선택한 패키지 관리자가 무엇이든 최신 상태인지 확인하는 것이 좋습니다. SSH를 통해 VPS에 연결하고 다음 명령을 실행하여 이를 수행할 수 있습니다.

sudo apt-get update
sudo apt-get upgrade

첫 번째 명령은 apt-get을 통해 관리되는 패키지의 모든 업데이트를 다운로드합니다. 두 번째 명령은 다운로드한 업데이트를 설치합니다. 위의 명령을 실행한 후 설치할 업데이트가 있는 경우 이러한 업데이트를 설치할지 여부를 묻는 메시지가 표시될 수 있습니다. 이 경우 "y\를 입력한 다음 프롬프트가 표시되면 "Enter\를 누르십시오.

2단계: Virtualenv 설정

사전 요구 사항을 완료했다면 이미 설정되어 있어야 하며 이 단계를 건너뛸 수 있습니다.

이제 프로젝트 파일과 Python 패키지가 있을 virtualenv를 설정해야 합니다. virtualenv를 사용하지 않는 경우 Django 프로젝트가 있을 디렉토리를 만들고 3단계로 이동합니다.

virtualenv를 생성하려면 다음 명령을 실행하십시오. 경로를 가상 사설 서버에 있는 프로젝트 프로젝트의 원하는 경로로 바꿔야 합니다.

virtualenv /opt/myproject

이제 virtualenv를 설정했으므로 virtualenv를 활성화하고 pip를 사용하여 필요할 수 있는 Django 및 기타 Python 패키지를 설치할 수 있습니다. 다음은 virtualenv를 활성화하고 pip를 사용하여 Django를 설치하는 방법의 예입니다.

source /opt/myproject/bin/activate
pip install django

이제 프로젝트를 위한 데이터베이스를 만들 준비가 되었습니다!

3단계: 데이터베이스 생성

이 자습서에서는 PostgreSQL을 데이터베이스 서버로 사용한다고 가정합니다. 그렇지 않은 경우 선택한 데이터베이스 서버용 데이터베이스를 만드는 방법에 대한 설명서를 확인해야 합니다.

PostgreSQL로 데이터베이스를 생성하려면 다음 명령을 실행하여 시작하십시오.

sudo su - postgres

이제 터미널 프롬프트에 "postgres@yourserver\가 표시되어야 합니다. 그렇다면 이 명령을 실행하여 데이터베이스를 생성하고 "mydb\를 원하는 데이터베이스 이름으로 바꾸십시오.

createdb mydb

이제 다음 명령을 사용하여 데이터베이스 사용자를 생성합니다.

createuser -P

이제 6개의 프롬프트가 표시됩니다. 첫 번째는 새 사용자의 이름을 묻습니다(원하는 이름 사용). 다음 두 개의 프롬프트는 비밀번호와 새 사용자의 비밀번호 확인을 위한 것입니다. 마지막 세 개의 프롬프트에 대해 "n\을 입력하고 "enter\를 누르십시오. 이렇게 하면 새 사용자가 액세스 권한을 부여한 항목에만 액세스할 수 있고 다른 것은 없습니다. 이제 다음과 같이 PostgreSQL 명령줄 인터페이스를 활성화합니다.

psql

마지막으로 다음 명령을 사용하여 이 새 사용자에게 새 데이터베이스에 대한 액세스 권한을 부여합니다.

GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

이제 데이터베이스와 해당 데이터베이스에 액세스할 사용자가 설정되었습니다. 다음으로 정적 파일을 제공하도록 웹 서버를 구성할 수 있습니다!

4단계: VPS 구성

사이트에 대한 새 구성 파일을 만들어야 합니다. 이 튜토리얼에서는 NGINX를 클라우드 서버로 사용한다고 가정합니다. 그렇지 않은 경우 이 단계를 완료하려면 선택한 웹 서버에 대한 설명서를 확인해야 합니다.

NGINX의 경우 다음 명령을 실행하여 사이트의 웹 서버 구성 파일을 생성 및 편집하고 명령 끝에 있는 "myproject\를 프로젝트 이름으로 바꾸십시오.

sudo nano /etc/nginx/sites-available/myproject

이제 열려 있는 편집기에 다음 코드 줄을 입력합니다.

server {
    server_name yourdomainorip.com;

    access_log off;

    location /static/ {
        alias /opt/myenv/static/;
    }

    location / {
        proxy_pass http://127.0.0.1:8001;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }
}

파일을 저장하고 종료합니다. 위의 구성은 NGINX가 yourdomainorip.com에서 요청한 모든 것을 제공하도록 설정했으며 포트 8001에서 localhost로 프록시되며 여기에서 Gunicorn(또는 선택한 앱 서버)이 실행되도록 지시합니다. 다른 줄은 요청의 호스트 이름과 IP 주소가 Gunicorn에 전달되도록 합니다. 이것이 없으면 모든 요청의 IP 주소는 127.0.0.1이 되고 호스트 이름은 VPS 호스트 이름일 뿐입니다.

이제 이 구성 파일을 가리키는 /etc/nginx/sites-enabled 디렉토리에 심볼릭 링크를 설정해야 합니다. 그것이 NGINX가 이 사이트가 활성 상태임을 아는 방법입니다. 다음과 같이 디렉토리를 /etc/nginx/sites-enabled로 변경합니다.

cd /etc/nginx/sites-enabled

여기에서 다음 명령을 실행합니다.

sudo ln -s ../sites-available/myproject

이제 아래 명령으로 NGINX를 다시 시작하면 다음과 같이 설정되어야 합니다.

sudo service nginx restart

다시 시작하면 다음 오류가 표시될 수 있습니다.

server_names_hash, you should increase server_names_hash_bucket_size: 32

' /etc/nginx/nginx.conf '를 편집하여 이 문제를 해결할 수 있습니다.

파일을 열고 다음 행의 주석을 제거하십시오.

server_names_hash_bucket_size 64;

이제 프로젝트 파일을 드롭릿으로 푸시해 보겠습니다!

5단계: 로컬 Django 프로젝트를 Droplet으로 이동

FTP, SFTP, SCP, Git, SVN 등 몇 가지 옵션이 있습니다. Git을 사용하여 로컬 프로젝트 파일을 가상 사설 서버로 전송합니다.

virtualenv를 설정한 디렉토리 또는 프로젝트를 저장하려는 디렉토리를 찾으십시오. 다음 명령을 사용하여 이 디렉터리로 변경합니다.

cd /opt/myproject

그런 다음 프로젝트 파일이 위치할 새 디렉터리를 만듭니다. 다음 명령으로 이 작업을 수행할 수 있습니다.

mkdir myproject

같은 이름을 가진 두 개의 디렉토리가 중복되는 것처럼 보일 수 있습니다. 그러나 virtualenv 이름과 프로젝트 이름이 동일하도록 만듭니다.

이제 다음 명령을 사용하여 새 디렉터리로 변경합니다.

cd myproject

프로젝트가 이미 Git 리포지토리에 있는 경우 코드가 모두 커밋되고 푸시되었는지 확인하기만 하면 됩니다. 컴퓨터의 터미널(Mac용) 또는 명령 프롬프트(PC용)에서 로컬로 다음 명령을 실행하여 이러한 경우인지 확인할 수 있습니다.

git status

출력에 파일이 표시되지 않으면 진행해도 좋습니다. 이제 드롭릿에 SSH로 연결하고 다음 명령을 사용하여 Git을 설치합니다.

sudo apt-get install git

"y\를 입력하고 "Enter\를 눌러 모든 프롬프트에 예라고 대답해야 합니다. Git이 설치되면 이를 사용하여 다음 명령을 사용하여 프로젝트 파일을 프로젝트 디렉터리로 가져옵니다.

git clone https://webaddressforyourrepo.com/path/to/repo .

Git 호스팅을 위해 Github 또는 Bitbucket을 사용하는 경우 이 명령을 가져오는 데 사용할 수 있는 복제 버튼이 있습니다. "를 추가해야 합니다.” 이 작업을 수행하지 않으면 Git은 사용자가 원하지 않는 프로젝트 디렉토리 내에 repo 이름으로 디렉토리를 생성합니다.

Git을 사용하지 않는 경우 FTP 또는 다른 전송 프로토콜을 사용하여 위 단계에서 생성한 프로젝트 디렉터리로 파일을 전송합니다.

이제 남은 것은 앱 서버를 설정하는 것입니다!

6단계: 앱 서버 설치 및 구성

사전 요구 사항을 완료했다면 이미 설정되어 있어야 하며 이 단계를 건너뛸 수 있습니다.

이제 앱 서버를 설치하고 포트 8001에서 Django 앱에 대한 요청을 수신하는지 확인해야 합니다. 이 예에서는 Gunicorn을 사용합니다. Gunicorn을 설치하려면 먼저 virtualenv를 활성화하십시오.

source /opt/myproject/bin/activate

virtualenv가 활성화되면 다음 명령을 실행하여 Gunicorn을 설치합니다.

pip install gunicorn

이제 Gunicorn이 설치되었으므로 도메인 또는 IP에 대한 요청을 포트 8001에 바인딩합니다.

gunicorn_django --bind yourdomainorip.com:8001

이제 "ctrl+z\를 누른 다음 "bg\를 입력하여 프로세스를 백그라운드로 전환할 수 있습니다(원하는 경우). Gunicorn의 고급 구성 및 설정은 이 자습서의 9단계에서 찾을 수 있습니다.

이제 마지막 단계를 위한 준비가 되었습니다!

7단계: 앱 구성

마지막 단계는 프로덕션을 위해 앱을 구성하는 것입니다. 변경해야 할 모든 사항은 Django 프로젝트의 "settings.py\ 파일에 있습니다. 다음 명령으로 이 파일을 엽니다.

sudo nano /opt/myproject/myproject/settings.py

설정 파일의 경로는 프로젝트 설정 방법에 따라 다를 수 있습니다. 그에 따라 위의 명령에서 경로를 수정하십시오.

설정 파일을 연 상태에서 DEBUG 설정을 False로 변경합니다.

DEBUG = False

이렇게 하면 오류가 디버그 정보가 있는 스택 추적을 제공하는 대신 사용자에게 404 또는 500 오류 페이지로 표시됩니다.

이제 아래 표시된 항목 대신 데이터베이스 이름, 사용자 및 암호를 사용하여 다음과 같이 데이터베이스 설정을 편집합니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'mydb',                      # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': 'myuser',
        'PASSWORD': 'password',
        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}

이제 정적 파일 설정을 편집합니다.

STATIC_ROOT = '/opt/myproject/static/'

STATIC_URL = '/static/'

파일을 저장하고 종료합니다. 이제 정적 파일을 수집하기만 하면 됩니다. "manage.py” 스크립트가 있는 디렉토리로 변경하고 다음 명령을 실행하십시오.

python manage.py collectstatic

이 명령은 위의 settings.py 파일에서 설정한 디렉토리에 모든 정적 파일을 수집합니다.

그리고 그게 다야! 이제 앱을 프로덕션에 배포하고 사용할 준비가 되었습니다.