Рейтинг:1

Почему Nginx усекает потоковый ответ JSON?

флаг in

Наш стек Клиент (браузер) <-> Обратный прокси-сервер Nginx <-> Веб-сервер (Flask+Gunicorn) <-> Сервер Golang gRPC

Проблема в том, что когда клиент звонит /реальные данные endpoint, затем Flask открывает соединение gRPC и начинает получать данные через однонаправленный поток сервер->клиент. Затем он передает его обратно клиенту. Когда я запускаю это без Nginx, я получаю все ответы. При работе с Nginx некоторые ответы усекаются. Например, если мы ожидаем:

{
    "источник": "сервисА",
    "отметка времени": 123456789,
    "данные": {
        «1»: 24.55667,
        "2": -456,5656,
        ...
        «200»: 5,678
    }
}

Мы получили

{
    "источник": "сервисА",
    "время

затем

        штамп": 123456789,
    "данные": {
        «1»: 24.55667,
        "2": -456,5656,
        ...
        «200»: 5,678
    }
}

Это будет напечатано в console.log. У меня есть прокси_буферизация выключена; в конфигурации nginx, иначе данные не попадут в браузер. Не знаю, как решить эту проблему.

Здесь является минимальным воспроизводимым примером.

ОБНОВИТЬ: Я запустил минимальный воспроизводимый пример с Apache2 вместо Nginx и столкнулся с теми же случайными усечениями.

флаг cn
Что вы подразумеваете под "Мы получаем [...] и затем [...]"?! Что вы все равно получаете все данные? Я не понимаю, почему это может быть проблемой.
Paul Côté avatar
флаг in
Я печатаю ответ в консоли браузера. Так что я получу, например, одну половину ответа, затем другую. Но это проблема, потому что `response.JSON()` выдает ошибку, когда он усекается таким образом.
Рейтинг:0
флаг ve

У меня было подобное поведение от Apache (!) Разбивая html-файл, отвечающий от django. Он всегда ломался в одном и том же месте без всякой причины. Наконец я обнаружил, что случайно установил пакет mod_wsgi в Apache из версии Python, которая не соответствовала версии, в которой Apache вызывал мое приложение. Может быть, это поможет вам.

Paul Côté avatar
флаг in
Эй, спасибо, я проверю это. В итоге я использовал веб-сокеты для решения проблемы. Обрезание прекратилось.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.