当mod_wsgi配置为守护进程模式时,jcc.initVM()不会返回

时间:2009-02-14 04:39:28

标签: python apache mod-wsgi pylucene jcc

我正在使用mod-wsgi和django,而在django中我使用pylucene进行全文搜索。

虽然mod-wsgi配置为嵌入模式,但完全没有问题。 但是当mod-wsgi配置为守护进程模式时,apache就会卡住, 并且浏览器只是继续加载但没有出现。

然后我将问题识别为jcc.initVM()。 这是我的wsgi脚本:

import os, sys, jcc
sys.stderr.write('jcc.initVM\n')
jcc.initVM()
sys.stderr.write('finished jcc.initVM\n')
....

重新启动Apache后,从浏览器发出请求后,我发现/var/log/apache2/error.log 只有:

jcc.initVM

意味着它被卡在jcc.initVM()行。 (如果将mod_wsgi配置为嵌入模式,则没有问题。)

这是我的/ 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>

最后,我发现在jcc(jcc.cpp)的源代码中,它挂起了函数:

JNI_CreateJavaVM(&vm, (void **) &vm_env, &vm_args)

如何解决问题?

程序版本:

libapache2-mod-wsgi 2.3-1
jcc 2.1
python 2.5
Apache 2.2.9-8ubuntu3
Ubuntu 8.10

2 个答案:

答案 0 :(得分:1)

有关讨论详情,请参阅http://code.google.com/p/modwsgi/issues/detail?id=131

总之, mod_wsgi将阻止守护程序的信号,这可能使initVM不起作用。此外根据 来自jcc的andi,initVM只能从主线程调用,也可能导致进一步的问题。

因此我决定将搜索代码与initVM()一起移动到一个完全独立的过程并解决问题。

答案 1 :(得分:1)

此问题的修复程序包含在mod_wsgi 2.4中。