【问题标题】:Attempting to use mod_wsgi in daemon mode show default apache "It works!" page instead of application尝试在守护程序模式下使用 mod_wsgi 显示默认 apache“它有效!”页面而不是应用程序
【发布时间】:2012-05-16 12:41:43
【问题描述】:

我有一个 Python WSGI 应用程序,我用 apache2 + mod_wsgi 在嵌入式模式下编写并运行它,我正试图让它在守护程序模式下运行。

问题是,通过配置(如下),我看到的不是应用程序,而是默认的 Apache2 “它可以工作!”该页面尽管热心地陈述其运营状态,但却是错误的。

我只清理了 appname 和 urls 等,所以你会看到我正在使用的整个 apache conf。

<VirtualHost *:80>
  ServerName app.example.com
  ServerAlias app

  WSGIDaemonProcess appname user=www-data group=www-data processes=5 threads=5 display-name=%{GROUP} maximum-requests=1000
  WSGIScriptAlias / /usr/share/app/app/application.wsgi

  Alias /static /usr/share/app/app/static

  ErrorLog /var/log/apache2/app/error.log
  CustomLog /var/log/apache2/app/access.log common

<Directory /usr/share/app/app>
    WSGIProcessGroup appname
    Order allow,deny
    Allow from All
</Directory>

<Directory /usr/share/app/app/static>
    Order allow,deny
    Allow from All
</Directory>
</VirtualHost>

无论我将 WSGIProcessGroup 选项放在该部分中,还是仅在主部分中,这仍然只是显示“它有效!”页面。

该应用程序使用了 bottle 和 toscwidgets,并带有 wsgi 验证器来确保它的行为良好。我用来构建应用程序的代码:

import bottle
import tw.api
from wsgiref.validate import validator
#.... A whole buttload of code
application = bottle.default_app()
application = tw.api.make_middleware(application, stack_registry=True)
application = validator(application)

编辑:我还想指出,我在带有 Python 2.6.5 的 mod_wsgi 2.8 和带有 Python 2.7.3 的 mod_wsgi 3.3 中都遇到了这个问题。

编辑 2: /static/ 的别名仍然有效,所以我似乎仍然在访问 VirtualHost。如果我注释掉 WSGIProcessGroup 指令并重新启动 apache,它将运行良好,但在嵌入模式而不是守护进程模式下。

【问题讨论】:

  • 你读过“它有效!”页面?

标签: python apache mod-wsgi bottle


【解决方案1】:

我怀疑你根本没有点击这个虚拟主机。您在任何地方都有“NameVirtualHost *:80”吗?您实际上是通过 app.example.com 或应用名称访问该网站吗?

【讨论】:

  • 嗨迈克尔,/static/ 的别名仍在工作,所以我似乎仍在访问 VirtualHost。如果我注释掉 WSGIProcessGroup 指令并重新启动 apache,它将运行良好,但在嵌入式模式下(当然)。
  • 并且“NameVirtualHost *:80”在 /etc/apache2/ports.conf 中。
  • 我知道这是旧的,但为什么这是一个答案?这如何解决任何问题?
【解决方案2】:

配置的 mod_wsgi 部分似乎没有什么特别的问题,除了:

user=www-data group=www-data

是多余的,因为它将默认由用户运行 Apache,因此不需要显式设置。除非您有特殊需要,否则也不建议使用最大请求数。

根本问题更有可能是您的整个 VirtualHost 定义没有被使用。

在 VirtualHost 中添加一个语法错误,以查看它是否正在被 Apache 读取。添加一行带有“xxx”的行就足以触发语法错误。

如果正在读取,则需要查看是否启用了命名虚拟主机。即,是否存在适当的 NameVirtualHost 指令。

下一个问题是,赋予 ServerName 的主机名是否实际上以 Apache 结尾。你显然不拥有'app.example.com',但你真正使用的东西实际上是去这个Apache。关闭 Apache 并重试。如果联系不上,那至少是对的。

之后,您需要确保没有现有的 VirtualHost 试图也为相同的 ServerName 服务。

【讨论】:

  • 谢谢格雷厄姆。正如我刚刚在第二次编辑中提到的那样,/static/ 别名正在发挥作用,因此肯定可以访问 VirtualHost。
  • 将 LogLevel 设置为 'info' 而不是默认的 'warn' 并查看 mod_wsgi 输出的消息。
猜你喜欢
  • 2012-10-12
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2018-12-05
  • 2017-05-20
  • 2011-05-09
  • 2012-09-21
相关资源
最近更新 更多