2012-02-24 3 views
3

우분투 11.10, Python 2.6. 배경 : 저는 Twisted를 사용하여 루프에 앉아서 RESTful 명령이 오기를 기다리는 파이썬 응용 프로그램을 가지고 있습니다. 그래서 응용 프로그램이 시작되어 다양한 작업을 수행하는 스레드가 실행되고 주 스레드가 Twisted에 대한 콜백을 설정 한 다음 호출합니다 Twisted.reactor.run(), 영원히 차단합니다. 요청이 들어 오면 적절한 핸들러가 호출되고, 처리가 이루어지고, 응답이 되돌려 보내집니다.Apache + mod_wsgi + 영구 Python 응용 프로그램 - 조각이 누락 된 것 같습니다.

경영진이 싫어한다고 트위터가 제 트를 제거했습니다. 우리는 웹 서버로서 Apache로 이동하고 있습니다.

설명서를 사용하여 Apache2.0을 설치하고 웹 페이지를 제공하도록 구성했습니다. 또한 mod_wsgi를 설치했고 요청이 들어올 때 Apache와 임의의 Python 코드를 실행하도록 Apache를 구성 할 수있었습니다.

제가 누락 된 이유는 응용 프로그램을 지속적이고 항상 실행해야하기 때문에 파이썬 응용 프로그램을 Apache/mod_wsgi 비트에 연결하는 방법입니다. 내 wsgi 스크립트와 주요 응용 프로그램 사이에 파이프를 열어 요청을 그렇게 직렬화하는 것이 좋습니다. 그러나 이것이 이미 이미 존재해야만하는 것처럼 보입니다. 나는 무엇을 검색해야 할지를 알만큼 충분하지 않습니다.

오른쪽 방향으로 어떤 푸시도 크게 환영합니다.

명확성을 위해 추가 편집 : 웹 서버를 만들고 있지 않습니다. 문제의 응용 프로그램은 가상 컴퓨터에서 실행중인 호스트 응용 프로그램입니다. HTTP를 통해 RESTful 인터페이스에 의해 제어됩니다. 따라서 들어오는 명령을 듣고 응답 할 수 있어야합니다.

mod_wsgi가이 작업에 적합한 도구가 아닐 수도 있습니다. 괜찮습니다. 단지 무엇인지 모르겠습니다.

+0

"내 전체 응용 프로그램을 실행하기 위해 아파치에 의존하는 것은 여전히 ​​조금 어색한 것 같습니다." 나쁜 생각. 정말 좋은 것입니다. 더 나아가 Apache는 정적 컨텐츠를 제공하여 워크로드를 쉽게 처리 할 수 ​​있으므로 응용 프로그램을 손쉽게 사용할 수 있습니다. –

+0

우리는 어떤 코드를보아야합니까? 더 이상 "메인"스크립트가 없다는 것을 이해합니까 **? 'mod_wsgi'가 각 요청을 처리하기 위해 필요에 따라 애플리케이션을 호출한다는 것을 알고 있습니까? WSGI 표준 문서를 읽었습니까? 추가 코드를 제거하고 실제로 잘못된 것이 무엇인지에 대한 집중적 인 질문을 제공 할 수 있습니까? –

+0

@ S.Lott : 처음에는 제 질문의 근원 인 것을 이해합니다. 내가 이해하려고 노력하는 것은 끊임없이 실행되는 애플리케이션에 어떻게 맞을지뿐만 아니라 들어오는 http 요청을 수신 대기해야하는 것입니다. 현재 사용중인 Twisted 라이브러리는 요청이 들어올 때 실행되는 콜백 함수를 수락함으로써이를 제공합니다. 두 가지 버전의 코드는 지금까지 시도한 것을 문서화하기 위해 제공되었습니다. – JoeFish

답변

0

내 wsgi 스크립트와 내 응용 프로그램 사이에 파이프를 열고 그런 식으로 요청을 직렬화하는 것이 좋습니다.

이것이 바로 다중 처리 대기열의 용도입니다.

http://docs.python.org/library/multiprocessing.html

http://docs.python.org/library/multiprocessing.html#pipes-and-queues

당신이 Celery를 사용하여 시작하면 당신도 행복 할 것이다

.

셀러리를 사용하면 관리인이 마음에 들지 않기로 결정했기 때문에 "트위스트를 제거 할 수 있습니다."

그러나. 셀러리로 전환한다는 것은 "앱이 시작되어 다양한 일을하는 스레드를 시작하고 메인이 Twisted에 대한 콜백을 설정 한 다음 Twisted.reactor.run()을 호출하여 영원히"모든 것을 완전히 다시 생각해야합니다. . 메인 폴링 루프 대신 셀러리가 조정하는 여러 독립 프로세스가 있습니다.

응용 프로그램의 모든 정리 작업 - 스레드 간의 모든 조정 - 콜백 -이 모든 작업이 사라집니다. "실제 작업"을 수행하는 Python 스크립트와 Celery를 사용하여 분산 작업 대기열을 관리 할 수 ​​있습니다.

1

mod_wsgi의 daemon mode은 귀하의 경우에 충분한 지속성을 제공합니까? 또는 아파치와 별도로 메인 프로세스를 실행하고 싶다면 mod_fastcgi는 어떻습니까? 어쩌면 아파치를 리버스 프록시로 실행하는 것도 옵션 일 수 있습니다.

+0

데몬 모드에서 실행 해 보았습니다 만 스크립트를 변경했을 때 apachectl을 다시 시작하지 않아도되는 것 같습니다. 요청이 들어올 때마다 여전히 스크립트의 새로운 인스턴스를 실행 했으므로 내가 알 수있는 한 동일한 배에 있습니다. 나는 mod_fastcgi를 살펴볼 것이다. 고마워. – JoeFish

+1

데몬 모드에서 maximum-requests 옵션을 설정하지 않는 한 프로세스는 후속 요청 중에 실행됩니다 ("daemon"이름에서 알 수 있듯이). 구성 및/또는 wsgi python 처리기를 게시 할 수 있습니까? – jholster

+0

둘 다 제 OP에 추가 할 것입니다. 어쩌면 나는 핸들러가 어떻게 보이는지, 또는 정확히 핸들러로서 아파치 데몬 쓰레드에 무엇을 주어야 하는지를 이해하지 못한다. – JoeFish

관련 문제