Tengo un servidor Node ejecutándose en AWS Elastic Beanstalk. Uno de mis terminales acepta una gran carga útil y la función en sí es bastante lenta y larga, y puede demorar más de 10 minutos.
Debido a los requisitos comerciales, debe permanecer como un POST HTTP único y no se puede dividir para que sea más pequeño.
En llamadas más grandes recibo un 504 TIEMPO DE ESPERA DE LA PUERTA DE ENLACE, siempre alrededor de la marca de 60 segundos. He intentado jugar con la configuración de tiempo de espera en la sección Equilibrador de carga de Elastic Beanstalk sin éxito, parece que la duración más larga del tiempo de espera es de 60 segundos de todos modos.
Vi una solución prometedora en los documentos en https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/config-idle-timeout.html
Para asegurarse de que las operaciones largas, como la carga de archivos, tengan tiempo para completarse, envíe al menos 1 byte de datos antes de que transcurra cada período de tiempo de inactividad.
Esto suena como exactamente lo que necesito, pero no sé cómo lograr
1) ¿Cómo puedo "enviar al menos 1 byte de datos" desde mi aplicación Node para asegurarme de que la sesión se mantenga activa y no se agote después de un minuto?
504 Los tiempos de espera en entornos de ElasticBeanstalk se pueden resolver configurando sus políticas de ELB. También puede ser necesario actualizar las configuraciones de tiempo de espera de Nginx.
Políticas de ELB: establezca el tiempo de espera de inactividad de su Elastic Load Balancer en el valor de su elección (el valor predeterminado es 60 s). Para ello, cree una carpeta .ebextensions en la raíz de su proyecto. En esta carpeta, cree otro archivo con una extensión de archivo .config y establezca el tiempo de espera de inactividad de ELB en el valor de su elección (por ejemplo, 300 segundos):
option_settings: - namespace: aws:elb:policies option_name: ConnectionSettingIdleTimeout value: 300O si está utilizando un balanceador de carga de aplicaciones:
option_settings: - namespace: aws:elbv2:loadbalancer option_name: IdleTimeout value: 300 Configuración de Nginx: configure Nginx con el valor deseado de tiempo de espera: send_timeout , proxy_connect_timeout , proxy_read_timeout, proxy_Send_timeout todos predeterminados en 60 s (la especificación adicional para verificar puede ser: client_header_timeout , client_body_timeout , keepalive_timeout ). Los valores de tiempo de espera predeterminados en Nginx se especifican en los archivos de configuración y especificaciones (por ejemplo, los archivos .config en /etc/nginx ). En la carpeta .ebextensions cree un archivo nuevo (p. ej. 01-nginx-configuration.config o actualice en el archivo .config anterior) y agregue el siguiente contenido dentro del archivo (agregue o elimine configuraciones relevantes de acuerdo con los tiempos de espera observados):
files: "/etc/nginx/conf.d/nginx.custom.conf": mode: "644" owner: "root" group: "root" content: | client_header_timeout 300; client_body_timeout 300; send_timeout 300; proxy_connect_timeout 300; proxy_read_timeout 300; proxy_send_timeout 300; container_commands: 01_restart_nginx: command: "sudo service nginx reload"Hay varias formas más de agregar esta configuración. Leer más aquí y aquí .
Editar (11/06/2020): Algunas personas indicaron que el keep_alive 300; la configuración aplastó su servidor. Por lo tanto, lo eliminé de la configuración de nginx.custom.conf .
Para actualizar la configuración de nginx en la plataforma Amazon Linux 2, logré aumentar los límites de tiempo de espera extendiendo la configuración de nginx siguiendo estas instrucciones: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms- linux-extender.html
/.platform/nginx/conf.d/myconf.conf :
client_header_timeout 300; client_body_timeout 300; send_timeout 300; proxy_connect_timeout 300; proxy_read_timeout 300; proxy_send_timeout 300;