웹사이트 검색

Ubuntu 14.04에서 Postgres, Nginx 및 Gunicorn으로 Django를 설정하는 방법


소개

Django는 Python 애플리케이션이나 웹 사이트를 시작하는 데 도움이 되는 강력한 웹 프레임워크입니다. Django에는 로컬에서 코드를 테스트하기 위한 간소화된 개발 서버가 포함되어 있지만 생산과 관련된 약간의 작업이라도 더 안전하고 강력한 웹 서버가 필요합니다.

이 가이드에서는 Django 애플리케이션을 지원하고 제공하기 위해 Ubuntu 14.04에서 일부 구성 요소를 설치하고 구성하는 방법을 보여줍니다. 기본 SQLite 데이터베이스를 사용하는 대신 PostgreSQL 데이터베이스를 설정합니다. 애플리케이션과 인터페이스하도록 Gunicorn 애플리케이션 서버를 구성합니다. 그런 다음 Nginx를 Gunicorn에 역 프록시로 설정하여 앱을 제공하기 위한 보안 및 성능 기능에 액세스할 수 있습니다.

전제 조건 및 목표

이 가이드를 완료하려면 sudo 권한이 구성된 루트가 아닌 사용자가 있는 새로운 Ubuntu 14.04 서버 인스턴스가 있어야 합니다. 초기 서버 설정 가이드를 실행하여 이를 설정하는 방법을 배울 수 있습니다.

우리는 가상 환경에 Django를 설치할 것입니다. 프로젝트에 특정한 환경에 Django를 설치하면 프로젝트와 해당 요구 사항을 별도로 처리할 수 있습니다.

데이터베이스와 애플리케이션을 가동하고 실행하면 Gunicorn 애플리케이션 서버를 설치하고 구성합니다. 이는 애플리케이션에 대한 인터페이스 역할을 하여 HTTP의 클라이언트 요청을 애플리케이션이 처리할 수 있는 Python 호출로 변환합니다. 그런 다음 고성능 연결 처리 메커니즘과 구현하기 쉬운 보안 기능을 활용하기 위해 Gunicorn 앞에 Nginx를 설정합니다.

시작하자.

Ubuntu 리포지토리에서 패키지 설치

프로세스를 시작하려면 Ubuntu 리포지토리에서 필요한 모든 항목을 다운로드하여 설치합니다. 나중에 Python 패키지 관리자 pip를 사용하여 추가 구성 요소를 설치합니다.

먼저 로컬 패키지 인덱스를 업데이트한 다음 패키지를 다운로드하여 설치합니다.

sudo apt-get update
sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx

이렇게 하면 나중에 Gunicorn을 빌드하는 데 필요한 Python 개발 파일인 pip, Postgres 데이터베이스 시스템과 상호 작용하는 데 필요한 라이브러리, Nginx 웹 서버가 설치됩니다.

PostgreSQL 데이터베이스 및 사용자 생성

바로 시작하여 Django 애플리케이션을 위한 데이터베이스 및 데이터베이스 사용자를 생성할 것입니다.

Postgres를 기본 구성으로 사용하려면 일시적으로 postgres 시스템 사용자로 변경하는 것이 가장 좋습니다. 다음을 입력하여 지금 수행하십시오.

sudo su - postgres

postgres 사용자로 작업할 때 다음을 입력하여 추가 인증 없이 PostgreSQL 대화형 세션에 바로 로그인할 수 있습니다.

psql

요구 사항을 설정할 수 있는 PostgreSQL 프롬프트가 표시됩니다.

먼저 프로젝트용 데이터베이스를 생성합니다.

CREATE DATABASE myproject;

모든 명령은 세미콜론으로 끝나야 하므로 문제가 발생하는 경우 명령이 세미콜론으로 끝나는지 확인하십시오.

다음으로 프로젝트에 대한 데이터베이스 사용자를 생성합니다. 보안 암호를 선택했는지 확인하십시오.

CREATE USER myprojectuser WITH PASSWORD 'password';

이제 새 사용자에게 새 데이터베이스를 관리할 수 있는 액세스 권한을 부여할 수 있습니다.

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

완료되면 다음을 입력하여 PostgreSQL 프롬프트를 종료합니다.

\q

이제 postgres 사용자의 셸 세션을 종료하고 다음을 입력하여 일반 사용자의 셸 세션으로 돌아갑니다.

exit

프로젝트를 위한 Python 가상 환경 만들기

이제 데이터베이스가 준비되었으므로 나머지 프로젝트 요구 사항을 준비할 수 있습니다. 더 쉬운 관리를 위해 가상 환경 내에 Python 요구 사항을 설치할 것입니다.

이렇게 하려면 먼저 virtualenv 명령에 액세스해야 합니다. pip로 설치할 수 있습니다.

sudo pip install virtualenv

virtualenv가 설치되면 프로젝트 구성을 시작할 수 있습니다. 프로젝트를 보관할 디렉토리를 만들고 나중에 해당 디렉토리로 이동합니다.

mkdir ~/myproject
cd ~/myproject

프로젝트 디렉터리 내에서 다음을 입력하여 Python 가상 환경을 만듭니다.

virtualenv myprojectenv

이렇게 하면 myproject 디렉토리 내에 myprojectenv라는 디렉토리가 생성됩니다. 내부에는 로컬 버전의 Python과 로컬 버전의 pip가 설치됩니다. 이를 사용하여 프로젝트에 대해 격리된 Python 환경을 설치하고 구성할 수 있습니다.

프로젝트의 Python 요구 사항을 설치하기 전에 가상 환경을 활성화해야 합니다. 다음을 입력하면 됩니다.

source myprojectenv/bin/activate

이제 Python 가상 환경 내에서 작업 중임을 나타내도록 프롬프트가 변경되어야 합니다. 다음과 같이 표시됩니다. (myprojectenv)user@host:~/myproject$.

가상 환경이 활성화된 상태에서 pip의 로컬 인스턴스와 함께 Django, Gunicorn 및 psycopg2 PostgreSQL 어댑터를 설치합니다.

pip install django gunicorn psycopg2

새 Django 프로젝트 생성 및 구성

Python 구성 요소가 설치되어 있으면 실제 Django 프로젝트 파일을 만들 수 있습니다.

장고 프로젝트 생성

이미 프로젝트 디렉토리가 있으므로 Django에게 여기에 파일을 설치하도록 지시합니다. 실제 코드가 포함된 두 번째 수준의 디렉터리를 생성하고 이 디렉터리에 관리 스크립트를 배치합니다. 이것의 핵심은 Django가 현재 디렉토리에 파일을 생성하도록 지시하는 끝에 있는 점입니다.

django-admin.py startproject myproject .

프로젝트 설정 조정

새로 만든 프로젝트 파일로 가장 먼저 해야 할 일은 설정을 조정하는 것입니다. 텍스트 편집기에서 설정 파일을 엽니다.

nano myproject/settings.py

데이터베이스 액세스를 구성하는 섹션을 찾는 것부터 시작하십시오. DATABASES로 시작합니다. 파일의 구성은 SQLite 데이터베이스용입니다. 프로젝트를 위한 PostgreSQL 데이터베이스를 이미 만들었으므로 설정을 조정해야 합니다.

PostgreSQL 데이터베이스 정보로 설정을 변경하십시오. pip와 함께 설치한 psycopg2 어댑터를 사용하도록 Django에 지시합니다. 데이터베이스 이름, 데이터베이스 사용자 이름, 데이터베이스 사용자 이름의 암호를 제공한 다음 데이터베이스가 로컬 컴퓨터에 있음을 지정해야 합니다. PORT 설정을 빈 문자열로 둘 수 있습니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

그런 다음 파일 맨 아래로 이동하여 정적 파일을 배치해야 하는 위치를 나타내는 설정을 추가합니다. 이는 Nginx가 이러한 항목에 대한 요청을 처리할 수 있도록 하기 위해 필요합니다. 다음 줄은 Django가 기본 프로젝트 디렉토리의 static이라는 디렉토리에 배치하도록 지시합니다.

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

완료되면 파일을 저장하고 닫습니다.

초기 프로젝트 설정 완료

이제 관리 스크립트를 사용하여 초기 데이터베이스 스키마를 PostgreSQL 데이터베이스로 마이그레이션할 수 있습니다.

cd ~/myproject
./manage.py makemigrations
./manage.py migrate

다음을 입력하여 프로젝트의 관리 사용자를 만듭니다.

./manage.py createsuperuser

사용자 이름을 선택하고 이메일 주소를 제공하고 암호를 선택하고 확인해야 합니다.

다음을 입력하여 구성한 디렉터리 위치에 모든 정적 콘텐츠를 수집할 수 있습니다.

./manage.py collectstatic

작업을 확인해야 합니다. 그러면 정적 파일이 프로젝트 디렉토리 내의 static 디렉토리에 배치됩니다.

마지막으로 다음 명령으로 Django 개발 서버를 시작하여 프로젝트를 테스트할 수 있습니다.

./manage.py runserver 0.0.0.0:8000

웹 브라우저에서 서버의 도메인 이름 또는 IP 주소를 방문하고 :8000:

http://server_domain_or_IP:8000

기본 Django 색인 페이지가 표시되어야 합니다.

주소 표시줄의 URL 끝에 /admin을 추가하면 createsuperuser 명령으로 생성한 관리 사용자 이름과 비밀번호를 입력하라는 메시지가 표시됩니다.

인증 후 기본 Django 관리 인터페이스에 액세스할 수 있습니다.

탐색이 끝나면 터미널 창에서 CTRL-C를 눌러 개발 서버를 종료합니다.

Gunicorn의 프로젝트 수행 능력 테스트

가상 환경을 떠나기 전에 마지막으로 수행하고 싶은 작업은 Gunicorn을 테스트하여 애플리케이션을 제공할 수 있는지 확인하는 것입니다. 다음을 입력하면 쉽게 할 수 있습니다.

cd ~/myproject
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

이렇게 하면 Django 개발 서버가 실행 중인 동일한 인터페이스에서 Gunicorn이 시작됩니다. 돌아가서 앱을 다시 테스트할 수 있습니다. Gunicorn은 이를 담당하는 정적 콘텐츠에 대해 모르기 때문에 관리 인터페이스에는 스타일이 적용되지 않습니다.

Python의 모듈 구문을 사용하여 애플리케이션의 진입점인 Django의 wsgi.py 파일에 대한 상대 디렉토리 경로를 지정하여 Gunicorn에 모듈을 전달했습니다. 이 파일 안에는 application이라는 함수가 정의되어 있는데, 이 함수는 응용 프로그램과 통신하는 데 사용됩니다. WSGI 사양에 대해 자세히 알아보려면 여기를 클릭하십시오.

테스트가 끝나면 터미널 창에서 CTRL-C를 눌러 Gunicorn을 중지합니다.

이제 Django 애플리케이션 구성이 완료되었습니다. 다음을 입력하여 가상 환경에서 나갈 수 있습니다.

deactivate

Gunicorn Upstart 파일 생성

우리는 Gunicorn이 Django 애플리케이션과 상호 작용할 수 있는지 테스트했지만 애플리케이션 서버를 시작하고 중지하는 보다 강력한 방법을 구현해야 합니다. 이를 달성하기 위해 Upstart 스크립트를 만들 것입니다.

텍스트 편집기에서 sudo 권한으로 Gunicorn용 Upstart 파일을 만들고 엽니다.

sudo nano /etc/init/gunicorn.conf

서비스 파일의 용도를 나타내는 간단한 설명 문자열부터 시작하겠습니다. 그런 다음 이 서비스가 자동으로 시작되어야 하는 시스템 런레벨 정의로 이동합니다. 서비스를 실행하기 위한 일반적인 런레벨은 2, 3, 4, 5입니다. 시스템이 그 중 하나에 있을 때 서비스를 실행합니다. 다른 런레벨(예: 시스템이 재부팅, 종료 또는 단일 사용자 모드일 때)에 있을 때 중지하도록 지시합니다.

description "Gunicorn application server handling myproject"

start on runlevel [2345]
stop on runlevel [!2345]

다음으로 서비스가 실패하면 자동으로 다시 시작하도록 Upstart에 지시합니다. 또한 실행할 사용자 및 그룹을 지정하려고 합니다. 모든 파일이 해당 사용자의 소유이므로 일반 사용자를 사용합니다. Nginx가 속한 www-data 그룹이 그룹 소유자가 되도록 하겠습니다. 또한 Gunicorn 명령이 올바르게 실행되도록 프로젝트의 디렉토리로 변경해야 합니다.

description "Gunicorn application server handling myproject"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid user
setgid www-data
chdir /home/user/myproject

이제 Gunicorn 프로세스를 시작하는 명령만 내리면 됩니다. 가상 환경에 저장된 Gunicorn 실행 파일의 경로를 지정해야 합니다. 두 서비스가 이 서버에서 실행될 것이기 때문에 Nginx와 통신하기 위해 네트워크 포트 대신 Unix 소켓을 사용하도록 지시할 것입니다. 이것은 더 안전하고 빠릅니다. 여기에 Gunicorn에 대한 다른 구성도 추가할 수 있습니다. 예를 들어, 우리는 3개의 작업자 프로세스를 원한다고 지정할 것입니다.

description "Gunicorn application server handling myproject"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid user
setgid www-data
chdir /home/user/myproject

exec myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application

완료되면 파일을 저장하고 닫습니다.

다음을 입력하여 Gunicorn 서비스를 시작합니다.

sudo service gunicorn start

Nginx를 Gunicorn에 대한 프록시 패스로 구성

이제 Gunicorn이 설정되었으므로 트래픽을 프로세스로 전달하도록 Nginx를 구성해야 합니다.

Nginx의 sites-available 디렉토리에서 새 서버 블록을 생성하고 여는 것으로 시작합니다.

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

내부에서 새 서버 블록을 엽니다. 이 블록이 일반 포트 80에서 수신 대기하고 서버의 도메인 이름 또는 IP 주소에 응답하도록 지정하여 시작하겠습니다.

server {
    listen 80;
    server_name server_domain_or_IP;
}

다음으로 Nginx에게 파비콘을 찾는 문제를 무시하도록 지시합니다. 또한 ~/myproject/static 디렉터리에서 수집한 정적 자산을 찾을 위치를 알려줍니다. 이러한 모든 파일에는 "/static”이라는 표준 URI 접두사가 있으므로 해당 요청과 일치하는 위치 블록을 만들 수 있습니다.

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/user/myproject;
    }
}

마지막으로, 다른 모든 요청과 일치하도록 location/{} 블록을 생성합니다. 이 위치 안에 Nginx 설치에 포함된 표준 proxy_params 파일을 포함하고 트래픽을 Gunicorn 프로세스가 생성한 소켓으로 전달합니다.

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/user/myproject;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/user/myproject/myproject.sock;
    }
}

완료되면 파일을 저장하고 닫습니다. 이제 파일을 sites-enabled 디렉터리에 연결하여 활성화할 수 있습니다.

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

다음을 입력하여 구문 오류에 대한 Nginx 구성을 테스트합니다.

sudo nginx -t

오류가 보고되지 않으면 다음을 입력하여 Nginx를 다시 시작하십시오.

sudo service nginx restart

이제 서버의 도메인 또는 IP 주소로 이동하여 애플리케이션을 볼 수 있습니다.

결론

이 가이드에서는 자체 가상 환경에서 Django 프로젝트를 설정했습니다. Django가 클라이언트 요청을 처리할 수 있도록 Gunicorn이 클라이언트 요청을 번역하도록 구성했습니다. 그런 다음 클라이언트 연결을 처리하고 클라이언트 요청에 따라 올바른 프로젝트를 제공하기 위해 리버스 프록시 역할을 하도록 Nginx를 설정했습니다.

Django는 고유한 요소에 집중할 수 있도록 많은 공통 부분을 제공하여 프로젝트 및 애플리케이션 생성을 간단하게 만듭니다. 이 문서에서 설명하는 일반 도구 체인을 활용하면 단일 서버에서 생성한 애플리케이션을 쉽게 제공할 수 있습니다.