Gunicorn: OSError: [Errno 11] Heroku์˜ ๋ฒ„์ „ 19.8.1(๋ฐ 19.8.0)์—์„œ ์ผ์‹œ์ ์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 05์›” 29์ผ  ยท  14์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: benoitc/gunicorn

Heroku์—์„œ ๊ฐ„๋‹จํ•œ Flask ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

web: gunicorn --worker-class eventlet -w 1 app:app --log-file=-

๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด Python 2.7.15๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Heroku๊ฐ€ v. 19.8.1๋กœ ์ด๋™ํ•œ ์ดํ›„๋กœ ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ์ด ๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ด๋ฏธ์ง€(๋ช‡ kb์—์„œ ๋ช‡ mb ํฌ๊ธฐ)๋Š” ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ด๋ฏธ์ง€(๋Œ€๋ถ€๋ถ„ ์• ๋‹ˆ๋ฉ”์ด์…˜์šฉ ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ)๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•˜๋ฉด ๋งค๋ฒˆ ๋กœ๋“œ๋˜์ง€ ์•Š๊ณ  ๊ฐ๊ฐ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(์ด๋ฏธ์ง€๊ฐ€ ์ด์ „ ๋ฒ„์ „์—์„œ ์บ์‹œ๋œ ๊ฒฝ์šฐ ๋ฌธ์ œ ์—†์ด ๋กœ๋“œ๋จ). :

2018-05-29T09:24:36.216949+00:00 app[web.1]: [2018-05-29 09:24:36 +0000] [10] [ERROR] Socket error processing request. 2018-05-29T09:24:36.216969+00:00 app[web.1]: Traceback (most recent call last): 2018-05-29T09:24:36.216971+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 66, in handle 2018-05-29T09:24:36.216972+00:00 app[web.1]: six.reraise(*sys.exc_info()) 2018-05-29T09:24:36.216974+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 56, in handle 2018-05-29T09:24:36.216976+00:00 app[web.1]: self.handle_request(listener_name, req, client, addr) 2018-05-29T09:24:36.216978+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 129, in handle_request 2018-05-29T09:24:36.216980+00:00 app[web.1]: six.reraise(*sys.exc_info()) 2018-05-29T09:24:36.216981+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 112, in handle_request 2018-05-29T09:24:36.216983+00:00 app[web.1]: resp.write_file(respiter) 2018-05-29T09:24:36.216985+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 403, in write_file 2018-05-29T09:24:36.216987+00:00 app[web.1]: if not self.sendfile(respiter): 2018-05-29T09:24:36.216989+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 393, in sendfile 2018-05-29T09:24:36.216990+00:00 app[web.1]: sent += sendfile(sockno, fileno, offset + sent, count) 2018-05-29T09:24:36.216992+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/_sendfile.py", line 66, in sendfile 2018-05-29T09:24:36.216994+00:00 app[web.1]: raise OSError(e, os.strerror(e)) 2018-05-29T09:24:36.216996+00:00 app[web.1]: OSError: [Errno 11] Resource temporarily unavailable

๋‹ค์Œ์€ requirements.txt์˜ ๋‹ค๋ฅธ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

Flask==0.12.2 gunicorn==19.8.1 pymongo==3.6.1 flask_socketio==2.9.6 flask_cors==3.0.3 eventlet==0.22.1 gevent==1.2.2

gunicorn์„ 19.7.1๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 19.8.0์—์„œ ์ง€์†๋ฉ๋‹ˆ๋‹ค.
2012๋…„์˜ ์œ ์‚ฌํ•œ ๋ฌธ์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์š”์ฒญ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋งค์šฐ ์ฆ‰๊ฐ์ ์ด๋ฏ€๋กœ ์š”์ฒญ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 19.7.1๋กœ ๋กค๋ฐฑํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜์ง€๋งŒ ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Heroku ๊ณ ์œ ์˜ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๋‚œ ๋‹ฌ ์ •๋„์—์•ผ ์•Œ์•„์ฐจ๋ ธ์ง€๋งŒ ๊ทธ๋“ค์ด ์–ธ์ œ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์˜ค๋Š˜๋„ ๊ฐ™์€ ๋ฌธ์ œ๋กœ ํ•˜๋ฃจ ์ข…์ผ ์‹ธ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” _์ƒ๊ฐํ•ด_ ๋งˆ์นจ๋‚ด ๊ทธ๊ฒƒ์„ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” nginx, Flask, gunicorn w/ eventlet ๋ฐ docker๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด (๊ด€๋ จ) pip freeze ์ถœ๋ ฅ:

eventlet==0.23.0
Flask==1.0.2
greenlet==0.4.14
gunicorn==19.9.0

๋‚ด gunicorn ๋ช…๋ น:
gunicorn -b 0.0.0.0:8000 --workers 1 --worker-class eventlet --log-level=DEBUG myapp.wsgi:app

์ฒซ ๋ฒˆ์งธ ์ฆ์ƒ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ERR_CONTENT_LENGTH_MISMATCH ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋Œ€์šฉ๋Ÿ‰ ์ •์  ํŒŒ์ผ ๋กœ๋“œ์˜€์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ํฐ ์ •์  JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ฆ์ƒ์€ nginx๊ฐ€ error.log์— ๋‹ค์Œ์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. upstream prematurely closed connection while reading upstream

๋งˆ์ง€๋ง‰์œผ๋กœ gunicorn ๋กœ๊ทธ ํ•ญ๋ชฉ์œผ๋กœ ๋‹ค์‹œ ์ถ”์ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Socket error processing request. - [in /usr/local/lib/python2.7/dist-packages/gunicorn/glogging.py:277]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 66, in handle
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 56, in handle
    self.handle_request(listener_name, req, client, addr)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 129, in handle_request
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 112, in handle_request
    resp.write_file(respiter)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 403, in write_file
    if not self.sendfile(respiter):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 393, in sendfile
    sent += sendfile(sockno, fileno, offset + sent, count)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/_sendfile.py", line 66, in sendfile
    raise OSError(e, os.strerror(e))
OSError: [Errno 11] Resource temporarily unavailable

๋‚ด ์ตœ์ข… ํ•ด๊ฒฐ์ฑ…์€ --no-sendfile ํ”Œ๋ž˜๊ทธ๋กœ gunicorn์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์œผ๋ฉฐ ๋ฌธ์ œ๋Š” ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ์™œ์š”? ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด... ํšจ๊ณผ๊ฐ€ ์žˆ์–ด์„œ ๋‹คํ–‰์ด์•ผ.

๋˜ํ•œ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ค‘์— nginx.conf๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ๋Š” ์˜ˆ์ œ์™€ ์œ ์‚ฌํ•˜๋„๋ก ์ตœ์„ ์„ ๋‹คํ–ˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. http://docs.gunicorn.org/en/stable/deploy.html

๋ชจ๋“  14 ๋Œ“๊ธ€

์˜ค๋Š˜๋„ ๊ฐ™์€ ๋ฌธ์ œ๋กœ ํ•˜๋ฃจ ์ข…์ผ ์‹ธ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” _์ƒ๊ฐํ•ด_ ๋งˆ์นจ๋‚ด ๊ทธ๊ฒƒ์„ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” nginx, Flask, gunicorn w/ eventlet ๋ฐ docker๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด (๊ด€๋ จ) pip freeze ์ถœ๋ ฅ:

eventlet==0.23.0
Flask==1.0.2
greenlet==0.4.14
gunicorn==19.9.0

๋‚ด gunicorn ๋ช…๋ น:
gunicorn -b 0.0.0.0:8000 --workers 1 --worker-class eventlet --log-level=DEBUG myapp.wsgi:app

์ฒซ ๋ฒˆ์งธ ์ฆ์ƒ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ERR_CONTENT_LENGTH_MISMATCH ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋Œ€์šฉ๋Ÿ‰ ์ •์  ํŒŒ์ผ ๋กœ๋“œ์˜€์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ํฐ ์ •์  JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ฆ์ƒ์€ nginx๊ฐ€ error.log์— ๋‹ค์Œ์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. upstream prematurely closed connection while reading upstream

๋งˆ์ง€๋ง‰์œผ๋กœ gunicorn ๋กœ๊ทธ ํ•ญ๋ชฉ์œผ๋กœ ๋‹ค์‹œ ์ถ”์ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Socket error processing request. - [in /usr/local/lib/python2.7/dist-packages/gunicorn/glogging.py:277]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 66, in handle
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 56, in handle
    self.handle_request(listener_name, req, client, addr)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 129, in handle_request
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 112, in handle_request
    resp.write_file(respiter)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 403, in write_file
    if not self.sendfile(respiter):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 393, in sendfile
    sent += sendfile(sockno, fileno, offset + sent, count)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/_sendfile.py", line 66, in sendfile
    raise OSError(e, os.strerror(e))
OSError: [Errno 11] Resource temporarily unavailable

๋‚ด ์ตœ์ข… ํ•ด๊ฒฐ์ฑ…์€ --no-sendfile ํ”Œ๋ž˜๊ทธ๋กœ gunicorn์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์œผ๋ฉฐ ๋ฌธ์ œ๋Š” ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ์™œ์š”? ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด... ํšจ๊ณผ๊ฐ€ ์žˆ์–ด์„œ ๋‹คํ–‰์ด์•ผ.

๋˜ํ•œ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ค‘์— nginx.conf๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ๋Š” ์˜ˆ์ œ์™€ ์œ ์‚ฌํ•˜๋„๋ก ์ตœ์„ ์„ ๋‹คํ–ˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. http://docs.gunicorn.org/en/stable/deploy.html

์ด ๋ฌธ์ œ๋„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค. 19.7.0์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ฆ‰์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๊ธด ์‘๋‹ต์ด ๋ถ€๋ถ„์ ์œผ๋กœ ์ „์†ก๋œ ํ›„์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

์ •์  ํŒŒ์ผ ์›์ธ ์ œ๊ณต

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? 19.9.0์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ–ˆ๊ณ  ๊ฐ‘์ž๊ธฐ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

@tilgovi ์ด์— ๊ด€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ๊ฐ‘์ž๊ธฐ ์ด ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค

๋‚˜์—๊ฒŒ ๋ฌธ์ œ๋Š” eventlet ์ž‘์—…์ž ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” eventlet์„ ์ œ๊ฑฐํ–ˆ๊ณ  ์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  @SaintSimmo ์˜ ์ œ์•ˆ์€ ์ €์—๊ฒŒ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์ฆ‰์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ผ์Šคํฌ์™€ ์ด๋ฒคํŠธ๋ ›์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์šด๋กœ๋“œ ์ž‘์—…์€ Flask์˜ send_from_directory์— ์˜ํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
gunicorn์€ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
gunicorn --worker-class eventlet -w 1 -b 0.0.0.0:4000 ์—…๋กœ๋“œ: ์•ฑ
์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๋ช…๋ น์— "--no-sendfile"์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "sendfile" ์—†์ด ๋‹ค์šด๋กœ๋“œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ธ์ œ ์ด "sendfile"์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

gunicorn(๋ฒ„์ „ 19.9.0) eventlet๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ

19.9.0์—์„œ @SaintSimmo ์˜ --no-sendfile ์„ค์ • ๊ถŒ์žฅ ์‚ฌํ•ญ ๋„ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋™์ผํ•œ ๋ฌธ์ œ์ด๋ฉฐ eventlet ์ž‘์—…์ž๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ช…๋ น(gunicorn -w 1 -k eventlet -b 127.0.0.1:5000 wsgi:app)์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ์•„๋ž˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์‘๋‹ต์—์„œ ๋‚ด ์ด๋ฏธ์ง€๊ฐ€ ์ž˜๋ฆฝ๋‹ˆ๋‹ค.
[์˜ค๋ฅ˜] ์†Œ์ผ“ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์š”์ฒญ.
...
BlockingIOError: [Errno 11] ๋ฆฌ์†Œ์Šค๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ž‘์—…์ž ํด๋ž˜์Šค ์ •์˜๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
gunicorn -w 1 -b 127.0.0.1:5000 wsgi:app

@jacebrowning ๋ฐ @SaintSimmo , gunicorn ๋ช…๋ น์— --no-sendfile ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํšจ๊ณผ์ ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ nproc ์ด ๋„ˆ๋ฌด ์ ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ' /etc/security/limits.conf ' ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜์—ฌ ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ nproc ์ˆ˜๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋กœ ๊ณ ํ†ต ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? Python 3.4 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Gunicorn ๋ฒ„์ „์„ ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค.

--worker-class์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. gunicorn์„ 20.0.4๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…์ž ํด๋ž˜์Šค๋ฅผ gevent๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. --worker-class gevent

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰