3

我在 django 中使用 mod-wsgi,在 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
4

2 回答 2

1

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

简而言之,mod_wsgi 会阻塞守护程序的信号,这可能会使 initVM 无法工作。此外,根据 jcc 的 Andi 的说法,initVM 只能从主线程调用,这也可能导致进一步的问题。

因此,我决定将带有 initVM() 的搜索代码移至一个完全独立的进程并解决了问题。

于 2009-02-17T02:45:56.687 回答
1

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

于 2009-06-25T03:31:51.523 回答