Назад | Перейти на главную страницу

mod_wsgi / 3.2 смешивание контекста интерпретаторов с django на Apache2 с использованием mod_rewrite .. почему?

Длинная история

tl; dr:

В приведенной ниже конфигурации Apache путается с контекстом интерпретатора Python. У меня есть три демонстрационных сайта, развернутых с использованием этой настройки, и если вы часто обновляете их, возникает состояние гонки, и некоторые тексты / изображения, поступающие из БД, смешиваются друг с другом.

vhost conf:

<VirtualHost *:80>
    ServerName demo.motion-m.ca
    ServerAlias *.demo.motion-m.ca
    Options FollowSymLinks
    UseCanonicalName Off
    VirtualDocumentRoot /var/www/vhosts/%0
    RewriteEngine On
    RewriteMap lowercase int:tolower

    LogFormat "%{Host}i %h %u %t \"%r\" %s %b" vcommon
    CustomLog /var/log/apache2/demo.motion-m.ca vcommon

    # Handle everything except the static/media
    RewriteCond %{REQUEST_URI} !^/(media|static)/(.*)$
    RewriteRule ^/(.*) /var/www/vhosts/%{HTTP_HOST}/apache/django.wsgi/$1
    RewriteRule . - [E=APPLICATION_GROUP:${tolower:%{SERVER_NAME}}]


    # Use the subdomain as unique ApplicationGroup/Process identifier
    # or experience funny results
    RewriteCond %{ENV:REDIRECT_SUBDOMAIN} =""
    RewriteCond %{HTTP_HOST} ([a-z0-9][-a-z0-9]+)\.demo.motion-m\.ca\.?(:80)?$ [NC]
    RewriteCond %{DOCUMENT_ROOT}/%1 -d
    RewriteRule ^(.*) %1/$1 [E=SUBDOMAIN:%1,L]
    RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN},L]

    # use the "website" part as group name
    WSGIProcessGroup %{ENV:SUBDOMAIN}
    WSGIApplicationGroup %{ENV:SUBDOMAIN}

    <Location ~ /(media|static)/(.*)>
       Order deny,allow
       Options -Indexes
       Allow from all
    </Location>

    <Directory /var/www/vhosts/*/apache>
       Order allow,deny
       Allow from all
       Options ExecCGI
       AddHandler wsgi-script .wsgi
    </Directory>
</VirtualHost>

django.wsgi

import os, sys, site

site.addsitedir('/usr/lib/python2.5/site-package') 
os.environ['DJANGO_SETTINGS_MODULE'] = 'projectname.settings'

path = os.path.dirname(os.path.abspath(os.path.join(__file__, '../../')))

if path not in sys.path:
    sys.path.insert(0, '/var/www/vhosts/website.demo.motion-m.ca/')
    sys.path.insert(0, '/var/www/vhosts/website.demo.motion-m.ca/projectname/')
    sys.path.insert(2, '/path/to/django-1.3')
    sys.path.insert(3, '/path/to/django-1.3/django')


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

Любые идеи ?

Спасибо

Следующее кажется мне неправильным:

WSGIApplicationGroup %{ENV:SUBDOMAIN}

Почему есть:

RewriteRule . - [E=APPLICATION_GROUP:${tolower:%{SERVER_NAME}}]

если вы не используете APPLICATION_GROUP.

Кстати, вы использовали:

http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Embedded_Or_Daemon_Mode http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Sub_Interpreter_Being_Used

для проверки независимо от Django, что группа процессов исполняемого демона и субинтерпретатор выбираются для соответствующих хостов / URL-адресов.