웹사이트 검색

Ubuntu 16.04에서 Apache 및 mod_wsgi로 Django 애플리케이션을 제공하는 방법


소개

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

이 가이드에서는 Python 가상 환경에서 Django를 설치하고 구성하는 방법을 보여줍니다. 그런 다음 애플리케이션 로직이 필요한 요청을 Django 앱에 전달하기 전에 직접 클라이언트 요청을 처리할 수 있도록 애플리케이션 앞에 Apache를 설정합니다. WSGI 인터페이스 사양을 통해 Django와 통신할 수 있는 mod_wsgi Apache 모듈을 사용하여 이를 수행합니다.

전제 조건 및 목표

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

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

애플리케이션을 실행하고 나면 Django 앱과 인터페이스하도록 Apache를 구성합니다. HTTP 요청을 WSGI라는 사양으로 정의된 예측 가능한 애플리케이션 형식으로 변환할 수 있는 mod_wsgi Apache 모듈로 이 작업을 수행합니다. 이 가이드의 링크된 섹션을 읽으면 WSGI에 대해 자세히 알아볼 수 있습니다.

시작하자.

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

프로세스를 시작하려면 Ubuntu 리포지토리에서 필요한 모든 항목을 다운로드하여 설치합니다. 여기에는 Apache 웹 서버, Django 앱과 인터페이스하는 데 사용되는 mod_wsgi 모듈 및 Python 관련 다운로드에 사용할 수 있는 Python 패키지 관리자인 pip가 포함됩니다. 도구.

필요한 모든 것을 얻으려면 서버의 로컬 패키지 색인을 업데이트한 다음 적절한 패키지를 설치하십시오.

Python 2와 함께 Django를 사용하는 경우 필요한 명령은 다음과 같습니다.

  1. sudo apt-get update
  2. sudo apt-get install python-pip apache2 libapache2-mod-wsgi

대신 Python 3과 함께 Django를 사용하는 경우 대체 Apache 모듈과 pip 패키지가 필요합니다. 이 경우 적절한 명령은 다음과 같습니다.

  1. sudo apt-get update
  2. sudo apt-get install python3-pip apache2 libapache2-mod-wsgi-py3

Python 가상 환경 구성

이제 Ubuntu 리포지토리의 구성 요소가 있으므로 Django 프로젝트 작업을 시작할 수 있습니다. 첫 번째 단계는 Django 프로젝트가 시스템 도구 및 작업 중인 다른 Python 프로젝트와 분리되도록 Python 가상 환경을 만드는 것입니다.

이러한 환경을 만들려면 virtualenv 명령을 설치해야 합니다. pip를 사용하여 얻을 수 있습니다.

Python 2를 사용하는 경우 다음을 입력합니다.

  1. sudo pip install virtualenv

Python 3을 사용하는 경우 다음을 입력합니다.

  1. sudo pip3 install virtualenv

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

  1. mkdir ~/myproject
  2. cd ~/myproject

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

  1. virtualenv myprojectenv

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

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

  1. source myprojectenv/bin/activate

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

가상 환경이 활성화된 상태에서 pip의 로컬 인스턴스로 Django를 설치합니다.

Python 2를 사용하든 Python 3를 사용하든 가상 환경이 활성화되면 pip 명령(pip3 아님)을 사용해야 합니다.

  1. pip install django

새 Django 프로젝트 생성 및 구성

이제 Django가 가상 환경에 설치되었으므로 실제 Django 프로젝트 파일을 만들 수 있습니다.

장고 프로젝트 생성

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

  1. django-admin.py startproject myproject .

프로젝트 설정 조정

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

  1. nano myproject/settings.py

이 가이드에서는 단순화를 위해 기본 SQLite 데이터베이스를 사용할 것이므로 실제로 너무 많이 변경할 필요는 없습니다. 우리는 응답하는 도메인을 제한하기 위해 허용된 호스트를 구성하고 Django가 웹 서버가 정적 파일을 쉽게 제공할 수 있도록 정적 파일을 배치하는 정적 파일 디렉토리를 구성하는 데 중점을 둘 것입니다.

ALLOWED_HOSTS 행을 찾아서 시작하십시오. 대괄호 안에 서버의 공용 IP 주소, 도메인 이름 또는 둘 다 입력하십시오. 각 값은 일반 Python 목록과 같이 따옴표로 묶고 쉼표로 구분해야 합니다.

. . .
ALLOWED_HOSTS = ["server_domain_or_IP"]
. . .

파일 맨 아래에 이 디렉토리를 구성하는 행을 추가합니다. Django는 STATIC_ROOT 설정을 사용하여 이러한 파일이 있어야 하는 디렉토리를 결정합니다. 프로젝트의 기본 디렉토리에서 "static\이라는 디렉토리를 사용하도록 Python을 약간 사용할 것입니다.

. . .

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

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

초기 프로젝트 설정 완료

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

  1. cd ~/myproject
  2. ./manage.py makemigrations
  3. ./manage.py migrate

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

  1. ./manage.py createsuperuser

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

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

  1. ./manage.py collectstatic

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

이제 포트 8000에서 실행할 Django 개발 서버로의 트래픽을 허용하도록 방화벽 설정을 조정할 수 있습니다. 전제 조건의 초기 서버 설정 가이드를 따랐다면 현재 UFW 방화벽이 활성화되어 있어야 합니다.

다음을 입력하여 개발 서버에 대한 연결을 허용합니다.

  1. sudo ufw allow 8000

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

  1. ./manage.py runserver 0.0.0.0:8000

웹 브라우저에서 서버의 도메인 이름 또는 IP 주소 뒤에 :8000을 입력합니다.

http://server_domain_or_IP:8000

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

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

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

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

이제 당분간은 Django 사용이 끝났으므로 다음을 입력하여 가상 환경에서 나갈 수 있습니다.

  1. deactivate

아파치 구성

이제 Django 프로젝트가 작동하므로 Apache를 프런트 엔드로 구성할 수 있습니다. 수신하는 클라이언트 연결은 mod_wsgi 모듈을 사용하여 Django 애플리케이션이 예상하는 WSGI 형식으로 변환됩니다. 이전에 설치할 때 자동으로 활성화되어 있어야 합니다.

WSGI 패스를 구성하려면 기본 가상 호스트 파일을 편집해야 합니다.

  1. sudo nano /etc/apache2/sites-available/000-default.conf

파일에 이미 있는 지시문을 유지할 수 있습니다. 몇 가지 추가 항목만 추가하면 됩니다.

시작하려면 정적 파일을 구성하겠습니다. 우리는 별칭을 사용하여 /static로 시작하는 모든 요청을 프로젝트 폴더 내의 "static\ 디렉토리에 매핑하도록 Apache에 지시할 것입니다. 이전에 정적 자산을 수집했습니다. 별칭을 설정하고 그런 다음 디렉터리 블록을 사용하여 해당 디렉터리에 대한 액세스 권한을 부여합니다.

<VirtualHost *:80>
    . . .

    Alias /static /home/sammy/myproject/static
    <Directory /home/sammy/myproject/static>
        Require all granted
    </Directory>

</VirtualHost>

다음으로 Django 코드가 저장된 두 번째 수준 프로젝트 디렉토리 내의 wsgi.py 파일에 대한 액세스 권한을 부여합니다. 이를 위해 내부에 파일 섹션이 있는 디렉토리 섹션을 사용합니다. 이 중첩 구조 내부의 파일에 대한 액세스 권한을 부여합니다.

<VirtualHost *:80>
    . . .

    Alias /static /home/sammy/myproject/static
    <Directory /home/sammy/myproject/static>
        Require all granted
    </Directory>

    <Directory /home/sammy/myproject/myproject>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

</VirtualHost>

이것이 구성되면 실제로 WSGI 패스를 처리하는 파일 부분을 구성할 준비가 된 것입니다. 데몬 모드를 사용하여 권장 구성인 WSGI 프로세스를 실행합니다. WSGIDaemonProcess 지시문을 사용하여 이를 설정할 수 있습니다.

이 지시문은 프로세스에 대해 임의의 이름을 사용합니다. 일관성을 유지하기 위해 myproject를 사용할 것입니다. 그런 다음 Apache가 필요할 수 있는 모든 구성 요소를 찾을 수 있는 Python 홈을 설정합니다. 가상 환경을 사용했기 때문에 기본 가상 환경 디렉토리를 직접 가리킬 수 있습니다. 그런 다음 Django 프로젝트의 베이스를 가리키도록 Python 경로를 설정합니다.

다음으로 프로세스 그룹을 지정해야 합니다. 이것은 WSGIDaemonProcess 지시문(이 경우 myproject)에 대해 선택한 것과 동일한 이름을 가리켜야 합니다. 마지막으로 Apache가 루트 도메인에 대한 요청을 wsgi.py 파일에 전달하도록 스크립트 별칭을 설정해야 합니다.

<VirtualHost *:80>
    . . .

    Alias /static /home/sammy/myproject/static
    <Directory /home/sammy/myproject/static>
        Require all granted
    </Directory>

    <Directory /home/sammy/myproject/myproject>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    WSGIDaemonProcess myproject python-home=/home/sammy/myproject/myprojectenv python-path=/home/sammy/myproject
    WSGIProcessGroup myproject
    WSGIScriptAlias / /home/sammy/myproject/myproject/wsgi.py

</VirtualHost>

이러한 변경을 마치면 파일을 저장하고 닫습니다.

일부 권한 문제 마무리

이 문서에서 사용되는 기본값인 SQLite 데이터베이스를 사용하는 경우 이 파일에 대한 Apache 프로세스 액세스를 허용해야 합니다.

그렇게 하려면 먼저 데이터베이스의 그룹 소유자가 읽고 쓸 수 있도록 권한을 변경해야 합니다. 데이터베이스 파일은 기본적으로 db.sqlite3라고 하며 기본 프로젝트 디렉토리에 있어야 합니다.

  1. chmod 664 ~/myproject/db.sqlite3

그런 다음 Apache가 실행되는 그룹, www-data 그룹, 파일의 그룹 소유권을 부여해야 합니다.

  1. sudo chown :www-data ~/myproject/db.sqlite3

파일에 쓰려면 데이터베이스의 상위 디렉토리에 대한 Apache 그룹 소유권도 부여해야 합니다.

  1. sudo chown :www-data ~/myproject

방화벽을 통해 다시 조정해야 합니다. Apache를 통해 프록시하기 때문에 더 이상 포트 8000을 열 필요가 없으므로 해당 규칙을 제거할 수 있습니다. 그런 다음 Apache 프로세스에 대한 트래픽을 허용하는 예외를 추가할 수 있습니다.

  1. sudo ufw delete allow 8000
  2. sudo ufw allow 'Apache Full'

Apache 파일을 확인하여 구문 오류가 발생하지 않았는지 확인하십시오.

  1. sudo apache2ctl configtest

출력의 마지막 줄이 다음과 같으면 파일의 모양이 양호한 것입니다.

Output
. . . Syntax OK

이러한 단계가 완료되면 변경 사항을 구현하기 위해 Apache 서비스를 다시 시작할 준비가 된 것입니다. 다음을 입력하여 Apache를 다시 시작합니다.

  1. sudo systemctl restart apache2

이제 포트를 지정하지 않고 서버의 도메인 이름이나 IP 주소로 이동하여 Django 사이트에 액세스할 수 있습니다. 일반 사이트와 관리 인터페이스가 예상대로 작동해야 합니다.

다음 단계

애플리케이션에 액세스할 수 있는지 확인한 후 애플리케이션에 대한 트래픽을 보호하는 것이 중요합니다.

애플리케이션의 도메인 이름이 있는 경우 애플리케이션을 보호하는 가장 쉬운 방법은 Let's Encrypt의 무료 SSL 인증서를 사용하는 것입니다. 이를 설정하는 방법을 알아보려면 16.04의 Apache에 대한 Let’s Encrypt 가이드를 따르십시오.

응용 프로그램에 대한 도메인 이름이 없고 자신의 목적이나 테스트를 위해 이를 사용하는 경우 언제든지 자체 서명된 인증서를 만들 수 있습니다. Ubuntu 16.04에서 Apache용 자체 서명 SSL 인증서 생성 가이드에서 설정 방법을 배울 수 있습니다.

결론

이 가이드에서는 자체 가상 환경에서 Django 프로젝트를 설정했습니다. 우리는 클라이언트 요청을 처리하고 Django 앱과 인터페이스하기 위해 mod_wsgi로 Apache를 구성했습니다.

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