nginx припиняє з'єднання після 65 кбайт


11

У мене 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: nginx відправлення RST

Було б корисно побачити (a) яким чином gunicorn вибирає кадр розміром від 110 до 120 кбайт, і (b) як nginx потім вибирає обрамлення для того ж діапазону розмірів вибіркової корисної навантаження між 110 к і 120 к байт. Три способи, яким HTTP може обрамляти дані: надавати довжину вмісту; робити кодоване кодування; або взагалі не надавати рамки, окрім обіцянки закрити розетку, коли корпус буде завершений.
Брендон Родос

Надається заголовок довжини вмісту. Дозвольте мені
перенести

Хрм, дуже дивно. tcpdump припускає, що nginx активно RST-іє з'єднання (див. редагування). nginx також використовує HTTP / 1.0 та Connection: close. Я також підтвердив, що Content-Lengthзаголовок правильний.
Девід Уолвер

Відповіді:


10

Добре! Після подвійної перевірки журналів nginx це виявилося проблемою:

2014/05/26 16:50:56 [crit] 31396#0: *11 open() "…/proxy_temp/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 1.2.3.4, server: _, request: "GET /debug/big-file HTTP/1.1", upstream: "http://127.0.0.1:1234/debug/big-file", host: "example.com"

Деякі способи дозволу для proxy_tempкаталогу змішалися, що не дозволило nginx належним чином забуферувати його.


1
Так, я просто вирішив подібну проблему, заглянув у журнали nginx, мав рядок, що містить [crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream, зробив sudo chown -R www-data:www-data /var/lib/nginx/і це виправлено.
Епіген
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.