python - 使用cherryPy时Ubuntu/web.py线程异常出现错误

标签 python https openssl cherrypy web.py

我有一个一直在开发的 web 应用程序,我注意到每隔一段时间我就会看到一个错误“线程 CP 服务器线程-* 中出现异常”,其中 * = 随机线程号。此错误偶尔会发生最终会锁定网络服务器,阻止其响应请求。

我能够通过使用 CherryPy 支持 SSL 的默认“hello World”webPy 应用程序重现相同的问题。

import web
from web.wsgiserver import CherryPyWSGIServer

# GLOBALS
CherryPyWSGIServer.ssl_certificate = "/.ssl/fpi.crt"
CherryPyWSGIServer.ssl_private_key = "/.ssl/server.key"

urls = (
    '/(.*)', 'Hello',
    )

app = web.application(urls, globals())

class Hello:
    def GET(self, name):
        return 'Hello World'

if __name__ == "__main__":
    app.run()

错误是:

73.220.196.76:63982 - - [27/Nov/2018 06:56:50] "HTTP/1.1 GET /" - 200 OK
73.220.196.76:63982 - - [27/Nov/2018 06:56:50] "HTTP/1.1 GET /favicon.ico" - 200 OK
Exception in thread CP Server Thread-9:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/home/brian_barnes/.local/lib/python2.7/site-packages/web/wsgiserver/__init__.py", line 1375, in run
    conn.communicate()
  File "/home/brian_barnes/.local/lib/python2.7/site-packages/web/wsgiserver/__init__.py", line 1269, in communicate
    format_exc())
  File "/home/brian_barnes/.local/lib/python2.7/site-packages/web/wsgiserver/__init__.py", line 811, in simple_response
    self.conn.wfile.sendall("".join(buf))
  File "/home/brian_barnes/.local/lib/python2.7/site-packages/web/wsgiserver/ssl_pyopenssl.py", line 111, in sendall
    *args, **kwargs)
  File "/home/brian_barnes/.local/lib/python2.7/site-packages/web/wsgiserver/ssl_pyopenssl.py", line 61, in _safe_call
    return call(*args, **kwargs)
  File "/home/brian_barnes/.local/lib/python2.7/site-packages/web/wsgiserver/__init__.py", line 913, in sendall
    bytes_sent = self.send(data)
  File "/home/brian_barnes/.local/lib/python2.7/site-packages/web/wsgiserver/ssl_pyopenssl.py", line 115, in send
    *args, **kwargs)
  File "/home/brian_barnes/.local/lib/python2.7/site-packages/web/wsgiserver/ssl_pyopenssl.py", line 77, in _safe_call
    raise socket.error(errnum)
error: -1

环境: Ubuntu 18.04.1 LTS Python 2.7.15rc1 web.py: 0.39

有没有人见过这样的问题或知道可能导致此问题的原因。在 webpy.org 上阅读时。看来这是 0.36 版本的问题,但 0.37 版本应该没问题。我曾考虑过升级到 0.40,但犹豫不决,因为它仍处于开发阶段。

最佳答案

这可能不是一个正确的解决方案,但我做了以下修改,问题不再出现在我身上。我仍在寻找更好的解决方案——也许完全抛弃 CherryPy——但在那之前:

====> 在 ssl_pyopenssl.py 中的 def _safe_call 中:替换

raise socket.error(errnum)

#### raise socket.error(errnum)
import sys
sys.stderr.write('===> ssl_pyopenssl: ignoring socket error' + str(errnum) + '\n')
return ""
####

以及 raise socket.error(-1)raise wsgiserver.FatalSSLAlert(*e.args)

的类似补丁

====> 在 wsgiserver2.py 中的 def sendall 中:插入 2 行如下:

bytes_sent = self.send(data)
### insert the below two lines
if not bytes_sent: # hack b/c self.send has unhandled exceptions
    break
### end insert
data = data[bytes_sent:]

有兴趣了解使用上述内容的任何问题

关于python - 使用cherryPy时Ubuntu/web.py线程异常出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53506190/

相关文章:

authentication - SSL 究竟如何与非对称算法一起工作?

c - Openssl中的大数模一个小整数

ios - 如何在 iOS 中验证(和要求)自签名证书

元组的 Python 列表将第二个元素与唯一的第一个元素合并

python - 如何仅绘制seaborn 热图的下三角?

python - 使用 python 3.6 将 Django 2.0 与 sql server 2014 连接时出错

security - S/MIME 和 HTTPS 之间的 X.509 证书差异 (LetsEncrypt)

python - 是否可以检查出站 https 流量?

openssl - 如何在 crypto++ 中使用密码解密 PKCS8 DER 加密私钥

python - 如何根据条件从数据框中删除行