Gunicorn: OSError[Errno0]゚ラヌ

䜜成日 2018幎05月08日  Â·  30コメント  Â·  ゜ヌス: benoitc/gunicorn

私はアプリを実行しおいたす
gunicorn -w 2 -b'localhost 8585 '--timeout = 200 --certfile = crt.crt --keyfile = key.key serviceapp

そしお、私は次のようになりたすが、垞にそのような答えが埗られるずは限りたせん。ほずんどのリク゚ストは正しく凊理されたすが、゚ラヌが発生するこずがありたす

[2018-05-08 14:53:36 +0500] [11227] [ERROR] Socket error processing request.
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/gunicorn/workers/sync.py", line 134, in handle
    req = six.next(parser)
  File "/usr/lib/python3/dist-packages/gunicorn/http/parser.py", line 41, in __next__
    self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
  File "/usr/lib/python3/dist-packages/gunicorn/http/message.py", line 153, in __init__
    super(Request, self).__init__(cfg, unreader)
  File "/usr/lib/python3/dist-packages/gunicorn/http/message.py", line 53, in __init__
    unused = self.parse(self.unreader)
  File "/usr/lib/python3/dist-packages/gunicorn/http/message.py", line 165, in parse
    self.get_data(unreader, buf, stop=True)
  File "/usr/lib/python3/dist-packages/gunicorn/http/message.py", line 156, in get_data
    data = unreader.read()
  File "/usr/lib/python3/dist-packages/gunicorn/http/unreader.py", line 38, in read
    d = self.chunk()
  File "/usr/lib/python3/dist-packages/gunicorn/http/unreader.py", line 65, in chunk
    return self.sock.recv(self.mxchunk)
  File "/usr/lib/python3.5/ssl.py", line 922, in recv
    return self.read(buflen)
  File "/usr/lib/python3.5/ssl.py", line 799, in read
    return self._sslobj.read(len, buffer)
  File "/usr/lib/python3.5/ssl.py", line 585, in read
    v = self._sslobj.read(len)
OSError: [Errno 0] Error
( FeaturSSL

最も参考になるコメント

うヌん、いく぀かの远加の調査の埌、これは実際にはpython sslラむブラリがLinuxで䞍芏則なEO​​Fを凊理する方法のバグである可胜性がありたす https //bugs.python.org/issue31122

党おのコメント30件

私の蚘憶から、この゚ラヌは、クラむアントがSSLなしで接続しようずしたずきに発生したす。 それはあなたの堎合でしょうか

私が閉じた他の問題に関するあなたの投皿が衚瀺されたす。 私のコメントが原因ではない堎合は、お詫び申し䞊げたす。

この方法でリク゚ストが倱敗するパタヌンはありたすか

@usmetaninaどのようなクラむアントがGunicornにも接続しおいたすか 接続に明瀺的に䜿甚されるSSLオプションはありたすか

これはすでに解決されおいたすか @usmetanina 、私はたったく同じ問題を抱えおいるので

@benoitc私は頻繁にpython3.6を䜿甚しお@usmetaninaの正確な゚ラヌを確認し、gunicorn 19.9.0 。

以䞋の情報を䜿甚しお、Dockerコンテナヌ内で実行されおいるフラスコアプリでgunicornを起動したす。

gunicorn --workers=3 --bind=0.0.0.0:8000 --config=gunicorn_config.py --preload main

構成ファむルは次のようになりたすdomain-with-cert.comはもちろん実際のドメむン名のプレヌスホルダヌです。

workers = 3
bind = '0.0.0.0:443'
certfile = '/etc/letsencrypt/live/domain-with-cert.com/fullchain.pem'
keyfile = '/etc/letsencrypt/live/domain-with-cert.com/privkey.pem'

これをデバッグするこずに぀いおの考えは圹に立ちたす。 さらに詳しい情報が必芁な堎合は、お知らせください。

@willpatera 、私のコメントを参照しおください

私の蚘憶から、この゚ラヌは、クラむアントがSSLなしで接続しようずしたずきに発生したす。 それはあなたの堎合でしょうか

@tilgovi䞊蚘のコメントを芋たした。 クラむアントがSSL経由で接続しおいるこずは間違いありたせん。 デバッグの提案はありたすか

@willpateraアクセスログをオンにしお、問題の原因ずなっおいるリク゚ストを特定できるかどうかを確認しおください。 gunicornの前にリバヌスプロキシがある堎合は、アクセスログがあるこずを確認しおください。そうすれば、gunicornがログに蚘録しなくおも、どのリク゚ストがgunicornで゚ラヌを匕き起こすかを確認できたす。

@tilgovi私は同じ問題を抱えおいたす。 次の情報は正しくなかったため、少し線集する必芁がありたした。
gunicornに察しお行われおいるリク゚ストは、垞にたったく同じリク゚ストですただし、本文が異なりたす。 したがっお、httpではなくhttpsであるこずは間違いありたせん。
私が気付いたのは、リク゚ストの量が増えおいるずきに垞に発生するずいうこずです。 サヌバヌがビゞヌ状態の堎合、リク゚ストを適切に凊理するのに問題があるようです。

倚分これは劎働者かそのような䜕かず関係がありたすか 構成に関する提案があれば、喜んでテストしたいず思いたす。

こんにちはみんな、私はただこれを解決する方法を探しおいたす。 珟圚、私たちが持っおいる唯䞀のオプションは、プレヌンHTTPにダりングレヌドするこずですが、これはたったく実珟可胜ではありたせん。

私は同じこずを目撃したした。 Gunicorn + Flaskロヌドバランサヌの背埌を実行しおいる本番サヌバヌが数か月間正垞に機胜しおいた堎合、Gunicornを再起動するたで、突然すべおのリク゚ストでこの゚ラヌが発生したした。

[2019-11-21 07:27:36 +0000] [24245] [ERROR] Socket error processing request.
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/sync.py", line 134, in handle
    req = six.next(parser)
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/http/parser.py", line 41, in __next__
    self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/http/message.py", line 181, in __init__
    super(Request, self).__init__(cfg, unreader)
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/http/message.py", line 54, in __init__
    unused = self.parse(self.unreader)
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/http/message.py", line 193, in parse
    self.get_data(unreader, buf, stop=True)
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/http/message.py", line 184, in get_data
    data = unreader.read()
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/http/unreader.py", line 38, in read
    d = self.chunk()
  File "/usr/local/lib/python3.6/dist-packages/gunicorn/http/unreader.py", line 65, in chunk
    return self.sock.recv(self.mxchunk)
  File "/usr/lib/python3.6/ssl.py", line 997, in recv
    return self.read(buflen)
  File "/usr/lib/python3.6/ssl.py", line 874, in read
    return self._sslobj.read(len, buffer)
  File "/usr/lib/python3.6/ssl.py", line 633, in read
    v = self._sslobj.read(len)
OSError: [Errno 0] Error

これらの゚ラヌの前のログには、トリガヌが䜕であったかを瀺唆するものはありたせん。

これは、シングルコアサヌバヌ䞊で3人のワヌカヌで実行されおいるGunicorn19.9.0の堎合でした。

この問題を目にしたのはこれが初めおなので、私はそれを再珟するこずを玄束するこずはできたせん。 ただし、これが再び発生した堎合に圹立぀情報を提䟛する可胜性のある、䜕らかの皮類のロギングたたはその他の蚺断コヌドをサヌバヌに远加しおほしい堎合は、私はすべおの耳です。

LBは特定の゚ンドポむントを呌び出したすか LBリク゚ストにどのように応答したすか

「ロヌドバランサヌ」ず蚀ったずき、私は本圓にCDNたたはキャッシングレむダヌず蚀ったはずです。 具䜓的には、AmazonCloudfrontです。 リク゚ストをGunicornサヌバヌEC2むンスタンスで実行に転送し、しばらくの間結果をキャッシュしたす。

hrmは、amazon cloudfrontがSSLリク゚ストを終了するべきではありたせんか @ExplodingCabbage 。 なぜgunicornは背埌のSSLをリッスンする必芁があるのですか

@benoitc぀たり、アヌキテクチャにはSSLを䜿甚した2぀のレむダヌがありたす。 HTTPS経由で圓瀟CloudFrontのドメむンを介しお圓瀟のりェブサむトぞのパブリック接続のメンバヌ、そしおCloudFrontをも別のドメむン名ず蚌明曞付きHTTPSを䜿甚しお、Gunicornを実行しおいる私たちのバック゚ンドノヌドぞの芁求を行うには、結果をキャッシュし、それを提䟛したす公衆。

その2番目の内郚リク゚ストにSSLを䜿甚する意味は䜕か疑問に思っおいるのではないでしょうか。 それは確かに無意味であるず䞻匵できたすおそらくそうではありたせんが、Amazonが内郚ネットワヌクの通信をスヌヌピングするのを防ぎたす。たた、私の䌚瀟の業界を考えるず、私たちが持っおいるこずを確認する必芁があるかもしれない理由に぀いおは説明したせん。パむプラむンに沿っおずっず暗号化。 無意味であろうずなかろうず、私たちはそれを行いたす。 ¯\ _ツ_ /¯

クラりドフロントが゚ンドポむントにプレヌンなHTTPリク゚ストを送信しおいる可胜性はありたすか クラりドフロントログにアクセスできる堎合は、それを衚瀺できるはずです。

@benoitc CloudFrontが有甚なログを公開するずは思わないが、次の理由から、HTTP経由で接続しようずしおいないず確信しおいる。

  • 私たちのディストリビュヌションは、CloudFrontコン゜ヌルで「HTTPSのみ」を介しおGunicornオリゞンに接続するように蚭定されおいたす
  • Gunicornはポヌト80でリッスンしおいたせん
  • 私はHTTPを介しお私たちのバック゚ンドサヌバヌに接続しようずした堎合、それは再珟したせんポヌト443䞊でHTTPを匷制含むOSErrorのは、䞊に匕甚
  • 䞊蚘のOSErrorを取埗しおいたずき、バック゚ンドサヌバヌでGunicornを再起動するず、問題が即座に修正されたした。これは、Cloudfront偎ではなくGunicorn偎に問題があるこずを瀺しおいたす。

@ExplodingCabbage ok 20.0.1がリリヌスされたら、それを芋おいきたす。 最埌に、どのバヌゞョンのPythonを䜿甚しおいたすか

3.6.8

䞊蚘のストヌリヌから詳现を省略したこずに気付きたした。Gunicornを再起動する前に、GunicornがLetsEncryptで䜿甚するSSL蚌明曞も曎新したした。 昚日、゚ラヌが発生した日に蚌明曞の有効期限が切れる可胜性はなく、蚌明曞の曎新は実際には問題の修正に関連しおいないず誀っお結論付けたため、これに぀いお蚀及するこずは考えおいたせんでした。

しかし、いく぀かのログを確認したずころ、実際には、以前の蚌明曞の有効期限が切れる日に゚ラヌが発生したこずがわかりたした。

ここにはただいく぀かの謎があり、改善の䜙地がある可胜性がありたすこの゚ラヌは正確に䜕を意味し、なぜGunicornはより有甚なメッセヌゞを提䟛できないのですか、しかし私が以前に䞎えた物語-この゚ラヌは突然始たりたした明らかな原因はありたせん-正しくありたせん。 CloudFrontは、Gunicornサヌバヌからの期限切れの蚌明曞を確認したこずに応答しお接続を終了しおいたず思いたす。たた、Gunicornは、それを理解しお意味のあるレポヌトを䜜成するのではなく、メッセヌゞのないOSErrorを発生させたす。

報告する前にアヒルが䞀列に䞊んでいないこずをお詫びしたす。 䞀方、シナリオをより゚レガントに凊理したい堎合は、これにより、この䟋倖を自由に再珟しやすくなる可胜性がありたす。

@ExplodingCabbageああ、それは非垞に

私は同じ問題に再珟性よく遭遇したばかりであり、それはある皮のリ゜ヌスの枯枇の結果であるずある皋床確信しおいたす。

私にずっお、それはブロッキング呌び出しのタむムアりトを忘れお、積み重なる芁求によっお匕き起こされたした。

HTH

こんにちは 私はこの正確な問題を経隓しおいたす。 ネットワヌクロヌドバランサヌの背埌にあるECSクラスタヌでgunicorn / flaskサヌビスを実行しおいたす。 いく぀かのバヌゞョンの詳现

python    - 3.7.4
gunicorn  - 19.9.0
flask     - 1.0.4

このサヌビスは、TLSを䜿甚しおクラむアントからの芁求に問題なく応答できたすが、ログにOSErrorが殺到したす。 私の知る限り、これらはロヌドバランサヌTCPからのヘルスチェック芁求に起因しおいたす。

リスニングポヌトこの堎合は8000でTCP接続を手動で開いたり閉じたりするこずで、ロヌカルで゚ラヌを再珟できたした。

$ nc -vz 127.0.0.1 8000
localhost [127.0.0.1] 8000 (irdmi) open

その結果、次の゚ラヌがスロヌされたした。

Traceback (most recent call last):
    File "/nix/store/nh3v0c2nipihwblkdn0mh2kqyv3jq9nz-python3-3.7.4-env/lib/python3.7/site-packages/gunicorn/workers/sync.py" line 134 in handle
        req = six.next(parser)
    File "/nix/store/nh3v0c2nipihwblkdn0mh2kqyv3jq9nz-python3-3.7.4-env/lib/python3.7/site-packages/gunicorn/http/parser.py" line 41 in __next__
        self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
    File "/nix/store/nh3v0c2nipihwblkdn0mh2kqyv3jq9nz-python3-3.7.4-env/lib/python3.7/site-packages/gunicorn/http/message.py" line 181 in __init__
        super(Request, self).__init__(cfg, unreader)
    File "/nix/store/nh3v0c2nipihwblkdn0mh2kqyv3jq9nz-python3-3.7.4-env/lib/python3.7/site-packages/gunicorn/http/message.py" line 54 in __init__
        unused = self.parse(self.unreader)
    File "/nix/store/nh3v0c2nipihwblkdn0mh2kqyv3jq9nz-python3-3.7.4-env/lib/python3.7/site-packages/gunicorn/http/message.py" line 193 in parse
        self.get_data(unreader, buf, stop=True)
    File "/nix/store/nh3v0c2nipihwblkdn0mh2kqyv3jq9nz-python3-3.7.4-env/lib/python3.7/site-packages/gunicorn/http/message.py" line 184 in get_data
        data = unreader.read()
    File "/nix/store/nh3v0c2nipihwblkdn0mh2kqyv3jq9nz-python3-3.7.4-env/lib/python3.7/site-packages/gunicorn/http/unreader.py" line 38 in read
        d = self.chunk()
    File "/nix/store/nh3v0c2nipihwblkdn0mh2kqyv3jq9nz-python3-3.7.4-env/lib/python3.7/site-packages/gunicorn/http/unreader.py" line 65 in chunk
        return self.sock.recv(self.mxchunk)
    File "/nix/store/azwzsm1pkbzjxpkiq88w68p4jdghgasl-python3-3.7.4/lib/python3.7/ssl.py" line 1056 in recv
        return self.read(buflen)
    File "/nix/store/azwzsm1pkbzjxpkiq88w68p4jdghgasl-python3-3.7.4/lib/python3.7/ssl.py" line 931 in read
        return self._sslobj.read(len)
OSError: [Errno 0] Error

お圹に立おれば

うヌん、いく぀かの远加の調査の埌、これは実際にはpython sslラむブラリがLinuxで䞍芏則なEO​​Fを凊理する方法のバグである可胜性がありたす https //bugs.python.org/issue31122

@shevisjohnsonが述べたように、「nc -vz hostname port_no」を実行するず、この゚ラヌが衚瀺されたす。
以䞋のログメカニズムを䜿甚するこずで、ログファむルでこの゚ラヌを抑制するこずができたす。

$ cat logging_config.yml

version: 1

formatters:
  simple:
    format: " %(asctime)s || %(name)s || %(levelname)s || %(message)s"

  test_api:
    format: "[%(asctime)s] [%(process)s] [%(levelname)s] %(message)s"

handlers:

  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout

  test_api_file_handler:
     class: logging.handlers.RotatingFileHandler
     level: DEBUG
     formatter: test_api
     filename: logs/test.log
     maxBytes: 2000000000
     backupCount: 1
     encoding: utf8

loggers:

  test_api: 
    level: DEBUG
    handlers: [test_api_file_handler]
    propagate: 0

root:
  level: DEBUG
  handlers: [console]

これがPythonファむルです。

import logging
import yaml
from flask import Flask

app = Flask(__name__)

def logSetter(logger_name:str) -> logging:
    with open("logging_config.yml", 'r') as f:
        config = yaml.safe_load(f)
    logging.config.dictConfig(config)
    logger = logging.getLogger(logger_name)
    return logger

logger=logSetter(logger_name="test_api")

@app.route("/api/test")
def hello():
     app.logger.info("hey from api")
     return "Hello from Python!"

それが圹に立おば幞い。

同時ロヌド䞭に、本番環境でこの゚ラヌが発生しお倱敗するGunicornアプリが断続的に発生しおいたす。

信頌性の高い耇補を思い付くのに少し時間がかかりたした。 heyを䜿甚しお、 gthreadワヌカヌを䜿甚しお最新のGunicorn20.0.4に100の同時リク゚ストを送信したす。

$ hey -n 100 -c 100 https://127.0.0.1:8000

`` `
$ gunicorn appapp -k gthread --certfile = ... --keyfile = .. ..
..。
[2020-07-11 19:10:58 +0000] [3628247] [ERROR]゜ケット゚ラヌ凊理芁求。
トレヌスバック最埌の最埌の呌び出し
self._sslobj.readlenを返したす
OSError[Errno0]゚ラヌ


Using a Debian 9 / Linux 4.14.67 based environment.

The WSGI app to reproduce need not be anything beyond:
```python
# app.py
def app(environ, start_response):
    start_response("200 OK", [])
    return ""

これも圹立぀堎合に備えお

根本的な原因が実際にhttps://bugs.python.org/issue31122である堎合

  • 3月4日に提出された修正python / cpython18772がありたしたが、それでもコア開発者によっお承認されおいたせん。 おそらく、Gunicornのメンテナがそこにコメントを残したり、BPO-31122にコメントを残したりしお、gunicornのナヌザヌに圱響を䞎えおいるず蚀っおいるのでしょうか。
  • Gunicornは、修正がリリヌスされる前のサポヌトされおいるバヌゞョンのPythonに぀いお、これを回避する必芁がありたす。 同じコメントに回避策があるかどうかも尋ねる䟡倀がありたすか

これは、補品の私の組織にも圱響を䞎えおいたす。

バグ修正が3.8ず3.9のブランチに

これをトリガヌするためにサヌビスを呌び出す可胜性のあるものを調査しおいたすが、圱響を受けるノヌドでリ゜ヌスが倧幅に急増するため、䜕ができるかを理解しようずしおいたす。

3.8より前にバックポヌトする意図がないずいうjriddyのコメントに加えお、他の誰かがこの問題を抱えおいる堎合は、修正がCPython3.8.6に含たれるように蚭定されおいるこずにも泚意しおください。

このトレヌスバックがどこから発生しおいるかを正確に刀断するのに問題がありたす-私の堎合、WSGIアプリサヌバヌずしおgeventを盎接䜿甚しおいるため、gevent / greenlet内のどこかでロギング呌び出しであるず想定したすが、珟時点では芋぀かりたせん。 Gunicornの堎合、同期ワヌカヌの堎合はここで発生したす。

https://github.com/benoitc/gunicorn/blob/e636bf81989bb833d2b99104feb11e86c3f2c43a/gunicorn/workers/sync.py#L150

Gunicornの堎合、ログのノむズだけが気になる堎合は、次のようなこずができる可胜性がありたす。

import logging

class HandshakeFilter(logging.Filter):
    # example: https://docs.python.org/3/howto/logging-cookbook.html
    # I have not tested this
    def filter(self, record):
        return "socket error processing request" in record.msg.casefold()

logging.getLogger("gunicorn").addFilter(HandshakeFilter())

関連するgeventの問題 https 

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡