Je rencontre des erreurs "413 Request Entity Too Large" lors de la publication de fichiers de plus de 10 Mo sur notre API exécutée sur AWS Elastic Beanstalk.
J'ai fait pas mal de recherches et je pense avoir besoin de monter client_max_body_size pour Nginx, mais je n'arrive pas à trouver de documentation sur la façon de le faire avec Elastic Beanstalk. À mon avis, il doit être modifié à l'aide d'un fichier ebetension.
Quelqu'un a-t-il des idées sur la manière dont je peux atteindre la limite? 10Mo est assez faible, il doit y avoir un moyen d'augmenter cela manuellement.
Vous pouvez utiliser deux méthodes pour cela:
Pour certains types d'applications, comme Java SE , Go , Node.js , et peut-être Ruby (ce n'est pas documenté pour Ruby, mais toutes les autres plates-formes Nginx semblent pour supporter cela), Elasticbeanstalk a une compréhension intégrée de la façon de configurer Nginx.
Pour étendre la configuration nginx par défaut d'Elastic Beanstalk, ajoutez les fichiers de configuration .conf à un dossier nommé
.ebextensions/nginx/conf.d/
dans votre groupe de sources d'application. La configuration nginx d’Elastic Beanstalk inclut automatiquement les fichiers .conf dans ce dossier.~/workspace/my-app/ |-- .ebextensions | `-- nginx | `-- conf.d | `-- myconf.conf `-- web.jar
Pour augmenter spécifiquement la taille maximale de téléchargement, créez un fichier à l'aide de .ebextensions/nginx/conf.d/proxy.conf
en définissant la taille maximale du corps à la taille de votre choix:
client_max_body_size 50M;
Après de nombreuses recherches et des heures de travail avec la merveilleuse équipe de support AWS, j'ai créé un fichier de configuration à l'intérieur de .ebextensions
afin de modifier la configuration de nginx. Ce changement a permis une taille de corps plus grande.
À l'intérieur du répertoire .ebextensions
, j'ai créé un fichier appelé 01_files.config
avec le contenu suivant:
files:
"/etc/nginx/conf.d/proxy.conf" :
mode: "000755"
owner: root
group: root
content: |
client_max_body_size 20M;
Cela génère un fichier proxy.conf dans le répertoire /etc/nginx/conf.d. Le fichier proxy.conf contient simplement le seul trait client_max_body_size 20M;
qui fait l'affaire.
Notez que pour certaines plates-formes, ce fichier sera créé lors du déploiement, puis supprimé dans une phase de déploiement ultérieure.
Vous pouvez spécifier d'autres directives décrites dans la documentation Nginx.
http://wiki.nginx.org/Configuration
J'espère que cela aide les autres!
files:
"/etc/nginx/conf.d/proxy.conf" :
mode: "000755"
owner: root
group: root
content: |
client_max_body_size 20M;
Modification de la réponse ci-dessus pour des raisons de sécurité (et la syntaxe était fausse, voyez, deux entrées 'propriétaire:' dans le YAML), les gars, veuillez ne pas définir les autorisations 777 sur RIEN. Sauf si vous aimez être piraté et que vous définissez le propriétaire des fichiers de configuration Nginx sur root.
Voir également le ci-dessous answer pour que nginx récupère ce changement après le déploiement.
EDIT: Après avoir déployé une construction avec les instructions de la réponse acceptée par Nick Parsons, vous devrez peut-être redémarrer le serveur nginx pour prendre en compte les modifications.
Pour ce faire, ssh à l’instance et faire
Sudo service nginx reload
Pour en savoir plus sur le rechargement, voir http://nginx.org/en/docs/beginners_guide.html .
Dans une version précédente d'Elastic Beanstalk, j'ai pu ajouter une commande_conteneur pour accomplir cela, mais je constate maintenant, comme @cdmckay, que cela entraîne un échec du déploiement. Si vous reconstruisez votre environnement, il va récupérer les paramètres client_max_body_size aussi longtemps que cette instruction est dans votre fichier de configuration.
La réponse acceptée ne fonctionnait pas pour moi car j'ai une application basée sur JVM et elle semble effectuer la configuration de NGINX différemment. Je verrais un fichier proxy.conf créé pendant le déploiement, puis supprimé ultérieurement avant la fin du déploiement. La documentation AWS explique comment configurer le proxy :
Créez un fichier .ebextensions/nginx/conf.d/proxy.conf
contenant uniquement la ligne: client_max_body_size 40M;
Suite à la réponse acceptée, vous devrez peut-être recharger le fichier de configuration nginx.
Pour ce faire, ajoutez la commande suivante
container_commands:
01_reload_nginx:
command: "service nginx reload"
Ce serait une meilleure pratique que de ssh'ing dans votre instance eb et de le faire manuellement avec une commande.
Ceci, combiné à la réponse acceptée, a résolu le même problème pour moi. (Rails, Puma, NGINX)
La réponse acceptée ne fonctionnant pas pour moi, j'ai donc remplacé la configuration de nginx par la mienne.
J'ai créé un fichier appelé nginx.conf
dans le répertoire .ebextensions/nginx/
Je suis passé par SSHed dans une instance en cours d'exécution de mon application Beanstalk et j'ai copié le contenu du fichier nginx.conf
, en utilisant cat /etc/nginx/nginx.conf
et en le copiant depuis le terminal.
J'ai collé le contenu dans le fichier nginx.conf
que j'avais précédemment créé dans .ebextensions/nginx/
et modifié la directive http pour inclure client_max_body_size 50M;
. J'ai finalement redéployé mon application en utilisant eb deploy
et cela a fonctionné. Vous devriez recevoir le message suivant pendant le déploiement:
INFORMATION: La configuration de Nginx a été détectée dans le fichier '.ebextensions/nginx' annuaire. AWS Elastic Beanstalk ne gérera plus le Nginx configuration pour cet environnement.
Voici le contenu de mon fichier .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;
}
Je n'ai pas eu à redémarrer le service nginx ni l'environnement.
Remarque : Assurez-vous que votre .ebextensions fait partie du fichier .Zip créé et chargé sur Beanstalk lors du déploiement (il n'est pas ignoré dans .gitignore
ou .ebignore
si vous l'utilisez).
Vous pouvez également remplacer le serveur proxy par Apache . Pour ce faire, accédez à Configuration et modifiez la configuration logicielle. La première option est “Serveur proxy”, sélectionnez “Apache”.
La seule chose qui a fonctionné pour moi a été de créer un fichier ".config" à l'intérieur de .ebextensions comme ceci:
.ebextensions/proxy.config
seulement ce contenu à l'intérieur du .config:
files:
"/etc/nginx/conf.d/proxy.conf":
content: |
client_max_body_size 50M;
pas besoin de sous-dossiers, pas besoin de redémarrer le serveur d'applications, faites attention à un fichier ".config" et non à un fichier ".conf" dans .ebextensions et à l'utilisation d'une indentation appropriée pour éviter les erreurs dans la console aws, le reste est identique peu importe le nom du fichier,
grâce à: http://kroltech.com/2014/09/14/quick-tip-increase-upload-size-in-aws-elastic-beanstalk-node-js-env/
Pour Golang sans Docker, j'ai suivi les instructions d'aws doc:
Configuration du proxy inverse
Si vous souhaitez inclure des directives en plus de celles du bloc http nginx.conf, vous pouvez également fournir des fichiers de configuration supplémentaires dans le répertoire
.ebextensions/nginx/conf.d/
de votre groupe source. Tous les fichiers de ce répertoire doivent avoir l'extension .conf . http://docs.aws.Amazon.com/elasticbeanstalk/latest/dg/go-environment.html#go-complex-apps
J'ai créé le fichier proxy.conf
dans .ebextensions/nginx/conf.d/
à la racine de mon projet, avec simplement 1 ligne à l'intérieur:
client_max_body_size 20M;
Si cela ne fonctionne toujours pas, assurez-vous que le dossier .ebextensions
et les sous-dossiers sont inclus dans votre zip de déploiement. Pas besoin de redémarrer Nginx manuellement.
Pour la plate-forme Java
Pour créer le fichier proxy NGINX config, vous devez simplement ajouter
fichier .ebextension/nginx/conf.d/proxy.conf
avec le contenu client_max_body_size 20M;
dedans.
"proxy.conf" sera déployé dans "/etc/nginx/conf.d/proxy.conf" et automatiquement inclus par la configuration de NGINX.