При развертывании на сервере (в рабочей среде) потоковые ответы сервера Gemini API не принимаются
Локально это работает нормально. В рабочей среде ответы без потоковой передачи работают хорошо. Когда я отправляю запрос Gemini API непосредственно с сервера AWS с помощью curl, потоковая передача работает отлично. Однако, когда я запускаю внутренний сервер с помощью Gunicorn, потоковая передача Gemini API не работает.
Я пробовал использовать как gevent, так и eventlet для рабочего класса, но ни то, ни другое не сработало.
Похоже, что это не проблема с конфигурацией nginx, поскольку потоковые ответы клиенту отправляются корректно. Проблема возникает только тогда, когда сервер вызывает внешний API.
На самом деле, когда я впервые настроил сервер, все работало нормально. Но с тех пор, как я настроил конвейер CI/CD (я просто попытался использовать github actions и удаленно установить требования), внешняя потоковая передача по API не работает.
Поскольку это кодовая база Django, даже удаление виртуальной среды и переустановка или установка с использованием requirements.txt из предыдущей сборки CI/CD (когда все работало нормально) не решает проблему.
Что мне делать?
Что я получил из журналов gunicorn
[2025-02-14 14:29:50 +0000] [5235] [CRITICAL] WORKER TIMEOUT (pid:5283)
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: response:
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: GenerateContentResponse(
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: done=False,
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: iterator=<_StreamingResponseIterator>,
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: result=protos.GenerateContentResponse({
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: "candidates": [
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: {
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: "content": {
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: "parts": [
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: {
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: "text": "\""
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: }
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: ],
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: "role": "model"
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: }
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: }
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: ],
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: "usage_metadata": {
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: "prompt_token_count": 1107,
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: "total_token_count": 1107
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: },
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: "model_version": "gemini-2.0-flash"
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: }),
Feb 14 14:29:50 ip-172-31-13-205 gunicorn[5283]: )
Часть моей конфигурации nginx
upstream django_app{
server unix:/run/gunicorn.sock;
}
server{
server_name {MY_SERVER_NAME};
location / {
include proxy_params;
proxy_pass http://django_app/;
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Connection "";
chunked_transfer_encoding on;
}
Моя конфигурация gunicorn
[Unit]
Description=gunicorn daemon of backend django
Requires=gunicorn.socket
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/my_server_name
Environment="PATH=/home/ubuntu/venv/bin" "DJANGO_ENV=prod"
ExecStart=/home/ubuntu/venv/bin/gunicorn -k eventlet --access-logfile - --workers 3 --log-level debug --bind unix:/run/gunicorn.sock my_django_app.wsgi:application
[Install]
WantedBy=multi-user.target
Что работает нормально:
- остальные запросы, за исключением того, для которого требуется gemini API (потоковое вещание)
- вызовы gemini API, не связанные с потоковым вещанием, работают
- прямой вызов потоковой передачи gemini API с помощью "curl" на сервере AWS
Что я использовал
- gunicorn (я пробовал оба eventlet, gevent)
- AWS
- Django
- nginx
Что я пробовал
- gevent, eventlet
- Понижение версии python до версии 3.11
- Понижен статус ввода-вывода grpc, grpcio-статус до 1.67.1