Отключение буферизации ответов в nginx для StreamingHTTPResponse

У меня есть django-приложение, работающее на AWS Elastic Beanstalk. Часть этого приложения транслирует пользователю ответ OpenAI о завершении чата в виде кусков. При локальном запуске с помощью gunicorn ответ передается в виде кусков, как и ожидалось.

После развертывания на AWS Elastic Beanstalk с сервером nginx ответ не передается потоком, как это происходит в dev. Он буферизуется до тех пор, пока весь ответ не будет готов, а затем возвращает его сразу.

Я считаю, что мне нужно отключить буферизацию ответов в nginx. Ниже приведена моя текущая структура.

        def generate_stream():
            ai_response = StringIO()
            try:
                response = client.chat.completions.create(
                    model="gpt-4o",
                    messages=context_messages,
                    temperature=0.7,
                    max_tokens=4096,
                    stream=True
                )

                for chunk in response:
                    content = chunk.choices[0].delta.content
                    if content:
                        ai_response.write(content)
                        yield content

                try:
                    ai_response_obj = Message.objects.create(conversation=conversation, content=ai_response.getvalue(), role="assistant")
                    print(f"AI response saved: {ai_response_obj}")
                except Exception as e:
                    print(f"Failed to save AI response: {e}")

            except (openai.APIConnectionError, openai.OpenAIError) as e:
                print(f"API connection error: {e}")
                yield ("ERROR: There was an issue processing your request. Please check your internet connection and try again.")

            except Exception as e:
                print(f"Unexpected error: {e}")
                yield "Error: An unexpected error occurred."

        response_server = StreamingHttpResponse(generate_stream(), content_type='text/plain')
        response_server['Cache-Control'] = 'no-cache'  # prevent client cache
        response_server["X-Accel-Buffering"] = "no"
        response_server.status_code = status.HTTP_201_CREATED
        return response_server

У меня также есть файл конфигурации, расположенный в каталоге приложений по пути .platform/nginx/conf.d/myconf.conf, который выглядит следующим образом:

server {
    location /api/chatbot {
        proxy_pass https://my_backend_url.com; 
        proxy_buffering off;             
        proxy_cache off;  
               
        proxy_set_header Host $host;     
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header Connection "";
        proxy_set_header X-Accel-Buffering "no"; 

        chunked_transfer_encoding on;     
    }
}

При отправке запроса с такой конфигурацией я никогда не вижу, чтобы заголовок ответа X-Accel-Buffering был установлен. Я занимаюсь этим уже некоторое время и был бы рад, если бы кто-нибудь столкнулся с подобной проблемой.

Вернуться на верх