50 lines
2.2 KiB
Markdown
50 lines
2.2 KiB
Markdown
# Sonnet: Flask за ingress'ом дропает большие POST — nginx echo нет
|
||
|
||
## Новый решающий тест
|
||
Nginx:alpine через тот же VIP/ingress — 100KB POST = 10/10 успех.
|
||
Flask через тот же VIP/ingress — 100KB POST = 2-5/10.
|
||
|
||
VIP, ingress, kube-vip, сеть исключены. Проблема в связке «ingress → Flask».
|
||
|
||
## Что уже проверили на Flask
|
||
- debug=True → debug=False: 5/10 (незначительно)
|
||
- request.get_data() перед request.form: 2/10 (ухудшило, откачено)
|
||
- proxy_request_buffering off: 5/10 (лучше чем on = 3/10)
|
||
- proxy_request_buffering on: 3/10
|
||
- Внутри кластера (pod→pod, pod→ingress): 10/10 всегда
|
||
|
||
## Инфра
|
||
- Flask 3.1.3, Werkzeug 3.1.8, Python 3.12
|
||
- Запуск: app.run(host='0.0.0.0', port=5000, debug=False, threaded=True)
|
||
- Ingress: nginx, proxy_http_version 1.1, proxy_request_buffering off
|
||
- Flask отвечает Connection: close (dev server не держит keepalive)
|
||
- Content-Type: application/x-www-form-urlencoded, тело ~136KB (base64)
|
||
- Код: request.form.get('data', '') → парсинг формы
|
||
|
||
## Код /upload
|
||
```python
|
||
@app.route('/upload', methods=['POST'])
|
||
def upload():
|
||
t0 = time.time()
|
||
data = request.form.get('data', '')
|
||
if data:
|
||
if ',' in data:
|
||
data = data.split(',', 1)[1]
|
||
data = data.replace(' ', '+')
|
||
missing = len(data) % 4
|
||
if missing:
|
||
data += '=' * (4 - missing)
|
||
raw = base64.b64decode(data)
|
||
elapsed = round((time.time() - t0) * 1000)
|
||
return {'ok': True, 'bytes': len(raw), 'elapsed_ms': elapsed}
|
||
for f in request.files.values():
|
||
...
|
||
return {'ok': True, 'bytes': total, 'elapsed_ms': elapsed}
|
||
```
|
||
|
||
## Вопрос
|
||
Почему Flask за nginx ingress'ом дропает connection на большом POST, а nginx:alpine — нет?
|
||
Может ли Werkzeug dev server иметь проблему с chunked transfer encoding от ingress'а?
|
||
Или проблема в парсинге URL-encoded формы большого размера?
|
||
Что попробовать В КОДЕ (не в инфраструктуре)?
|