O jcc.initVM () não retornar quando mod_wsgi é configurado como modo daemon
Pergunta
Eu estou usando mod-wsgi com Django, e no Django pylucene eu uso para fazer pesquisa de texto completo.
Enquanto mod-wsgi está configurado para ser incorporado modo, não há nenhum problema em absoluto. Mas quando mod-wsgi está configurado para ser o modo daemon, o Apache só fica preso, eo navegador apenas manter carregamento, mas não aparece nada.
Depois de identidade I o problema a ser o jcc.initVM (). Aqui está o meu script wsgi:
import os, sys, jcc
sys.stderr.write('jcc.initVM\n')
jcc.initVM()
sys.stderr.write('finished jcc.initVM\n')
....
Depois que eu reiniciar o meu apache, e fazer um pedido do meu navegador, acho que /var/log/apache2/error.log só tem:
jcc.initVM
O que significa que ele fica preso na linha jcc.initVM (). (Se o mod_wsgi é configurado como modo incorporado, não há nenhum problema.)
E aqui está o meu / etc / apache2 / sites-available / default:
WSGIDaemonProcess site user=ross group=ross threads=1
WSGIProcessGroup site
WSGIScriptAlias / /home/ross/apache/django.wsgi
<Directory /home/ross/apache/>
Order deny,allow
Allow from all
</Directory>
E, finalmente, eu descobrir que no código fonte de JCC (jcc.cpp), ele trava na função:
JNI_CreateJavaVM(&vm, (void **) &vm_env, &vm_args)
Como resolver o problema?
versões do programa:
libapache2-mod-wsgi 2.3-1
jcc 2.1
python 2.5
Apache 2.2.9-8ubuntu3
Ubuntu 8.10
Solução
A correção para esse problema foi incluída no mod_wsgi 2.4.
Outras dicas
Por favor, consulte http://code.google.com/ p / modwsgi / questões / detalhes? id = 131 para os detalhes de discussão.
Em suma, o mod_wsgi irá bloquear os sinais para o programa daemon, o que pode fazer se initVM não funcionar. Além disso de acordo com a Andi de JCC, initVM só pode ser chamado a partir do thread principal, e pode causar outro problema também.
Por isso eu decidi mudar o código de pesquisa com initVM () para um processo totalmente separado e resolveu o problema.