NGINX Plus

uWSGI 및 Django에서 애플리케이션 Gateway로 NGINX 및 NGINX Plus 사용

이 문서에서는 uWSGI 및 Django에서 애플리케이션 Gateway로 NGINX 또는 NGINX Plus 를 구성하는 방법을 설명합니다.

목차

1. 소개
2. uWSGI 및 Django 개요

3. uWSGI 및 Django와 함께 사용하도록 NGINX 및 NGINX Plus 구성하기
4. 결론

1. 소개

NGINX Plus 는 확장 가능하고 안전하며 신뢰할 수 있는 고성능 웹 서버이자 Reverse Proxy입니다. NGINX는 HTTP 연결과 트래픽을 관리하기 위한 모든 주요 웹 가속 기술을 지원합니다. Load Balancing, SSL Termination, 연결 및 요청 정책, 정적 콘텐츠 Offload, 콘텐츠 캐싱과 같은 NGINX 기능은 수년 동안 NGINX 사용자가 안정적이고 빠른 웹사이트를 빠르고 효율적으로 구축하는 데 도움을 주었습니다.

또한 NGINX는 사용자로부터 애플리케이션으로 트래픽을 전달하기 위한 다양한 특수 내장 인터페이스를 제공하는 보안 애플리케이션 Gateway의 역할도 수행할 수 있습니다. 이와 관련하여 NGINX는 HTTP 지원 애플리케이션 컨테이너로 HTTP 및 HTTPS 트래픽을 Proxy할 수 있을 뿐만 아니라 FastCGI, Memcached, scgi, uwsgi와 같은 모듈로 구현된 최적화된 애플리케이션 Gateway 인터페이스를 통해 대부분의 인기 있는 경량 애플리케이션 서버 및 웹 프레임워크와 직접 통신할 수도 있습니다.

가장 일반적으로 사용되는 애플리케이션 컨테이너에는 일부 라우팅 기능이 있는 외부 HTTP 인터페이스가 내장되어 있지만, NGINX를 애플리케이션 Gateway로 사용하는 중요한 이유 중 하나는 HTTP 연결 관리, Load Balancing, 콘텐츠 캐싱 및 트래픽 보안을 위한 All-In-One 솔루션을 제공한다는 점입니다. 애플리케이션 Backend는 더 나은 확장성과 성능을 위해 NGINX 뒤에 안전하게 배치됩니다. 또한 NGINX 뒤에 애플리케이션 인스턴스를 클러스터링하여 고가용성 애플리케이션을 구축하는 것도 매우 쉽습니다.

2. uWSGI 및 Django 개요

“특수 인터페이스”에 대해 몇 마디. HTTP는 유용하지만 현대의 경량 애플리케이션 배포 시나리오에 최적화된 적이 없습니다. 최근 몇 년 동안 다양한 애플리케이션 프레임워크 및 애플리케이션 컨테이너와 함께 사용할 수 있도록 여러 표준화된 인터페이스가 발전해 왔습니다. 이러한 인터페이스 중 하나는 웹 서버/Proxy와 Python 기반 애플리케이션 간의 인터페이스인 Web Server Gateway Interface(WSGI)입니다.

가장 일반적으로 사용되는 애플리케이션 서버 중 하나로서 uwsgi 프로토콜을 제공합니다.- WSGI 프로토콜의 자체 구현 – uWSGI 애플리케이션 서버 컨테이너입니다.

그 외에도 uWSGI 애플리케이션 서버는 HTTP, FastCGI, SCGI를 지원합니다. – 애플리케이션과 가장 빠르게 통신할 수 있는 방법으로 uwsgi 프로토콜이 권장됩니다.

3. uWSGI 및 Django와 함께 사용하도록 NGINX 및 NGINX Plus 구성하기

이 문서는 uWSGI 서버 및 Python 개발 환경과 함께 사용할 수 있도록 NGINX 및 NGINX Plus를 구성하는 방법에 대한 예제를 제공합니다.

NGINX 0.8.40 이상 및 NGINX Plus 의 모든 릴리스에는 uwsgi 프로토콜을 통해 사용자로부터 Python 애플리케이션으로 트래픽을 전달하는 기본 지원이 포함되어 있습니다.

uWSGI 애플리케이션 컨테이너 자체를 구성하는 것은 이 문서의 범위를 벗어나므로 자세한 내용은 Python/WSGI 애플리케이션을 위한 훌륭한 빠른 시작을 참조하세요.

Django는 가장 일반적으로 사용되는 Python 웹 프레임워크라 할 수 있으므로 편의를 위해 이 예제에서는 Python 애플리케이션에 대한 Django 기반 설정을 사용합니다. Django 문서는 Django 환경을 구성하는 방법에 대한 광범위한 정보를 제공합니다.

이것은 Django로 uWSGI 서버를 호출할 수 있는 한 가지 방법입니다.

     --chdir=/var/django/projects/myapp \
     --module=myapp.wsgi:application \
     --env DJANGO_SETTINGS_MODULE=myapp.settings \
     --master --pidfile=/usr/local/var/run/uwsgi/project-master.pid \
     --socket=127.0.0.1:29000 \
     --processes=5 \
     --uid=505 --gid=505 \
     --harakiri=20 \
     --max-requests=5000 \
     --vacuum \
     --daemonize=/usr/local/var/log/uwsgi/myapp.log

이러한 옵션이 적용된 상태에서 다음은 Django 프로젝트에 사용할 수 있는 샘플 NGINX 구성입니다.

http {
    # ...
    upstream django {
        server 127.0.0.1:29000;
    }

    server {
        listen 80;
        server_name myapp.example.com;
        root /var/www/myapp/html;

        location / {
            index index.html;
        }

        location /static/  {
            alias /var/django/projects/myapp/static/;
        }

        location /main {
            include /etc/nginx/uwsgi_params;
            uwsgi_pass django;
            uwsgi_param Host $host;
            uwsgi_param X-Real-IP $remote_addr;
            uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
            uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
        }
    }
}

Note: 구성이 django라는 Upstream을 정의한다는 것을 알 수 있습니다. 그룹 내 서버의 포트 번호인 29000은 샘플 uwsgi 명령의 socket 인수에 지정된 대로 uWSGI 서버가 바인딩하는 포트 번호와 일치합니다.

정적 콘텐츠의 서빙은 /var/django/projects/myapp/static에서 직접 서빙하는 NGINX 또는 NGINX Plus로 Offload됩니다. /main에서 애플리케이션에 대한 트래픽은 HTTP에서 uwsgi 프로토콜로 Proxy 및 Bridge되어 uWSGI 애플리케이션 컨테이너 내부에서 실행되는 Django 애플리케이션으로 전달됩니다.

4. 결론

경량의 Heterogeneous 애플리케이션 환경은 최신 웹 애플리케이션을 빌드하고 배포하는 방법으로 점점 더 인기를 얻고 있습니다. uwsgi 및 FastCGI와 같은 최신의 표준화된 애플리케이션 인터페이스 프로토콜을 사용하면 사용자와 애플리케이션 간의 통신 속도를 높일 수 있습니다.

애플리케이션 컨테이너 앞에 NGINX 및 NGINX Plus 를 사용하는 것은 애플리케이션이 HTTP 트래픽 관리의 부담을 덜고 예기치 않은 사용자 트래픽 급증, 악성 행위, 서비스 거부(DoS) 공격 등으로부터 애플리케이션을 보호할 수 있는 일반적인 방법이 되었습니다. 실제 애플리케이션에서 외부 HTTP 트래픽을 분리하면 개발자는 애플리케이션 로직에만 집중하고 웹 가속과 기본적인 HTTP 트래픽 보안 작업은 NGINX 또는 NGINX Plus 에 맡길 수 있습니다.