Estamos ejecutando una aplicación web Fastapi + Uvicorn utilizando gunicorn como administrador de procesos y Nginx como servidor proxy inverso. La aplicación se ejecuta en modo asíncrono para la mayoría de las operaciones de E/S (llamada a base de datos, resto de API). Toda la configuración se ejecuta dentro de un contenedor Docker en Ubuntu 16.04.
La configuración funciona la mayoría de las veces, pero a veces no procesa una solicitud en absoluto y se agota el tiempo de espera al final de Nginx. También intentamos sacar a Nginx de la configuración y observamos que pocas solicitudes se procesan después de mucho tiempo (como después de 15 minutos). Esto es muy aleatorio, pero generalmente sucede 2-3 veces en una hora.
A continuación se muestra la configuración de gunicorn que estamos usando:
host = os.getenv("HOST", "0.0.0.0") port = os.getenv("PORT", "80") # Gunicorn config variables workers = web_concurrency bind = f"{host}:{port}" keepalive = 2 timeout = 60 graceful_timeout = 30 threads = 2 worker_tmp_dir = "/dev/shm" # Logging mechanism capture_output = True loglevel = os.getenv("LOG_LEVEL", "debug") Y gunicorn se invoca con el comando exec gunicorn -k uvicorn.workers.UvicornWorker -c "$GUNICORN_CONF" "$APP_MODULE"
Hemos intentado varios cambios de configuración como: