Ошибка с Ubuntu / web.py Исключение в потоке при использовании cherryPy - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть веб-приложение, над которым я работаю, и я заметил, что время от времени я вижу ошибку «Исключение в потоке CP Server Thread- *», где * = случайный номер потока. Эта ошибка иногда возникаети в конечном итоге заблокирует веб-сервер, не позволяя ему отвечать на запросы.

Мне удалось воспроизвести ту же проблему с приложением по умолчанию "hello World" webPy, использующим CherryPy для поддержки SSL.

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, но колебался, так как он все еще в dev.

1 Ответ

0 голосов
/ 05 марта 2019

Возможно, это не совсем правильное решение, но я сделал следующий хак, и проблема больше не отображается для меня.Я все еще ищу лучшее решение - может быть, вообще исключить CherryPy - но до тех пор:

====> в def _safe_call в ssl_pyopenssl.py: заменить

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)

====> в def sendall в wsgiserver2.py: вставить 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:]

Было бы интересно услышать любые проблемы, используя вышеуказанное

...