Django многопоточный и mod_wsgi - PullRequest
0 голосов
/ 09 июля 2010

Прежде всего, мой сайт работает и работает нормально.Здесь нет критических проблем.

Я хочу понять кое-что.

Начну с обзора моей системы.

Это питание от djangoсайт, расположенный на CentOS 5.3 VPS с 256 МБ ОЗУ, под apache с mod_wsgi.

Приложение django работает как процесс Daemon с 1 потоками.

Что мне нужно в моем приложении: 1.Инициализировать ведение журнала (в настоящее время оно работает, но я каждый раз получаю двойное ведение журнала) 2. Начать работу с потоками демона, чтобы выполнить некоторую фоновую работу

Теперь я прочитал и реализовал решение, предлагаемое в http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.htmlно это не очень помогло.

В основном мне пришлось вручную отключить рабочий MPM (работает только prefork 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

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

1 Ответ

2 голосов
/ 10 июля 2010

Возможно, вы получаете двойную регистрацию по ряду причин. Во-первых, куда вы положили запись? Если вы застряли во входе в файл settings.py, то он будет выполнен дважды с тем содержимым файла сценария WSGI, который вы используете. В блоге объясняется, как файл настроек импортируется дважды.

Кстати, вы даже не скопировали файл сценария WSGI правильно. Это в посте блога не устанавливает переменную окружения DJANGO_SETTINGS_MODULE.

Вы также можете увидеть двойное ведение журнала, если вы сами импортируете модуль с входом в него по двум разным путям. То есть квалифицированные и не квалифицированные по имени пакета сайта. По памяти эта проблема также упоминается в блоге.

Что касается фоновых потоков, хотя вы указали thread = 1, у mod_wsgi есть несколько собственных потоков, чтобы убедиться, что все работает правильно, и завершить процесс, если он будет заблокирован.

Кстати, вы действительно должны запустить рабочий MPM, если вы не используете mod_php. Вы будете только тратить память, используя prefork MPM.

...