【问题标题】:How does mod_wsgi know and execute the application?mod_wsgi 如何知道并执行应用程序?
【发布时间】:2017-01-22 18:25:17
【问题描述】:

我正在准备设置 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]

当使用浏览器请求 url 时,wsgi_test.py 脚本被执行(“我是 wsgi_test”出现在 apache 错误日志中)。但是,没有提供页面(500 内部服务器错误),并且还有一个额外的错误日志条目脚本头的过早结束:wsgi_test.py

作为第二个测试,我使用了一个简单的脚本,它正确地服务于“Hello World”:

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

【问题讨论】:

    标签: django mod-wsgi


    【解决方案1】:

    mod_wsgi 模块不会以您可能认为的方式执行脚本。也就是说,它不会将它们作为程序运行。

    您的 Apache 配置可能已设置为将带有 .py 扩展名的文件作为 CGI 脚本执行,因此 mod_wsgi 实际上并未处理此问题。这可以解释您所看到的行为。

    要么禁用生成.py 文件CGI 脚本的AddHandler 指令,要么将您的WSGI 脚本重命名为具有.wsgi 扩展名并更改WSGIScriptAlias 指令以匹配。

    完成后,mod_wsgi 会将 WSGI 脚本加载到内存中,然后在服务器进程的内存中运行 Python 代码。所以不能作为单独的程序执行。

    如果您确保 Apache 中的 LogLevel 指令设置为 info(如果当前设置为 warn),那么您应该会看到 mod_wsgi 记录的更多消息,关于它何时加载 WSGI 脚本以运行它第一次。这将确认 mod_wsgi 正在处理它们。

    【讨论】:

    • 非常感谢!这确实是一个令人讨厌的陷阱,特别是因为默认的 django wsgi 文件被命名为wsgi.py(我从它开始我的测试)。不应该是project.wsgi 或类似的更好吗?
    • mod_wsgi 文档通常建议使用.wsgi 扩展名,其原因不止于此。有人建议Django也应该生成一个.wsgi文件,然后导入wsgi.py,但建议被忽略了。归根结底,这里的错误在于 Linux 发行版在 Apache 配置中添加了一个默认值,该配置强制 .py 为所有目录而不仅仅是 cgi-bin 目录的 CGI。这个问题并不影响每个人。所以你确定你在默认的 Apache 配置中取消了一些注释来启用它。
    • 网络托管服务上的预配置 apache 出现问题。我没有更改默认配置。但是,很可能是网络托管商这样做了。
    • 是的,那时应该是网络托管服务。他们通常不知道为 Python 做什么是合适的。
    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 2018-05-24
    • 1970-01-01
    • 2011-05-16
    • 2021-08-13
    • 2014-09-16
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多