При развертывании на сервере (в рабочей среде) потоковые ответы сервера 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
Вернуться на верх