Apache报告所有mod_wsgi应用程序异常(不是Django)的500个错误

时间:2014-04-08 21:15:36

标签: apache python-2.7 mod-wsgi openstack

我使用带有mod_wsgi 3.3-4的Precise上的Apache 2.2.22来运行运行Python Pecan 0.2.1的python 2.7 WSGI应用程序(Openstack Ceilometer)。

当WSGI应用程序抛出status_code设置为401(或其他任何内容)的异常(wsme.exc.ClientSideError)时,Apache会将应用程序日志中的错误报告为500,并且客户端会收到500状态代码。

无论抛出什么类型的异常,它都会报告内部服务器错误。

我希望将错误代码和消息返回给客户端,以反映WSGI应用程序抛出的内容,而不是每次都是500。

我尝试使用Paste's [ErrorMiddleware][3]类来包装WSGI应用程序,我从this了解到它会产生我想要的结果。没有运气。

以下是我使用ErrorMiddleware包装应用程序的方法:

from ceilometer import service
from ceilometer.api import app 
import sys 
from paste.exceptions.errormiddleware import ErrorMiddleware
sys.stdout = sys.stderr

# Initialize the oslo configuration library and logging
service.prepare_service([])

wsgi_app = app.VersionSelectorApplication()
application = ErrorMiddleware(application=wsgi_app, show_exceptions_in_wsgi_errors=True, debug=True)

我在Apache的错误日志中看到的唯一线索就是:

[Tue Apr 08 22:45:18 2014] [error] [client 127.0.0.1] mod_wsgi (pid=21955): Exception occurred processing WSGI script '/usr/share/pyshared/ceilometer/api/app.wsgi'.
[Tue Apr 08 22:45:18 2014] [error] [client 127.0.0.1] TypeError: expected byte string object for header value, value of type int found

我的应用程序WSGI配置文件(/etc/apache2/sites-enabled/ceilometer)包含:

<VirtualHost *:8777>

WSGIScriptAlias / /usr/share/pyshared/ceilometer/api/app.wsgi

# Number of process and threads should be configurable
WSGIDaemonProcess ceilometer user=meterAccount group=meter processes=3 threads=64
WSGIProcessGroup ceilometer

ErrorLog /var/log/ceilometer-apache/ceilometer_error.log
LogLevel warn
CustomLog /var/log/ceilometer-apache/ceilometer_access.log combined
SSLEngine on
SSLVerifyClient optional
SSLOptions +stdEnvVars
SSLVerifyDepth 3
SSLCertificateFile /etc/apache2/ssl/ceilometer.cer
SSLCertificateKeyFile /etc/apache2/ssl/ceilometer.key
SSLCACertificateFile /etc/ssl/certs/ca-certificates.crt

</VirtualHost>

我在使用ErrorMiddleware时遗漏了什么,或者是否有更好的工具用于将错误信息从WSGI应用程序通过Apache传播到发送给客户端的响应?

我没有使用Django,并且已经阅读了与mod_wsgi相关的其他500个错误问题,但只有一个问题与ErrorMiddlware有关,并且它没有帮助。

在这种情况下,通过电子邮件发送错误信息并不是一个选项。

编辑:原因如接受的答案中所述。 Ceilometer开发团队发现了一个错误并修复了它:

https://bugs.launchpad.net/ceilometer/+bug/1306963 https://review.openstack.org/#/c/87084/

验证补丁有效。

1 个答案:

答案 0 :(得分:0)

关于错误:

[Tue Apr 08 22:45:18 2014] [error] [client 127.0.0.1] mod_wsgi (pid=21955): Exception occurred processing WSGI script '/usr/share/pyshared/ceilometer/api/app.wsgi'.
[Tue Apr 08 22:45:18 2014] [error] [client 127.0.0.1] TypeError: expected byte string object for header value, value of type int found

所有响应头的值都是字符串。您将一个设置为整数,因此失败。这是因为就应用WSGI规范而言,mod_wsgi是严格的。

某些纯Python WSGI服务器并不严格,并且通过自动将值转换为字符串来违反WSGI规范。

因此,您使用的第三方代码的某些部分代码可能不符合WSGI规范。