2011-12-20 46 views
3

当使用Python2.7 + Apache + mod_wsgi开发小型Web服务器时,我得到了一些不寻常的东西。此服务器的主要用途如下:变量将被实例化多次

  1. 接收来自其他服务器(服务器A)的常规请求,并将请求正文放入数据库。
  2. 使用一些后台线程来解析数据库中的请求主体并将解析的信息发送到第三个服务器(服务器B)。

Apache配置为Windows'winnt'MPM模式。 dispatch.py​​的代码,这是切入点,是象下面这样:

from urlparse import parse_qs 

pool = MyThreadClass() # A customized thread class to parse request body in DB 
pool.start() 

def application(environ, start_response): 
    # Receiving regular request from server A and put request body into BD 
    output = 'OK' 
    start_response('200OK', [('Content-Type', 'text/plain')]) 
    return [output] 

在开始的时候,当服务器启动时,它运行完美创建线程类。然而,几个小时后,我发现线程类(MyThreadClass)将再次被实例化,这意味着在那一刻,会有后台运行 MyThreadClass实例。
我不知道在Apache启动时创建像这样的实例是否正确。你有什么想法吗?

[EDIT1]下面是阿帕奇的WSGI部分的配置:

WSGIScriptAlias/"E:/eclipse workspace/SubscriptionServer/src/business/dispatcher.py" 
WSGIPythonPath "E:/eclipse workspace/SubscriptionServer/src" 

<Directory "E:/eclipse workspace/SubscriptionServer"> 
    Order deny,allow 
    Allow from all 
</Directory> 

[EDIT2]我按照指令@Graham了,并设置loglevel改为 “信息”。我想我找到了原因,但无法解释为什么!
以下是访问日志和错误日志的日志。我的服务器正在侦听8080.服务器启动时会记录error.log的前三行。然而,在当时16点36分18秒2011访问日志,有来自124.237.78.181的呼叫请求http://g.ha99y.com/R.asp?P=123.157.218.85:8080。就在那个时候,在错误日志中,服务器再次加载了dispatcher.py。我无法解释,这是否呼叫来自,为什么它会创建两个译员myhost.com:8080 |“和'myhost.com |'。

的access.log:

124.237.78.181 - - [20/Dec/2011:16:36:18 +0800] "GET http://g.ha99y.com/R.asp?P=123.157.218.85:8080 HTTP/1.1" 404 29 

error.log中:

[Tue Dec 20 15:50:14 2011] [info] mod_wsgi (pid=1008): Create interpreter 'myhost.com:8080|'. 
[Tue Dec 20 15:50:14 2011] [info] mod_wsgi (pid=1008): Adding 'E:/eclipse workspace/SubscriptionServer/src' to path. 
[Tue Dec 20 15:50:14 2011] [info] [client 66.220.151.121] mod_wsgi (pid=1008, process='', application='myhost.com:8080|'): Loading WSGI script 'E:/eclipse workspace/SubscriptionServer/src/business/dispatcher.py'. 
[Tue Dec 20 16:36:19 2011] [info] mod_wsgi (pid=1008): Create interpreter 'myhost.com|'. 
[Tue Dec 20 16:36:19 2011] [info] mod_wsgi (pid=1008): Adding 'E:/eclipse workspace/SubscriptionServer/src' to path. 
[Tue Dec 20 16:36:19 2011] [info] [client 124.237.78.181] mod_wsgi (pid=1008, process='', application='myhost.com|'): Loading WSGI script 'E:/eclipse workspace/SubscriptionServer/src/business/dispatcher.py'. 

回答

1

您可能修改造成的mod_wsgi重新加载它的WSGI脚本文件。

关闭使用重装:

WSGIScriptReloading Off 

每当您更改代码,那么要确保重新启动Apache。

阅读:

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Reloading_In_Embedded_Mode http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIScriptReloading

+0

感谢您的答复。但我百分百确信我没有做任何代码更改。因为我在周末运行代码而不更改它,并通过日志发现问题。 –

+0

然后发布Apache配置的mod_wsgi部分。我能想到的唯一的另一件事是,你以某种方式对同一个脚本进行多重别名,以便可以将它加载到不同的子解释器中。此实例中的线程类将位于不同的子解释器中。通过确保在Apache配置中将LogLevel设置为'info',您可以了解这种情况。这样,mod_wsgi将在WSGI脚本加载/重新加载时以及在哪个子解释器中记录。 –

+0

WSGIScriptAlias/“E:/ Eclipse工作区/ SubscriptionServer/SRC /商业/ dispatcher.py” WSGIPythonPath “E:/ Eclipse工作区/ SubscriptionServer/SRC” <指南 “E:/ Eclipse工作区/ SubscriptionServer”> \t订单拒绝,允许 \t所有 –