ç§ã¯ã¢ããªãå®è¡ããŠããŸã
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
ç§ã®èšæ¶ããããã®ãšã©ãŒã¯ãã¯ã©ã€ã¢ã³ãã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çµç±ã§æ¥ç¶ããããšããŠããªããšç¢ºä¿¡ããŠããã
@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!"
ããã圹ã«ç«ãŠã°å¹žãã
ä¿¡é Œæ§ã®é«ãè€è£œãæãä»ãã®ã«å°ãæéãããããŸããã 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.8ãš3.9ã®ãã©ã³ãã«
ãããããªã¬ãŒããããã«ãµãŒãã¹ãåŒã³åºãå¯èœæ§ã®ãããã®ã調æ»ããŠããŸããã圱é¿ãåããããŒãã§ãªãœãŒã¹ãå€§å¹ ã«æ¥å¢ãããããäœãã§ããããç解ããããšããŠããŸãã
3.8ããåã«ããã¯ããŒãããæå³ããªããšããjriddyã®ã³ã¡ã³ãã«å ããŠãä»ã®èª°ãããã®åé¡ãæ±ããŠããå Žåã¯ãä¿®æ£ãCPython3.8.6ã«å«ãŸããããã«èšå®ãããŠããããšã«ã泚æããŠãã ããã
ãã®ãã¬ãŒã¹ããã¯ãã©ãããçºçããŠããããæ£ç¢ºã«å€æããã®ã«åé¡ããããŸã-ç§ã®å ŽåãWSGIã¢ããªãµãŒããŒãšããŠgevent
ãçŽæ¥äœ¿çšããŠãããããgevent / greenletå
ã®ã©ããã§ãã®ã³ã°åŒã³åºãã§ãããšæ³å®ããŸãããçŸæç¹ã§ã¯èŠã€ãããŸããã Gunicornã®å Žåãåæã¯ãŒã«ãŒã®å Žåã¯ããã§çºçããŸãã
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 ïŒ
æãåèã«ãªãã³ã¡ã³ã
ããŒããããã€ãã®è¿œå ã®èª¿æ»ã®åŸãããã¯å®éã«ã¯python
ssl
ã©ã€ãã©ãªãLinuxã§äžèŠåãªEOââFãåŠçããæ¹æ³ã®ãã°ã§ããå¯èœæ§ããããŸãïŒ https ïŒ//bugs.python.org/issue31122