Отключение буферизации ответов в 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
был установлен. Я занимаюсь этим уже некоторое время и был бы рад, если бы кто-нибудь столкнулся с подобной проблемой.