2010-07-09 3 views
0

우선 내 사이트가 정상적으로 실행 중입니다. 중요한 문제는 없습니다.장고 멀티 스레드 및 mod_wsgi

나는 두 가지를 이해하고 싶다.

시스템의 개요부터 시작하겠습니다.

이것은 mod_wsgi가있는 Apache에서 256MB RAM이있는 CentOS 5.3 VPS에있는 장고 동력 사이트입니다.

django 응용 프로그램은 스레드가 1 개인 데몬 프로세스로 실행됩니다. 나는 1. 초기화 로깅 (현재는 노력하고 있습니다,하지만 난 두 번 로깅 할 때마다 얻을)

이제 몇 가지 배경 작업을 수행하는 데몬 스레드 2. 시작 : 내 응용 프로그램에서 필요한 것은

입니다 http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html 에 제공된 솔루션을 읽고 구현했지만 많은 도움이되지 못했습니다.

기본적으로 작업자 MPM을 수동으로 비활성화해야합니다 (MPM 프리프레 드로 만 실행). 하나의 프로세스와 하나의 스레드로 구성된 데몬 프로세스를 구성해야합니다 (다른 이유로는 작동하지 않습니다).

하지만 이상한 점은 사이트가 실행 중이고 2 개의 백그라운드 스레드를 만들고 있다는 것입니다. 1. 어떻게됩니까? 2. 내 설정은 동시 요청이 내 사이트에서 처리되지 않는다는 의미입니까? 여기

내 사이트에서 일부 구성입니다

을 httpd.conf

WSGIScriptAlias//var/www/NiceHouse/trunk/apache/django.wsgi 

WSGISocketPrefix run/wsgi 

<VirtualHost *:80> 

    WSGIDaemonProcess site-1 user=**** group=**** threads=1 
    WSGIProcessGroup site-1 

    ServerName ***** 
    ServerAlias ***** 
    ServerAdmin ***** 

    #DocumentRoot /usr/local/www/documents 

    #Alias /robots.txt /usr/local/www/documents/robots.txt 
    #Alias /favicon.ico /usr/local/www/documents/favicon.ico 

    Alias /media/ /usr/lib/python2.4/site-packages/django/contrib/admin/media/ 
    Alias /site_media/ /var/www/NiceHouse/trunk/media/ 
    Alias /phpmyadmin /var/www/phpmyadmin/ 

    #<Directory /usr/local/www/documents> 
    #Order allow,deny 
    #Allow from all 
    #</Directory> 

    WSGIScriptAlias//var/www/NiceHouse/trunk/apache/django.wsgi 

    #<Directory /usr/local/www/wsgi-scripts> 
    #Order allow,deny 
    #Allow from all 
    #</Directory> 

</VirtualHost> 

swtune.conf

<IfModule prefork.c> 
StartServers  1 
MinSpareServers 1 
MaxSpareServers 3 
ServerLimit  50 
MaxClients  50 
MaxRequestsPerChild 1000 
</IfModule> 

django.wsgi

,451,515,
import sys 
import os 

os.environ['PYTHON_EGG_CACHE']='/tmp/hoge' 
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

sys.path.insert(0,'/var/www/NiceHouse/trunk') 

import settings 

import django.core.management 
django.core.management.setup_environ(settings) 
utility = django.core.management.ManagementUtility() 
command = utility.fetch_command('runserver') 

command.validate() 

import django.conf 
import django.utils 

django.utils.translation.activate(django.conf.settings.LANGUAGE_CODE) 

import django.core.handlers.wsgi 

application = django.core.handlers.wsgi.WSGIHandler() 

나는 당신 이유로 이중 로깅을 받고있을 수있는 모든 도움을

감사합니다, Elad

답변

2

을 주셔서 감사합니다. 먼저 로깅을 넣은 곳이 무엇입니까? settings.py 파일에 로그인하지 못하면 사용중인 WSGI 스크립트 파일 내용으로 두 번 실행됩니다. 블로그 게시물은 설정 파일을 두 번 가져 오는 방법을 설명합니다.

그런데도 WSGI 스크립트 파일을 올바르게 복사하지 않았습니다. 그 블로그 게시물 DJANGO_SETTINGS_MODULE 환경 변수를 설정하지 않습니다.

두 개의 다른 경로를 통해 로그인하는 모듈을 가져 오는 경우 이중 로깅이 표시 될 수도 있습니다. 즉, 자격이 있고 사이트 패키지 이름으로 정규화되지 않았습니다. 메모리에서이 문제는 블로그 게시물에도 언급되어 있습니다.

백그라운드 스레드의 경우, threads = 1을 지정 했더라도, mod_wsgi는 몇 가지 별도의 스레드를 가지고 있습니다. 스레드가 올바르게 작동하는지 확인하고 죽은 것으로 간주되면 프로세스를 종료합니다.

실제로 mod_php를 사용하지 않으면 작업자 MPM이 작동해야합니다. prefork MPM을 사용하여 메모리를 낭비하게됩니다.

+0

질문에 답하십시오. 1. 로깅 초기화는 패키지가 아닌 사이트의 settings.py에서 수행됩니다 (단 하나의 경로에서 가져와야합니다). 스레드 초기화는 주 패키지의 __init__.py에서 수행됩니다. 어디에서 가져오고 한 번 가져올 수 있습니까? 2. DJANGO_SETTINGS_MODULE은 스크립트가 없어도 작동하지 않기 때문에 존재합니다. 3. phpmyadmin을 사용하고 있습니다. 프리 플로우 MPM을 비활성화하고 작업자 MPM을 활성화하면 phpmyadmin이 제대로 작동하지 않습니다. 4. 메모리 사용량이 매우 높습니다. 256 개 중에 몇 MB 만 남았습니다. 사전 포크를 비활성화 했더라도. – Elad

+0

로깅 초기화를 사이트 패키지의 __init__.py에도 넣으십시오. 스레드 화의 경우 init.py가 의미하는 바를 추측합니다. –