Поделиться интерпретатором Python в Apache Prefork / WSGI - PullRequest
6 голосов
/ 27 августа 2009

Я пытаюсь запустить приложение Python в Apache (prefork) с WSGI таким образом, что будет использоваться один интерпретатор Python. Это необходимо, поскольку приложение использует синхронизацию потоков, чтобы предотвратить возникновение условий гонки. Поскольку предварительная ветвь Apache порождает несколько процессов, код оказывается нераспределенным между интерпретаторами, и поэтому синхронизация потоков не имеет значения (то есть каждый поток видит только свои собственные блокировки, которые не имеют отношения к другим процессам).

Вот настройка:

  • Apache 2.0 (prefork)
  • WSGI
  • Python 2.5

Вот соответствующая конфигурация Apache:

WSGIApplicationGroup %{GLOBAL}
<VirtualHost _default_:80>

WSGIScriptAlias / /var/convergedsecurity/apache/osvm.wsgi

Alias /admin_media/ /var/www/html/admin_media/

<Directory /var/www/html/admin_media>
Order deny,allow
Allow from all
</Directory>

Alias /media/ /var/www/html/media/

<Directory /var/www/html/media>
Order deny,allow
Allow from all
</Directory>

</VirtualHost>

Вот что я пробовал до сих пор (ни один из которых не работал):

  1. Добавление WSGIApplicationGroup% {GLOBAL}
  2. Указание WSGIDaemonProcess и WSGIProcessGroup в виртуальном хосте:

    WSGIDaemonProcess osvm threads = 50
    WSGIProcessGroup osvm

Нет ли способа заставить prefork Apache использовать один интерпретатор Python с WSGI? Документы, по-видимому, подразумевают, что вы можете это сделать с помощью параметров WSGIDaemonProcess и WSGIApplicationGroup, но Apache по-прежнему создает отдельный интерпретатор Python для каждого процесса.

1 Ответ

9 голосов
/ 27 августа 2009

Невозможно запустить приложение WSGI во встроенном режиме в системах UNIX, будь то prefork или рабочий MPM, поскольку в действительности будет несколько процессов. См:

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

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

Таким образом, конфигурация в VirtualHost будет:

WSGIDaemonProcess osvm
WSGIProcessGroup osvm
WSGIApplicationGroup %{GLOBAL}

WSGIScriptAlias / /var/convergedsecurity/apache/osvm.wsgi

Хотя для «процессов = 1» для WSGIDaemonProcess явно указывается, что создан один процесс, не предоставляйте эту опцию и просто оставьте по умолчанию один процесс. Любое использование параметра «процессы», даже если для одного процесса будет установлено значение «wsgi.multiprocess», установленное в значение «Истина».

Вместо того, чтобы использовать ваше настоящее приложение WSGI, я бы посоветовал вам протестировать его с помощью следующей простой тестовой программы.

import cStringIO
import os

def application(environ, start_response):
    headers = []
    headers.append(('Content-Type', 'text/plain'))
    write = start_response('200 OK', headers)

    input = environ['wsgi.input']
    output = cStringIO.StringIO()

    print >> output, "PID: %s" % os.getpid()
    print >> output

    keys = environ.keys()
    keys.sort()
    for key in keys:
        print >> output, '%s: %s' % (key, repr(environ[key]))
    print >> output

    output.write(input.read(int(environ.get('CONTENT_LENGTH', '0'))))

    return [output.getvalue()]

На выходе этого значение PID всегда должно быть одинаковым. Флаг wsgi.multiprocess должен иметь значение False. Значение mod_wsgi.process_group должно соответствовать тому, что вы называли группой процессов-демонов. И mod_wsgi.application_group должна быть пустой строкой.

Если это не то, что вы видите, убедитесь, что вы действительно перезапустили Apache после внесения изменений в конфигурацию. Также добавьте:

LogLevel debug

Конфигурация Apache для VirtualHost. Это приведет к тому, что mod_wsgi будет регистрировать намного больше сообщений в журнале ошибок Apache о создании процессов и загрузке сценариев, включая сведения о группе процессов и группе приложений, для которых происходят события.

Для получения дополнительной информации об отладке см .:

http://code.google.com/p/modwsgi/wiki/DebuggingTechniques

Если проблемы не устранены, предложите перейти в список рассылки mod_wsgi в группах Google.

...