【问题标题】:Django multi-threaded and mod_wsgiDjango 多线程和 mod_wsgi
【发布时间】:2010-07-09 18:38:32
【问题描述】:

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

我想了解一些事情。

我将从我的系统概述开始。

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

django 应用程序作为具有 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()

我会很感激任何帮助

谢谢,埃拉德

【问题讨论】:

    标签: django multithreading mod-wsgi


    【解决方案1】:

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

    顺便说一句,您甚至没有正确复制 WSGI 脚本文件。博文中的那个没有设置 DJANGO_SETTINGS_MODULE 环境变量。

    如果您自己通过两个不同的路径导入带有日志记录的模块,您也可能会看到双重日志记录。即,通过站点包名称限定和不限定。根据记忆,这个问题在博文中也有提及。

    关于后台线程,虽然您已指定threads=1,但mod_wsgi 有几个独立的线程,以确保一切正常工作,并在认为进程处于死锁状态时终止进程。

    顺便说一句,如果你不使用 mod_php,你真的应该让 worker MPM 运行。使用 prefork MPM 只会浪费内存。

    【讨论】:

    • 好的,至于您的问题:1. 日志初始化是在站点的settings.py 中完成的,而不是在包中(应该只从1 个路径导入,对吧?)。线程初始化是从主包的 init.py 完成的。我还能把它放在哪里并确保它被导入一次? 2. DJANGO_SETTINGS_MODULE 在那里是因为脚本没有它就无法工作。 3. 我正在使用 phpmyadmin。当我禁用 prefork MPM 并启用 worker MPM 时,phpmyadmin 不能很好地工作。 4. 我的内存使用率非常高,我只剩下几个 MB(256 个) - 即使我禁用了 prefork。
    • 将您的日志初始化也放入站点包的 init.py 中。我想这就是你所说的 init.py 在线程的情况下的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2017-05-20
    相关资源
    最近更新 更多