Aumentando client_max_body_size en Nginx conf en AWS Elastic Beanstalk

Me estoy encontrando con errores de “413 entidades de solicitud demasiado grandes” al publicar archivos de más de 10 MB en nuestra API que se ejecuta en AWS Elastic Beanstalk.

He investigado un poco y creo que necesito boost el tamaño de la masa del cliente_max_body para Nginx, sin embargo, parece que no puedo encontrar ninguna documentación sobre cómo hacer esto usando Elastic Beanstalk. Mi suposición es que debe ser modificado usando un archivo ebetension.

¿Alguien tiene pensamientos sobre cómo puedo subir el límite? 10 MB es bastante débil, tiene que haber una manera de subir esto manualmente.

Hay dos métodos que puede tomar para esto:

Compatible / recomendado en la documentación de AWS

Para algunos tipos de aplicaciones, como Java SE , Go , Node.js y, tal vez, Ruby (no está documentado para Ruby, pero todas las otras plataformas de Nginx parecen soportar esto), Elasticbeanstalk tiene una comprensión integrada de cómo configurar Nginx.

Para extender la configuración nginx predeterminada de Elastic Beanstalk, agregue archivos de configuración .conf a una carpeta llamada .ebextensions/nginx/conf.d/ en el paquete fuente de la aplicación . La configuración nginx de Elastic Beanstalk incluye archivos .conf en esta carpeta automáticamente.

 ~/workspace/my-app/ |-- .ebextensions | `-- nginx | `-- conf.d | `-- myconf.conf `-- web.jar 

Configurando el Proxy Reverso – Java SE

Para boost el tamaño de carga máximo específicamente, cree un archivo en .ebextensions/nginx/conf.d/proxy.conf configurando el tamaño máximo del cuerpo al tamaño que prefiera:

 client_max_body_size 50M; 

Crea el archivo de configuración de Nginx directamente

Después de mucha investigación y horas de trabajo con el maravilloso equipo de soporte de AWS, creé un archivo de configuración dentro de .ebextensions para modificar la configuración de nginx. Este cambio permitió un tamaño de cuerpo de poste más grande.

Dentro del directorio .ebextensions , creé un archivo llamado 01_files.config con los siguientes contenidos:

 files: "/etc/nginx/conf.d/proxy.conf" : mode: "000755" owner: root group: root content: | client_max_body_size 20M; 

Esto genera un archivo proxy.conf dentro del directorio /etc/nginx/conf.d. El archivo proxy.conf simplemente contiene el liner client_max_body_size 20M; que hace el truco

Tenga en cuenta que para algunas plataformas, este archivo se creará durante la implementación, pero luego se eliminará en una fase de implementación posterior.

Puede especificar otras directivas que se describen en la documentación de Nginx.

http://wiki.nginx.org/Configuration

Espero que esto ayude a otros!

 files: "/etc/nginx/conf.d/proxy.conf" : mode: "000755" owner: root group: root content: | client_max_body_size 20M; 

Modifiqué la respuesta anterior por razones de seguridad (y la syntax era incorrecta, vea, dos entradas ‘propietario:’ en el YAML), muchachos, por favor no establezcan 777 permisos en NADA. A menos que disfrute de ser pirateado, y configure al propietario de los archivos de configuración de Nginx en la raíz.

Consulte también la respuesta a continuación para hacer que nginx recoja este cambio después de la implementación.

EDITAR: Después de que haya implementado una construcción con las instrucciones en la respuesta aceptada por Nick Parsons, es posible que deba reiniciar el servidor nginx para recoger los cambios.

Para hacer esto, ssh a la instancia y hazlo

sudo service nginx reload

Para obtener más información sobre cómo volver a cargar, consulte http://nginx.org/en/docs/beginners_guide.html .

En una versión anterior de Elastic Beanstalk, pude agregar un container_command para lograr esto, pero ahora estoy descubriendo, como @cdmckay, que esto causa una falla en la implementación. Si reconstruyes tu entorno, recuperará la configuración de client_max_body_size y siempre que esa instrucción esté en tu archivo de configuración.

La respuesta aceptada no funcionó porque tengo una aplicación basada en JVM y parece que la configuración de NGINX es diferente. Vería un archivo proxy.conf que se crea durante la implementación pero luego se elimina antes de que se complete la implementación. La documentación de AWS explica cómo configurar el proxy :

Cree un .ebextensions/nginx/conf.d/proxy.conf que contenga solo la línea: client_max_body_size 40M;

Después de la respuesta aceptada, es posible que necesite volver a cargar el archivo de configuración de nginx.

Para hacer esto agregue el siguiente comando

  container_commands: 01_reload_nginx: command: "service nginx reload" 

Esta sería una mejor práctica que ingresar en su instancia de eb y hacerlo manualmente con un comando.

Esto combinado con la respuesta aceptada resolvió el mismo problema para mí. (Rieles, Puma, NGINX)

Alternativamente, puede cambiar el servidor proxy a Apache. Para hacer esto, vaya a la Configuración y Edite la Configuración del Software. La primera opción aquí es “Servidor Proxy”, seleccione “apache”.

La respuesta aceptada no funcionó para mí, así que en su lugar superé la configuración de nginx con la mía.

nginx.conf un archivo llamado nginx.conf bajo el directorio .ebextensions/nginx/

Hice una entrada SSH en una instancia en ejecución de mi aplicación Beanstalk, y copié el contenido del archivo nginx.conf , usando cat /etc/nginx/nginx.conf y copiando desde la terminal.

nginx.conf los contenidos en el archivo nginx.conf que creé previamente en .ebextensions/nginx/ y modifiqué la directiva http para incluir client_max_body_size 50M; . Finalmente reimplegué mi aplicación usando eb deploy y funcionó. Debería recibir el siguiente mensaje durante la implementación:

INFORMACIÓN: configuración de Nginx detectada en el directorio ‘.ebextensions / nginx’. AWS Elastic Beanstalk ya no administrará la configuración de Nginx para este entorno.

Estos son los contenidos de mi .ebextensions/nginx/nginx.conf :

 # Elastic Beanstalk Nginx Configuration File user nginx; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 33193; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; include conf.d/*.conf; map $http_upgrade $connection_upgrade { default "upgrade"; } server { listen 80 default_server; access_log /var/log/nginx/access.log main; client_header_timeout 60; client_body_timeout 60; keepalive_timeout 60; gzip off; gzip_comp_level 4; gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript; # Include the Elastic Beanstalk generated locations include conf.d/elasticbeanstalk/*.conf; } client_max_body_size 50M; } 

No tuve que reiniciar el servicio nginx ni el entorno.

Nota : asegúrese de que sus .ebextensions formen parte del archivo .zip creado y cargado en Beanstalk durante la implementación (no se ignora en .gitignore o .ebignore si lo está usando).

Para Golang sin Docker, seguí estas instrucciones del documento de Aws:

Configurando el Proxy Inverso

Si desea incluir directivas además de las del bloque http nginx.conf, también puede proporcionar archivos de configuración adicionales en el .ebextensions/nginx/conf.d/ de su paquete fuente. Todos los archivos en este directorio deben tener la extensión .conf. http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/go-environment.html#go-complex-apps

proxy.conf el archivo proxy.conf en .ebextensions/nginx/conf.d/ en la raíz de mi proyecto, con solo 1 línea adentro:

 client_max_body_size 20M; 

Si aún no funciona, asegúrese de que la carpeta .ebextensions y las subcarpetas estén incluidas en su zip de despliegue. No es necesario reiniciar Nginx manualmente.

Para la plataforma Java

Para crear el archivo proxy de configuración NGINX, solo debe agregar

.ebextension/nginx/conf.d/proxy.conf

con el contenido client_max_body_size 20M; en eso.

“proxy.conf” se implementará en “/etc/nginx/conf.d/proxy.conf” y se incluirá automáticamente en la configuración de NGINX.