У мене nginx налаштований як передній додаток для програми Python, що працює під рушницею, але nginx припиняє з'єднання після того, як було надіслано близько 65 к даних.
Наприклад, у мене є вид, який виглядає приблизно так:
def debug_big_file(request):
return HttpResponse("x" * 500000)
Але коли я отримую доступ до цієї URL-адреси через nginx, я отримую лише 65283 байти:
$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
0 1 65283
Зауважте, що все працює так, як очікувалося, коли ви отримуєте прямий доступ до зброї:
$ curl http://localhost:1234/debug/big-file | wc
…
0 1 500000
Відповідна конфігурація nginx:
location / {
proxy_pass http://localhost:1234/;
proxy_redirect off;
proxy_headers_hash_bucket_size 96;
}
І nginx версії 1.7.0
Деякі інші факти:
- Кількість байтів узгоджується з запитом на запит, але вона змінюється залежно від вмісту (я вперше помітив це у великому файлі PNG, який був відрізаний після 65 372 байт, а не 65 283)
- 110k байтів надсилаються правильно (тобто
"x" * 110000
повертає всі 110 000 байт), але 120k байтів - ні tcpdump
припускає, що nginx надсилає RST-пакет для gunicorn:
Було б корисно побачити (a) яким чином gunicorn вибирає кадр розміром від 110 до 120 кбайт, і (b) як nginx потім вибирає обрамлення для того ж діапазону розмірів вибіркової корисної навантаження між 110 к і 120 к байт. Три способи, яким HTTP може обрамляти дані: надавати довжину вмісту; робити кодоване кодування; або взагалі не надавати рамки, окрім обіцянки закрити розетку, коли корпус буде завершений.
—
Брендон Родос
Надається заголовок довжини вмісту. Дозвольте мені
—
перенести
Хрм, дуже дивно. tcpdump припускає, що nginx активно RST-іє з'єднання (див. редагування). nginx також використовує HTTP / 1.0 та
—
Девід Уолвер
Connection: close
. Я також підтвердив, що Content-Length
заголовок правильний.