37 lines
1.4 KiB
Markdown
37 lines
1.4 KiB
Markdown
# 2026-07-10 — Ответ Соннета: Werkzeug dev server + chunked TE = гонка
|
|
|
|
## Диагноз
|
|
Werkzeug dev server не умеет корректно работать с chunked transfer encoding от nginx.
|
|
При `proxy_request_buffering: off` nginx шлёт тело чанками.
|
|
Flask отвечает `Connection: close` → nginx ещё шлёт чанк → RST → таймаут.
|
|
|
|
nginx:alpine держит keep-alive → проблемы нет.
|
|
|
|
## Решение
|
|
Gunicorn вместо Werkzeug dev server.
|
|
Правильно де-чанкует тело, держит persistent connections.
|
|
|
|
## Способ
|
|
Shturval запускает `python app.py`. Вместо `app.run()` — Gunicorn через Python API:
|
|
```python
|
|
if __name__ == '__main__':
|
|
import gunicorn.app.base
|
|
class StandaloneApp(gunicorn.app.base.BaseApplication):
|
|
def __init__(self, app, options=None):
|
|
self.application = app
|
|
self.options = options or {}
|
|
super().__init__()
|
|
def load_config(self):
|
|
for k, v in self.options.items():
|
|
self.cfg.set(k, v)
|
|
def load(self):
|
|
return self.application
|
|
StandaloneApp(app, {
|
|
'bind': '0.0.0.0:5000',
|
|
'workers': 2,
|
|
'timeout': 300,
|
|
}).run()
|
|
```
|
|
|
|
requirements.txt уже содержит gunicorn. Dockerfile CMD можно убрать (Shturval всё равно переопределяет).
|