Django多线程和mod_wsgi

时间:2010-07-09 18:38:33

标签: django multithreading mod-wsgi

首先,我的网站启动并运行正常。没有关键问题。

我想了解一些事情。

我将首先概述一下我的系统。

这是一个django驱动的站点,位于CentOS 5.3 VPS上,内存为256MB,在带有mod_wsgi的apache下。

django应用程序作为带有1个线程的守护程序进程运行。

我的申请需要的是: 1.初始化日志记录(目前它正在运行,但我每次都会进行双重日志记录) 2.开始守护进程线程做一些后台工作

现在,我已阅读并实施了提供的解决方案 http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html 但它没有多大帮助。

基本上我必须手动禁用worker 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 个答案:

答案 0 :(得分:2)

由于多种原因,您可能会进行双重记录。首先是你把伐木放在哪里了?如果您在settings.py文件中记录了日志,那么它将使用您正在使用的WSGI脚本文件内容执行两次。博客文章解释了如何导入设置文件两次。

BTW,您甚至没有正确复制WSGI脚本文件。在博客文章中没有设置DJANGO_SETTINGS_MODULE环境变量。

如果您自己导入的模块通过两个不同的路径登录,您可能也会看到双重日志记录。也就是说,合格且不符合网站包名称。从记忆中,这个问题也在博客文章中提到。

关于后台线程,虽然你已经指定了threads = 1,但是mod_wsgi有一些独立的线程,以确保事情正常工作,如果被认为是死锁,就终止进程。

顺便说一下,如果你不使用mod_php,你真的应该让工人MPM继续。使用prefork MPM只会浪费内存。