NGINX Unit – 프로덕션 애플리케이션을 위한 Django 프로젝트 구성 데모
NGINX Unit 은 여러 언어와 각 언어의 여러 버전 (Django 등)을 제공할 수 있는 완전히 동적인 애플리케이션 서버입니다. 이는 RESTful JSON API를 사용하여 메모리 내에서 구성 변경을 수행할 수 있으므로 서비스 중단이나 구성 Reload 없이 동적으로 작동합니다.
목차
1. 전제 조건
2. NGINX Unit – Django 프로젝트 생성
3. NGINX 구성
4. NGINX Unit 구성
5. 요약
1. 전제 조건
NGINX Unit 데모를 위해 다음 소프트웨어를 설치했습니다.
- Ubuntu 16.04
- NGINX Plus (명시된 경우를 제외하고 NGINX 오픈소스 사용 가능)
- 모든 언어 모듈이 설치된 NGINX Unit
- Python 3
- Django
root
권한 또는 이에 상승하는 액세스 권한 (필요한 경우sudo
사용)
2. NGINX Unit – Django 프로젝트 생성
1. Django 프로젝트를 생성하는 디렉터리로 변경합니다.
$ cd /var/www/
2. django-admin start project 명령을 사용하여 새 프로젝트를 초기화합니다. 그것을 djapp이라고 부릅니다.
$ sudo django-admin startproject djapp
3. 프로젝트 디렉터리로 변경합니다.
$ cd djapp
4. 프로젝트의 데이터베이스를 마이그레이션하기 위해 manage.py 스크립트를 사용하세요. 이는 새로 생성된 프로젝트에 필요합니다.
Django는 기본적으로 SQLite를 사용하며, NGINX Unit 데모에서는 기본값을 사용하지만 프로젝트 요구에 맞는 어떤 데이터베이스든 사용할 수 있습니다.
manage.py
스크립트는 2단계에서 실행한 django-admin
명령을 통해 설치되며, django-admin
과 동일한 명령과 인수를 수행하지만 프로젝트 별 설정을 자동으로 파생하고 사용하는 기능이 있어 편리합니다.
자세한 내용은 Django 문서를 참조하세요.
$ sudo python3 manage.py migrate
5. 이와 같은 샘플 프로젝트에 꼭 필요한 것은 아니지만, Django 슈퍼유저 ID를 생성하는 것이 좋습니다.
$ sudo python3 manage.py createsuperuser
6. 2단계에서 django-admin startproject
명령에 의해 생성된 settings.py 파일이 포함된 하위 디렉토리로 변경합니다.
$ cd /var/www/djapp/djapp
7. 원하는 텍스트 편집기를 사용하여 settings.py 을 엽니다. 해당 NGINX Unit 데모에서는 nano를 사용합니다.
$ sudo nano settings.py
ALLOWED_HOSTs
행을 찾아 애플리케이션의 도메인 이름, 호스트 이름 또는 IP 주소를 추가합니다.
ALLOWED_HOSTS = ['domain-name']
또한 파일 끝에 다음 행을 추가하여 애플리케이션이 제공하는 모든 정적 내용을 저장하는 디렉터리의 이름을 지정합니다.(9단계 참조)
STATIC_ROOT = '/var/www/djapp/djapp/static'
8. 메인 프로젝트 디렉터리(manage.py 가 있는 곳)로 다시 변경합니다.
$ cd ..
9. manage.py collect static
명령을 실행하여 장고 프로젝트에 있는 모든 정적 파일을 수집하고 7단계에서 정의한 STATIC_ROOT
위치에 넣습니다.
$ sudo python3 manage.py collectstatic
3. NGINX 구성
기본적으로 Django 자체가 프로젝트의 정적 콘텐츠를 제공하지만, NGINX 오픈소스와 NGINX Plus는 우수한 성능을 제공합니다. 여기에서는 NGINX Plus를 구성하지만, 아래에서 언급한 기능을 제외하고 NGINX 오픈소스를 사용할 수도 있습니다.
1. 디렉터리를 /etc/nginx/conf.d로 변경하세요. 이는 기능 별 (또는 NGINX Unit 데모의 경우 애플리케이션 별) HTTP 구성 파일의 전통적인 위치입니다.
$ cd /etc/nginx/conf.d
2. django.conf라는 파일을 만듭니다. (nano 사용)
$ sudo nano django.conf
다음 구성을 삽입하여 캐싱을 활성화하세요.
이 구성에는 NGINX Plus에만 해당하는 두 가지 기능이 포함되어 있습니다. NGINX Plus를 사용하고 해당 기능을 활용하려면 관련 지시문의 주석을 해제하세요.
- status_zone 지시문에 의해 이 가상 서버에서 확장된 메트릭 수집이 활성화됩니다. NGINX Plus API가 구성의 다른 위치에서 활성화되어 있다고 가정합니다.
health_check
지시문에 의해 Active Health Checks가 활성화됩니다.
참고할 점은 NGINX Conf의 NGINX Unit 데모에서 proxy_set_header 지시문의 두 번째 인수로 로컬 머신의 IP 주소를 지정했습니다. 실제 운영 환경에서는 아래와 같이 $host
변수를 사용하는 것이 더 합리적입니다.
# Upstream group for the backend (NGINX Unit running the Python application)
upstream django_unit {
zone django_unit 64k;
server 127.0.0.1:8000;
}
server {
listen 8080;
# Uncomment to collect metrics if using NGINX Plus and the NGINX Plus API
#status_zone django;
# enable caching
proxy_cache django_cache;
proxy_cache_valid 200 60m;
# root directory for static files
root /var/www/djapp/djapp;
# proxy to the NGINX Unit backend
location / {
proxy_pass http://django_unit;
# Second argument must match your production hostname and the value of
# ALLOWED_HOSTS in settings.py
proxy_set_header Host $host;
# Uncomment to enable active health checks if using NGINX Plus
#health_check;
}
# Location for the static files collected from Django and served by
# NGINX Plus; can be empty (as here), because it inherits the value of the
# 'root' directive from its parent block
location /static {
}
}
3. 구성에서 구문 유효성을 확인합니다.
$ sudo nginx –t
4. 오류를 수정한 후 구성을 reload 합니다.
$ sudo nginx -s reload
4. NGINX Unit 구성
마무리하기 위해서는 NGINX Unit을 구성하여 애플리케이션에 요청을 제공해야 합니다.
1. curl
명령을 실행하여 현재 NGINX Unit 구성을 표시하세요. 이 구성은 PHP에서 실행되는 WordPress를 위한 것입니다. 여기서는 출력을 표시하지 않지만, 아래의 6단계에서 WordPress 구성과 함께 Python 애플리케이션의 구성도 추가됩니다.
참고로 대부분의 curl
명령에는 sudo를 사용하지 않아도 될 수 있습니다. 여기서는 UNIX 소켓에 액세스하기 위해 루트가 가진 읽기-쓰기 권한이 필요하기 때문에 sudo가 필요합니다.
$ sudo curl --unix-socket /run/control.unit.sock
http://localhost/config/
2. NGINX Unit 구성 파일이 있는 디렉토리로 이동하세요.
이 파일들은 선택적이며, NGINX Unit API 호출의 인수로 모든 데이터를 입력하는 대신 구성 컬렉션을 편리하게 로드하는 방법입니다. 파일의 내용은 API를 통해 업로드되므로 (다른 구성 데이터와 마찬가지로) NGINX Unit은 파일 위치에 대해 알지 못하며 시작할 때 파일을 자동으로 읽을 수 없습니다. (NGINX 오픈소스 및 NGINX Plus와 달리) 대신, NGINX Unit은 실행 시 상태를 별도의 디렉토리에 저장합니다.
$ cd /etc/unit
3. django.config라는 파일을 만듭니다. (nano 사용)
$ sudo nano django.config
다음 JSON을 추가하세요. 이는 데모의 Python 애플리케이션을 나타냅니다.
{
"type": "python",
"processes": 5,
"module": "djapp.wsgi",
"path": "/var/www/djapp"
}
4. 다음 curl 명령을 실행하여 django.config에 포함된 JSON을 새로운 애플리케이션 객체로 로드하여 NGINX Unit에서 관리하도록 합니다. 이를 “djapp”라는 이름으로 지정합니다.
$ sudo curl -X PUT --data-binary @/etc/unit/django.config --unix-socket /run/control.unit.sock http://localhost/config/applications/djapp
이 명령어에서:
HTTP PUT
메서드는 최종 인수(URL)로 지정된 위치에 새로운 NGINX Unit 구성 객체를 생성합니다. 아래의 최종 항목을 참조하세요.--data-binary
인수는 curl에게 django.config의 내용을 정확히 그대로 로드하도록 지시하며, 개행 및 캐리지 리턴을 보존하고 어떠한 처리도 수행하지 않습니다.--unix-socket
인수는 NGINX Unit API가 수신 대기 중인 위치를 정의합니다. (기본 소켓 소유자인 root를 사용하기 때문에 sudo 명령을 사용합니다.)- 마지막 인수는 django.config의 JSON 형식 구성 데이터를 채울 새로운 애플리케이션 객체를 찾고 이름을 지정합니다.
config
는 최상위 구성 객체,applications
는 애플리케이션 객체의 상위 객체이며, djapp은 새로운 애플리케이션 객체의 이름입니다.
5. 애플리케이션의 리스너 객체를 정의하세요. 4단계에서와 같이 구성 데이터 파일을 로드하는 대신, curl 명령 라인에서 직접 데이터를 정의하고, djapp 애플리케이션이 8000 포트에서 수신 대기하도록 지정합니다.
$ sudo curl -X PUT --data-binary '{"application":"djapp"}' --unix-socket /run/control.unit.sock 'http://localhost/config/listeners/*:8000'
6. 1단계의 curl
명령을 반복하여 NGINX Unit 구성을 표시합니다. 구성은 이제 Python 애플리케이션인 djapp에 주황색으로 강조 표시됩니다.
$ sudo curl --unix-socket /run/control.unit.sock http://localhost/config/
{
"listeners": {
"127.0.0.1:8090": {
"application": "script_index_php"
},
"127.0.0.1:8091": {
"application": "direct_php"
},
"*:8000": {
"application": "djapp"
}
},
"applications": {
"script_index_php": {
"type": "php",
"processes": {
"max": 20,
"spare": 5
},
"user": "www-data",
"group": "www-data",
"root": "/var/www/wordpress",
"script": "index.php"
},
"direct_php": {
"type": "php",
"processes": {
"max": 5,
"spare": 0
},
"user": "www-data",
"group": "www-data",
"root": "/var/www/wordpress",
"index": "index.php"
},
"djapp": {
"type": "python",
"processes": 5,
"module": "djapp.wsgi",
"path": "/var/www/djapp"
}
}
}
5. 요약
이 게시물에서는 운영 환경에서 WordPress를 위해 PHP 애플리케이션을 실행하는 NGINX Unit을 시작하고, Python 애플리케이션을 추가했습니다. 데모에서는 NGINX Plus 대시보드를 사용하여 새로운 애플리케이션을 추가할 때 기존 애플리케이션에 중단이 없음을 보여주었지만, ps 명령과 같은 시스템 모니터링 도구를 사용하여 그 목적을 달성할 수 있습니다. NGINX Unit 구성의 동적 특성은 실행 중인 애플리케이션에 대한 리소스를 절약하고, 새로운 배포에서의 다운타임 없는 운영 및 애플리케이션 버전 간의 원활한 전환을 보장합니다.
NGINX Unit을 시작해 보시려면 NGINX Unit Documentation을 확인해 보시거나, NGINX STORE에 문의하여 사용 사례에 대해 논의해보세요.
아래 뉴스레터를 구독하고 NGINX와 NGINX STORE의 최신 정보들을 빠르게 전달 받아보세요.