我使用带有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/
验证补丁有效。
答案 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规范。