Python 웹 프레임 워크, WSGI 및 CGI가 함께 사용되는 방법


150

Python 스크립트를 CGI로 실행할 수 있는 Bluehost 계정이 있습니다. 실행하려면 다음을 정의해야하기 때문에 가장 간단한 CGI라고 생각합니다 .htaccess.

Options +ExecCGI
AddType text/html py
AddHandler cgi-script .py

이제 파이썬으로 웹 프로그래밍을 검색 할 때마다 WSGI와 대부분의 프레임 워크에서이를 사용하는 방법에 대해 많이 듣습니다. 그러나 특히 웹 서버가 제공 될 때 (호스트의 컴퓨터에서 실행되는 Apache) .htaccess명령을 정의하지 않는 한 실제로 재생할 수있는 것이 아닌 경우 모두 잘 어울리지 않습니다 .

방법이다 WSGI , CGI, 그리고 프레임 워크는 모든 연결? 기본 CGI 구성 에서 웹 프레임 워크 (예 : web.py 또는 CherryPy ) 를 실행하려면 무엇을 알고 설치하고 수행해야 합니까? WSGI 지원을 설치하는 방법?

답변:


242

WSGI, CGI 및 프레임 워크는 모두 어떻게 연결되어 있습니까?

Apache는 포트 80에서 수신 대기합니다. HTTP 요청을받습니다. 응답 방법을 찾기 위해 요청을 구문 분석합니다. 아파치는 응답을위한 많은 선택이있다. 응답하는 한 가지 방법은 CGI를 사용하여 스크립트를 실행하는 것입니다. 응답하는 또 다른 방법은 단순히 파일을 제공하는 것입니다.

CGI의 경우 Apache는 환경을 준비하고 CGI 프로토콜을 통해 스크립트를 호출합니다. 이것은 표준 Unix Fork / Exec 상황입니다. CGI 하위 프로세스는 소켓 및 stdout을 포함한 OS 환경을 상속합니다. CGI 서브 프로세스는 응답을 작성하여 Apache로 돌아갑니다. Apache는이 응답을 브라우저로 보냅니다.

CGI는 원시적이고 성가시다. 대부분 요청마다 서브 프로세스를 분기하므로 서브 프로세스는 stdout 및 stderr를 종료하거나 닫아 응답의 끝을 나타냅니다.

WSGI는 CGI 디자인 패턴을 기반으로하는 인터페이스입니다. 반드시 CGI 일 필요는 없으며 각 요청에 대해 하위 프로세스를 분기 할 필요는 없습니다. CGI 일 수 있지만 반드시 그럴 필요는 없습니다.

WSGI는 몇 가지 중요한 방식으로 CGI 디자인 패턴에 추가됩니다. HTTP 요청 헤더를 구문 분석하고이를 환경에 추가합니다. 환경에서 POST 지향 입력을 파일과 같은 오브젝트로 제공합니다. 또한 응답을 공식화하는 기능을 제공하여 많은 서식 세부 사항을 저장합니다.

기본 CGI 구성에서 웹 프레임 워크 (예 : web.py 또는 cherrypy)를 실행하려면 무엇을 알고 / 설치 /해야합니까?

하위 프로세스를 포크하는 것은 비용이 많이 듭니다. 이 문제를 해결하는 데는 두 가지 방법이 있습니다.

  1. 아파치 안에 파이썬을 내장mod_wsgi 하거나 mod_python내장한다; 프로세스가 분기되지 않습니다. Apache는 Django 애플리케이션을 직접 실행합니다.

  2. WSGI 프로토콜을 사용하여 데몬mod_wsgi 또는 mod_fastcgiApache가 별도의 데몬 (또는 "장기 실행 프로세스")과 상호 작용할 수 있도록합니다. 장기 실행 Django 프로세스를 시작한 다음이 프로세스와 통신하도록 Apache의 mod_fastcgi를 구성하십시오.

참고 mod_wsgi두 모드에서 작동 할 수 있습니다 : 내장 또는 데몬.

mod_fastcgi를 읽으면 Django가 flup 를 사용하여 mod_fastcgi에서 제공 한 정보로부터 WSGI 호환 인터페이스를 생성 한다는 것을 수 있습니다. 파이프 라인은 이와 같이 작동합니다.

Apache -> mod_fastcgi -> FLUP (via FastCGI protocol) -> Django (via WSGI protocol)

Django에는 다양한 인터페이스를위한 몇 가지 "django.core.handlers"가 있습니다.

mod_fastcgi의 경우 Django는 manage.py runfcgiFLUP와 처리기를 통합 하는 을 제공 합니다.

mod_wsgi의 경우이를위한 핵심 처리기가 있습니다.

WSGI 지원을 설치하는 방법?

다음 지시 사항을 따르십시오.

https://code.google.com/archive/p/modwsgi/wikis/IntegrationWithDjango.wiki

배경은 이것을 참조하십시오

http://docs.djangoproject.com/en/dev/howto/deployment/#howto-deployment-index


4
공유 호스팅을 사용하고 있기 때문에 mod_wsgi를 설치할 수 없습니다. 내가 가진 것은 fcgi 지원뿐입니다. 여전히 WSGI 앱을 통해 어떻게 실행할 수 있습니까?
Eli Bendersky

3
+1 훌륭한 답변입니다. 마음에 들었던 많은 질문에 대답 할 수 있습니다. 이 답변은 아직 완료되지 않았습니다. CGI와 WSGI에 대해 잘 설명했지만 FASTCGI와 WSGI의 관계와 차이점은 무엇입니까? 어떤게 더 좋아? 그들은 어떻게 작동합니까? mod_python은 어떻게 등장 했습니까?
발톱

14
S.Lott는 사람들이 "더 나은"질문을하는 것에 대해 불평하는 대신 단순히 "mod_wsgi가 X보다 낫고 fastcgi가 Y에 더 낫습니다"라고 말하지 말고 OP에 더 구체적인 질문이 있으면 물어볼 것입니다.
Gregg Lind

7
@ 그레그 린드 : 단순히 "mod_wsgi가 X보다 낫고 fastcgi가 Y에 낫습니다"라고 간단히 말하지 않겠습니까? 하기가 쉽지 않기 때문입니다. X 및 Y 세트의 요소 인 수십 가지의 비 기능적 품질 요소가 있습니다. 그것들을 모두 열거하기는 어렵습니다. 사람들이 관련 품질 요소에 대해 구체적인 질문을하는 것이 훨씬 낫습니다.
S.Lott

4
참고 사항 : runfcgi 옵션은 1.7 버전부터 더 이상 사용되지 않으며 FastCGI 지원은 Django 1.9에서 제거되었습니다.
OBu

58

플로리안의 답변 은 특히 PEP 를 읽는 경우 "WSGI 란 무엇인가"에 대한 귀하의 질문에 대한 답변 이라고 생각 합니다 .

끝까지 향한 질문에 관해서는 :

WSGI, CGI, FastCGI 등은 웹 서버가 코드실행 하고 생성되는 동적 컨텐츠를 제공 하기위한 모든 프로토콜입니다 . 이것을 일반 웹 파일과 비교하면 일반 HTML 파일이 기본적으로 클라이언트에 그대로 제공됩니다.

CGI, FastCGI 및 SCGI는 언어에 구애받지 않습니다. Perl, Python, C, bash 등으로 CGI 스크립트를 작성할 수 있습니다. CGI는 URL을 기반으로 호출 실행 파일과 호출 방법 ( 인수 및 환경)을 정의합니다. 실행 파일이 완료되면 반환 값을 웹 서버로 다시 전달하는 방법도 정의합니다. 변형은 기본적으로 더 많은 요청을 처리하고 지연 시간을 줄일 수있는 최적화입니다. 기본 개념은 동일합니다.

WSGI는 Python 전용입니다. 언어에 구애받지 않는 프로토콜 대신 표준 함수 서명이 정의됩니다.

def simple_app(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']

이는 완전한 (제한된 경우) WSGI 응용 프로그램입니다. WSGI를 지원하는 웹 서버 (예 : mod_wsgi가있는 Apache)는 요청이 도착할 때마다이 기능을 호출 할 수 있습니다.

이것이 큰 이유는 HTTP GET / POST에서 CGI로 파이썬으로 변환하고 다시 나갈 때 번거로운 단계를 피할 수 있기 때문입니다. 훨씬 더 직접적이고 깨끗하며 효율적인 연결입니다.

또한 요청에 필요한 모든 것이 함수 호출 인 경우 웹 서버 뒤에서 장기 실행 프레임 워크를 실행하는 것이 훨씬 쉽습니다. 일반 CGI를 사용하면 각 개별 요청에 대해 전체 프레임 워크시작해야합니다 .

WSGI를 지원하려면 mod_wsgi 와 같은 WSGI 모듈을 설치 하거나 CherryPy 와 같은 WSGI가 구워진 웹 서버를 사용해야합니다 . 둘 중 어느 것도 가능하지 않으면 PEP에 제공된 CGI-WSGI 브리지를 사용할 있습니다.


3
WSGI 언어를 무시하지 않는 것이 누구의 멍청한 생각입니까? 요점이 뭐야? Python 전체를 Apache 모듈로 제공 할 수도 있습니다.
살만 폰 압바스

2
@SalmanPK 나는 단지 트레이드 오프라고 생각합니다. 확실히 선택한 언어로 함수를 구현하여 사용할 수있는 언어에 구애받지 않는 프로토콜을 만드는 것은 쉬운 일이 아닙니다.
phunehehe

21

Pep333이 예로 설명하는 것처럼 CGI를 통해 WSGI를 실행할 수 있습니다 . 그러나 요청이있을 때마다 새로운 Python 인터프리터가 시작되고 모든 컨텍스트 (데이터베이스 연결 등)를 빌드해야합니다. 모두 시간이 걸립니다.

WSGI를 실행하려는 경우 호스트가 mod_wsgi를 설치 하고 자신 의 응용 프로그램에 대한 제어를 지연하도록 적절한 구성을하는 것이 가장 좋습니다.

FlupFCGI , SCGI 또는 AJP 를 사용할 수있는 모든 웹 서버에 대해 WSGI를 실행하는 또 다른 방법 입니다. 내 경험으로는 FCGI 만 실제로 작동하며 mod_fastcgi 를 통해 또는 mod_proxy_fcgi 로 별도의 Python 데몬을 실행할 수있는 경우 Apache에서 사용할 수 있습니다 .

WSGI 는 웹 서버와 Python 코드가 상호 작용할 수있는 규칙 세트를 정의하는 CGI와 매우 유사한 프로토콜이며 Pep333 으로 정의됩니다 . 많은 다른 웹 서버가 동일한 응용 프로그램 프로토콜을 사용하여 많은 다른 프레임 워크와 응용 프로그램을 사용할 수 있습니다. 이것은 매우 유익하며 매우 유용합니다.


3
CGI를 통해 WSGI를 실행하는 것은 무엇입니까? 플랩은 구성표와 어떻게 연결되어 있습니까?
Eli Bendersky

7

이 공간의 모든 용어에 대해 명확하지 않고 혼란스러운 약어가있는 용어를 직면하게하는 경우 CGI 대 FastCGI 대 WSGI 등을 설명하는 공식 파이썬 HOWTO 형식의 훌륭한 배경 독자가 있습니다. : http://docs.python.org/howto/webservers.html


2
URL이 오래되어 업데이트 된 것 같습니다. docs.python.org/2.7/howto/webservers.html
Stefaan

훌륭한 자료 :)이 공식적인 소개와 함께 받아 들여진 대답을 읽어야합니다.
Rick

4

이것은 서블릿 스펙이 Java에 대한 것과 유사한 Python을위한 간단한 추상화 계층입니다. CGI는 실제로 저수준이며 프로세스 환경 및 표준 입출력에 물건을 덤프하는 반면, 위의 두 사양은 http 요청 및 응답을 언어의 구성으로 모델링합니다. 그러나 필자는 파이썬 사람들이 사실상의 구현에 정착하지 않았으므로 참조 구현과 WSGI 지원과 함께 다른 것을 제공하는 다른 유틸리티 유형 라이브러리 (예 : 붙여 넣기)를 혼합했습니다. 물론 틀릴 ​​수도 있습니다. 저는 파이썬을 처음 접했습니다. "웹 스크립팅"커뮤니티는 다른 방향 (공유 호스팅, CGI 레거시,

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.