Compartilhar Python Interpreter no Apache Prefork / WSGI

votos
6

Eu estou tentando executar um aplicativo Python dentro do Apache (prefork) com WSGI de tal forma que um único interpretador Python vai ser usado. Isto é necessário uma vez que o aplicativo usa a sincronização de threads para evitar condições de corrida ocorra. Desde Apache prefork gera vários processos, o código acaba não sendo partilhada entre os intérpretes e, assim, o segmento de sincronização é irrelevante (isto é, cada fio só vê ele próprio fechaduras que não têm nenhuma influência sobre os outros processos).

Aqui está a configuração:

  • Apache 2,0 (prefork)
  • WSGI
  • python 2,5

Aqui está a configuração relevante 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>

Aqui está o que eu tentei até agora (nenhum dos quais funcionou):

  1. Adicionando WSGIApplicationGroup% {GLOBAL}
  2. Especificando WSGIDaemonProcess e WSGIProcessGroup dentro do host virtual:

    WSGIDaemonProcess osvm tópicos = 50
    WSGIProcessGroup osvm

Não há nenhuma maneira para forçar o Apache prefork usar um único interpretador Python com WSGI? Os documentos parecem implicar que puder com as opções WSGIDaemonProcess e WSGIApplicationGroup mas Apache ainda cria um interpretador Python separado para cada processo.

Publicado 27/08/2009 em 06:37
fonte usuário
Em outras línguas...                            


1 respostas

votos
9

Você não pode ter o WSGI aplicativo executado no modo incorporado em sistemas UNIX, seja prefork ou trabalhador MPM, como realmente haverá vários processos. Vejo:

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

A criação de um grupo de processo daemon que consiste em único processo e delegar aplicação WSGI de que deve conseguir o que deseja. Você não deve mesmo precisar usar WSGIApplicationGroup se é apenas uma aplicação WSGI montado você está falando. Se você quiser ser absolutamente certo, porém, você também pode configurá-lo.

Assim configuração dentro VirtualHost seria:

WSGIDaemonProcess osvm
WSGIProcessGroup osvm
WSGIApplicationGroup %{GLOBAL}

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

Apesar de 'processos = 1' para WSGIDaemonProcess torna explícito que um processo é criado, não oferecem a opção embora e apenas deixá-lo padrão para um processo. Qualquer uso da opção 'processos', mesmo que por um processo verá 'wsgi.multiprocess' definida como True.

Ao invés de usar a sua aplicação WSGI real, eu sugiro que você testar com o seguinte programa de teste simples.

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()]

Na saída desse, o valor PID deve ser sempre o mesmo. A bandeira wsgi.multiprocess deve ser falsa. O valor mod_wsgi.process_group deve ser o que quer que você chamou o grupo de processo daemon. E o mod_wsgi.application_group deve ser uma cadeia vazia.

Se isto não é o que você está vendo, garantir que você realmente reiniciado Apache depois de fazer alterações de configuração. Também adicionar:

LogLevel debug

a configuração do Apache para VirtualHost. Fazendo isso fará com mod_wsgi para registrar um monte mais mensagens no log de erro Apache sobre a criação do processo e carregamento roteiro, incluindo detalhes de grupos de processos e de grupo aplicação coisas estão acontecendo para.

Para outras informações sobre depuração, consulte:

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

Se os problemas ainda, sugiro que você vá para a lista de discussão mod_wsgi no Google Groups.

Respondeu 27/08/2009 em 07:07
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more