我想设置Apache / 2.2.22(Debian)mod_wsgi / 3.3 Python / 2.7.3
我设法执行WSGIScriptAlias,但只执行顶级模块代码,而不是其中定义的application
。
Apache配置:
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
WSGIScriptAlias /testurl /home/django/test/test/wsgi_test.py
<Directory /home/django/test/test>
<Files wsgi_test.py>
Order deny,allow
Allow from all
</Files>
</Directory>
wsgi_test.py:
#!/usr/bin/python
import sys
print >> sys.stderr, "I'm wsgi_test"
def application(environ, start_response):
print >> sys.stderr, 'in application'
status = '200 OK'
output = 'hello World'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
使用浏览器请求网址时,wsgi_test.py
脚本会被执行(&#34;我&#39; m wsgi_test&#34;出现在apache错误日志中)。但是,没有提供页面(500内部服务器错误),还有一个额外的错误日志条目脚本标头的过早结束:wsgi_test.py 。
作为第二次测试,我使用了一个简单的脚本,该脚本正确地为“Hello World&#39;”提供了:
wsgi_test2.py:
#!/usr/bin/python
import sys
print 'Content-type: text/plain\n\n'
print 'Hello World'
我的问题: mod_wsgi如何知道并执行应用程序?
从上述测试中,我得出结论,wsgi_test.py
立即执行。由于没有可执行代码而只有application
的定义,因此脚本不会输出任何内容,因此服务器会抱怨缺少的html标头。如何告诉系统运行application
?
答案 0 :(得分:3)
mod_wsgi模块不会以您可能想到的方式执行脚本。也就是说,它不会将它们作为程序运行。
您的Apache配置可能已设置,因此具有.py
扩展名的文件正在作为CGI脚本执行,因此mod_wsgi实际上并未执行此操作。这可以解释你所看到的行为。
禁用使AddHandler
文件成为CGI脚本的.py
指令,或者将WSGI脚本重命名为.wsgi
扩展名并更改WSGIScriptAlias
指令以匹配。
完成此操作后,mod_wsgi会将WSGI脚本加载到内存中,然后在服务器进程的内存中运行Python代码。所以不是单独的程序执行。
如果你确保Apache中的LogLevel
指令设置为info
,如果当前设置为warn
,那么你应该看到mod_wsgi记录的关于何时加载的更多消息第一次运行它的WSGI脚本。这将确认mod_wsgi正在处理它们。