mod_wsgi如何知道并执行应用程序?

时间:2016-09-14 20:22:40

标签: django mod-wsgi

我想设置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

1 个答案:

答案 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正在处理它们。