Python 응용 프로그램 서버

Python 응용 프로그램 서버

반응형

웹 서버: 클라이언트가 웹 페이지 열기 요청을 보낼 때 브라우저는 응답을 어딘가에서 가져와야 하며, 이 어딘가가 웹 서버입니다. 이제 게임을 위한 응용 프로그램이 있다고 가정합니다.

클라이언트가 게임을 시작하고, 서버가 응답하여, 이제 서버는 두 가지 작업을 할 수 있습니다.

고객이 다음 조치를 취할 때까지 기다립니다. 차단을 피하기 위해 플레이를 원하는 다른 고객이 있는지 확인합니다.

역방향 프록시: 클라이언트의 요청을 수락하고 요청을 수행할 수 있는 서버로 전달한 후 클라이언트에 서버의 응답을 반환합니다.

Nginx는 요청이 단일 스레드에서 처리되는 비동기, 이벤트 기반 접근 방식을 사용합니다. 여러 작업자 프로세스를 제어하는 마스터 프로세스가 하나 있습니다. 각 작업자는 다수의 동시 연결을 처리할 수 있습니다. 작업자는 단일 스레드이며, 비동기이므로 각 요청을 다른 요청을 차단하지 않고 작업자가 동시에 실행할 수 있습니다. 위의 게임 예처럼. 다양한 파라미터로 필요에 따라 nginx를 튜닝할 수 있습니다. 그 중 두 가지는 다음과 같습니다.

worker_filen: nginx 작업자 수(기본값: 1). 대부분의 경우 하나의 작업자 프로세스/CPU 코어를 실행하는 것이 좋습니다. 하지만 그에 맞게 조율할 수 있습니다.

worker_connections: 각 작업자 프로세스가 동시에 처리할 수 있는 최대 연결 수입니다. 기본값은 512이지만 대부분의 시스템에는 더 많은 리소스를 지원할 수 있는 충분한 리소스가 있습니다.

초기에는 웹 서버만 있었고, python 애플리케이션을 실행하기 위해 mod_python 모듈이 있었습니다. 그러나 이것은 python 어플리케이션에는 그다지 적합하지 않습니다. 그래서 사람들은 웹 서버가 python 애플리케이션과 대화할 수 있는 몇 가지 표준을 정의하기로 결정했습니다. WSGI가 표준입니다.

Django, CherryPy, Flask 등과 같은 WSGI를 지원하는 Python 애플리케이션을 작성할 수 있는 프레임워크가 많지만 수천 개의 요청을 동시에 처리하기에는 충분하지 않거나 서버에서 최적의 경로를 지정하는 방법을 알지 못합니다. 따라서 우리는 웹서버를 다루는 애플리케이션을 호스팅할 수 있는 다른 서버가 필요합니다. 응용 프로그램 서버는 응용 프로그램을 호스트하는 서버입니다. 또한 Python 응용 프로그램의 경우 응용 프로그램 서버는 WSGI 표준을 따르므로 WSGI 서버라고 합니다.

WSGI 서버는 구성을 사용하여 응용프로그램의 경로를 가져옵니다. WSGI 응용 프로그램은 요청을 받고 응답을 반환하는 단일 동기 호출 가능입니다. 설계는 HTTP 스타일 요청/응답 주기에 연결됩니다. 따라서 장기간 연결을 달성하려면 서버가 차단되므로 실시간 애플리케이션에 적합하지 않습니다.

WSGI를 비동기 호출 가능으로 만든 경우(즉, 응답을 기다리지 않고 다른 작업으로 전환하거나 다른 요청을 처리할 수 있음), 요청을 제공하는 경로가 하나뿐이기 때문에 여러 수신 이벤트(예: WebSockets)가 있는 프로토콜을 처리할 수 없습니다.

그래서 이 모든 사람들을 다루기 위해 ASGI 표준을 도입했습니다. 기본 목표는 일반적인 HTTP 처리 코드와 함께 HTTP/2 및 WebSocket 코드를 작성하는 방법을 제공하는 것입니다.

Python은 GIL 때문에 프로세스당 1개 이상의 스레드를 실행하지 않습니다. 프로세스에 100개의 스레드가 있더라도 GIL은 하나의 스레드만 동시에 실행할 수 있습니다. 즉, 언제든지 99개의 스레드가 일시 중지되고 1개의 스레드가 작동합니다. 구니콘은 이 한계를 극복할 수 있는 한 방법이다.

Gunicorn:은 사전 포크 작업자 모델을 기반으로 하는 WSGI 서버입니다. 이는 일련의 작업자 프로세스를 관리하는 중앙 마스터 프로세스가 있음을 의미합니다. 마스터는 절대 개별 고객에 대해 아무것도 모릅니다. 모든 요청 및 응답은 작업자 프로세스에 의해 완전히 처리됩니다.

구니콘에서는 다양한 매개변수를 정의할 수 있습니다. 다음은 몇 가지입니다.

1) 작업자: 시작할 작업자 수입니다. 일반적으로 시작할 작업자 수로 (2 x $num_cores) + 1을 만드는 것이 좋습니다.

2) 나사산: 또한 기본적으로 1인 많은 스레드/작업자를 정의할 수 있습니다.

3) worker class: 작업자 클래스는 작업자의 작업 방식을 정의합니다. Gunicorn은 동기, Gevent, evenlet, 토네이도, gthread worker 클래스를 제공합니다. sync가 기본값입니다.

초당 많은 요청을 처리한다고 가정합니다. 동기화 작업자를 사용하는 경우 작업자를 늘리거나 작업자에 스레드를 추가할 수 있습니다.

Sync workers - 가장 기본적이고 기본 worker 유형은 한 번에 하나의 요청을 처리하는 동기식 worker 클래스입니다.

비동기 작업자(event, evenlet) — 사용할 수 있는 비동기 작업자는 Greenlet(Eventlet 및 Gevent를 통해)을 기반으로 합니다.

우리가 알고 있듯이 python은 스레드가 1개 이상 실행되지 않기 때문에 worker 수를 늘려야 합니다. 그러나 더 많은 인원을 추가하는 것은 성과에 부정적인 영향을 미치는 티핑 포인트가 있다. 따라서 녹색 스레드(Greenlet)를 사용하는 비동기 작업자 클래스를 사용할 수 있습니다. 작업자에게 스레드를 생성하지 않아도 되는 이점을 얻을 수 있습니다. 스레드를 명시적으로 작성할 필요 없이 스레드를 가져오는 것으로 가정합니다.

이것이 당신이 기본을 이해하는 데 도움이 되기를 바랍니다. 탐구할 것이 많으므로 탐구할 수 있습니다:)

from http://devcloset.tistory.com/323 by ccl(A) rewrite - 2021-07-26 03:00:26