Augmentation de client_max_body_size dans la configuration Nginx sur AWS Elastic Beanstalk

121

Je rencontre des erreurs «413 Request Entity Too Large» lorsque je publie des 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 que j'ai besoin d'augmenter la taille client_max_body_size pour Nginx, mais je n'arrive pas à trouver de documentation sur la façon de faire cela en utilisant Elastic Beanstalk. Je suppose qu'il doit être modifié à l'aide d'un fichier ebetension.

Quelqu'un a-t-il des idées sur la façon dont je peux augmenter la limite? 10 Mo est assez faible, il doit y avoir un moyen de le faire manuellement.

Nick Parsons
la source
1
La valeur par défaut n'est que de 1 Mo ces jours-ci ...
rogerdpack
Pour mémoire, toutes les solutions fournies ne s'attaquent pas aux déploiements .NET. Si vous utilisez .NET dans AWS Elastic Beanstalk, vous devez configurer les paramètres IIS dans votre projet. Pour moi, j'ai dû configurer le web.config dans mon application net471.
SimonH

Réponses:

223

Il existe deux méthodes que vous pouvez utiliser pour cela. Malheureusement, certaines fonctionnent pour certains types d'applications EB et d'autres pour d'autres.

Pris en charge / recommandé dans la documentation AWS

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 le prendre en charge), Elasticbeanstalk a une compréhension intégrée de la configuration de 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 bundle source 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

Configuration du proxy inverse - Java SE

Pour augmenter spécifiquement la taille de téléchargement maximale, créez un fichier en .ebextensions/nginx/conf.d/proxy.confdéfinissant la taille maximale du corps sur la taille que vous préférez:

client_max_body_size 50M;

Créez directement le fichier de configuration Nginx

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 .ebextensionspour compléter la configuration de nginx. Ce changement a permis une plus grande taille de corps de poteau.

À l'intérieur du .ebextensionsrépertoire, j'ai créé un fichier appelé 01_files.configavec 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 la seule ligne 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é lors d'une phase de déploiement ultérieure.

Vous pouvez spécifier d'autres directives qui sont décrites dans la documentation Nginx.

http://wiki.nginx.org/Configuration

J'espère que cela aide les autres!

Nick Parsons
la source
2
Le format de fichier est documenté sur docs.aws.amazon.com/elasticbeanstalk/latest/dg/… . La progression est enregistrée dans /var/log/cfn-init.log. Dans les journaux, vous devriez voir quelque chose comme 2014-xx-xx xx:xx:xx,xxx [DEBUG] Writing content to /etc/nginx/conf.d/proxy.conf. Je ne suis pas sûr, mais il semblait que le redémarrage du serveur pourrait être nécessaire.
h-kippo du
2
Travailler pour moi avec puma. A dû redémarrer le service comme @Will l'a dit (sudo service nginx reload).
Dennis
1
J'espère que cela pourrait aider quelqu'un d'autre car cela m'a pris un certain temps ... l'indentation est importante - elle doit se conformer à la spécification YAML - docs.saltstack.com/en/latest/topics/yaml
alexs
1
Confirmé de travail, assurez-vous que .ebextensionsn'est pas dans .ebignoreet .gitignore🖖 Je n'ai pas besoin de redémarrer le service nginx, eb deployet cela a fonctionné 🎉
GabLeRoux
4
Pour le nœud js, la deuxième méthode (files :) a fonctionné pour moi. Le premier n'a pas fonctionné. Même le support AWS a conseillé d'utiliser la deuxième méthode pour le nœud js docs.aws.amazon.com/elasticbeanstalk/latest/dg
Kapil
33
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 'owner:' dans le YAML), les gars, veuillez ne pas définir 777 autorisations sur TOUT. Sauf si vous aimez être piraté et que vous définissez le propriétaire des fichiers de configuration Nginx sur root.

Voir également la réponse ci - dessous pour que nginx récupère ce changement après le déploiement.

user3217794
la source
22

EDIT: Après avoir déployé une version avec les instructions de la réponse acceptée par Nick Parsons, vous devrez peut-être redémarrer le serveur nginx pour récupérer les modifications.

Pour ce faire, ssh sur l'instance et faites

sudo service nginx reload

Pour en savoir plus sur le rechargement, consultez http://nginx.org/en/docs/beginners_guide.html .

Dans une version précédente d'Elastic Beanstalk, j'ai pu ajouter une commande container_command pour accomplir cela, mais maintenant je constate, comme @cdmckay, que cela provoque un échec de déploiement. Si vous reconstruisez votre environnement, il récupérera les paramètres client_max_body_size aussi longtemps que cette instruction est dans votre fichier de configuration.

Volonté
la source
Est-ce nécessaire? Si vous ne l'ajoutez pas, comment redémarrera-t-il?
cdmckay
D'après mon expérience, j'ai trouvé cela nécessaire.
Volonté le
@cdmckay pouvez-vous en dire plus sur les problèmes d'instance causés par la commande de rechargement?
Sera
Je ne l'ai pas examiné de trop près, mais cela a essentiellement empêché mon serveur de se lancer jusqu'à ce que je le supprime. Cela ne semble pas nécessaire.
cdmckay
3
dans mon expérience, j'ai trouvé que c'était nécessaire cependant, j'ai dû ajouter une vérification pour voir si nginx était en cours d'exécution avant d'essayer de le redémarrer pour de nouvelles instances - 'pgrep nginx && service nginx reload || true '
alexs
16

La réponse acceptée n'a pas fonctionné pour moi car j'ai une application basée sur JVM et il semble que la configuration de NGINX soit différente. Je verrais un fichier proxy.conf créé pendant le déploiement, puis supprimé par la suite avant la fin du déploiement. La documentation AWS explique comment configurer le proxy :

Créez un .ebextensions/nginx/conf.d/proxy.conffichier qui ne contient que la ligne:client_max_body_size 40M;

Raymond26
la source
2
Malheureusement, cela n'a pas fonctionné pour moi ( Docker ELB à conteneur unique ) - même après un redémarrage de l'instance. En vous connectant à l'instance via SSH, aucun fichier proxy.conf n'est créé/etc/nginx/conf.d/
Udo G
Je suppose que c'est à cause du fait que vous utilisez un Docker ELB et qu'il fait nginx conf différemment. Ma réponse est pour ELB prédéfini par Java.
Raymond26
J'utilise l'application elb et java. Travaille pour moi! Merci!
Dimitar Vukman
Comment pouvez-vous voir le fichier proxy.conf en cours de création, en notant simplement sa présence temporaire?
rogerdpack
9

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é avec la réponse acceptée a résolu le même problème pour moi. (Rails, Puma, NGINX)

ConorB
la source
7

La seule chose qui a fonctionné pour moi a été de créer un fichier ".config" dans .ebextensions comme celui-ci:

.ebextensions/
           proxy.config

avec uniquement ce contenu dans le fichier .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'application, faites attention que c'est un fichier ".config" pas un ".conf" à l'intérieur de .ebextensions et l'utilisation d'une indentation appropriée pour éviter les erreurs dans la console aws le reste est le même peu importe le nom du fichier,

merci à: http://kroltech.com/2014/09/14/quick-tip-increase-upload-size-in-aws-elastic-beanstalk-node-js-env/

Ed Vieira
la source
6

J'ai essayé toutes les .ebextensionsméthodes d'ajout de configuration au niveau de l'implémentation et cela ne m'a pas aidé dans la dernière AMI Amazon Linux. J'ai fait beaucoup de recherches et après avoir parcouru les journaux, je peux trouver que le lanceur de la tâche de déploiement vérifie un dossier appelé à .platformchaque fois et j'ai pensé en ajouter un comme les .ebextensions. Voici les paramètres que j'ai définis dans mon dossier racine de mon projet.

Ajoutez la configuration de dossier ci-dessous au niveau racine de votre dossier de projet.

Structure des dossiers (.platform / nginx / conf.d / proxy.conf)

.platform/
         nginx/
              conf.d/
                    proxy.conf
         00_myconf.config

Contenu du fichier 1 - proxy.conf ( .platform/nginx/conf.d/dossier intérieur )

client_max_body_size 50M;

Contenu du fichier 2 - 00_myconf.config ( .platform/dossier intérieur )

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

Soin plein avec les extensions. Le premier fichier est .conf et le deuxième fichier est .config .

Redéployez maintenant votre projet sur Amazon Elastic Beanstalk et vous verrez la magie. Cette configuration sera ajoutée à toutes vos instances EC2, créées dans le cadre de la mise à l'échelle automatique.

Structure de dossier détaillée ci-dessous.

entrez la description de l'image ici

Jijo Cleetus
la source
2
Homme!!!!!!!! Merci beaucoup. C'est le seul moyen de définir la configuration nginx dans AWS EB Amazon Linux. J'ai perdu une journée entière à essayer toutes les solutions disponibles !!! Je ne peux pas vous dire comment vous remercier d'avoir pris le temps d'écrire cette réponse en détail. Soyez bénis. Si vous avez une sorte de compte patreon ou buymeacoffee, vous contribuez. @jijo Cleetus
InfinitePrime
2
Merci beaucoup. J'ai aussi essayé toutes les approches possibles en utilisant .ebextensionset seule cette approche a fonctionné.
ArunDhaJ
1
Cela m'a sauvé des tonnes d'essais et d'échecs pour que cela fonctionne. Je ne peux pas vous remercier assez!
Jalal El-Shaer le
1
Merci beaucoup, cela a également fonctionné pour une application Spring Boot; avec Elastic Beans Talk exécutant tomcat. Prenez une bière sur mon onglet :).
Awi
5

La réponse acceptée n'a pas fonctionné pour moi, alors j'ai remplacé la configuration nginx par la mienne.

J'ai créé un fichier appelé nginx.confsous le répertoire.ebextensions/nginx/

Je me suis connecté en SSH dans une instance en cours d'exécution de mon application Beanstalk et j'ai copié le contenu du nginx.conffichier, en utilisant cat /etc/nginx/nginx.confet en copiant à partir du terminal.

J'ai collé le contenu dans le nginx.conffichier que j'avais précédemment créé .ebextensions/nginx/et modifié la directive http pour l'inclure client_max_body_size 50M;. J'ai finalement redéployé mon application en utilisant eb deployet cela a fonctionné. Vous devriez recevoir le message suivant lors du déploiement:

INFO: configuration Nginx détectée dans le répertoire '.ebextensions / nginx'. AWS Elastic Beanstalk ne gérera plus la configuration Nginx pour cet environnement.

Voici le contenu de mon .ebextensions/nginx/nginx.conffichier:

# 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 téléchargé sur Beanstalk lors du déploiement (il n'est pas ignoré dans .gitignoreou .ebignoresi vous l'utilisez).

kskyriacou
la source
Merci pour cela! Je me demandais cependant quelle plateforme vous utilisiez? Pour une raison quelconque, Beanstalk ne détecte pas mon fichier `.ebextensions / nginx / nginx.conf` même s'il se trouve dans le fichier zip et le dépôt git.
Icid
J'ai voté pour la note. J'ignorais ce .ebextensionsqui a fait échouer la réponse acceptée et populaire. Je n'ai pas essayé tout ce que vous avez mentionné, mais merci pour la note 🍻
GabLeRoux
3

Il s'agit de la solution fournie par AWS , et cela fonctionne (ajustez la taille en fonction de vos besoins)

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/enact/12_add_nginx_configuration.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      /bin/echo "client_max_body_size 50M;" > /etc/nginx/conf.d/proxy.conf
      /sbin/service nginx reload
Tony BenBrahim
la source
2

Vous pouvez également changer le serveur proxy en Apache. Pour ce faire, accédez à la configuration et éditez la configuration logicielle. La première option ici est «Serveur proxy», sélectionnez «apache».

David Smits
la source
Apache a sa propre directive LimitRequestBody pour définir la taille maximale des fichiers téléchargés.
Tom Harvey
@TomHarvey Si disponible, pourriez-vous nous fournir un exemple complet du cas d'utilisation avec LimitRequestBody?
Hasan
1

Pour Golang sans Docker, j'ai suivi ces instructions de 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 .ebextensions/nginx/conf.d/répertoire de votre bundle 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.confdans .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 .ebextensionsdossier et les sous-dossiers sont inclus dans votre zip de déploiement. Pas besoin de redémarrer Nginx manuellement.

pascal
la source
1

J'étais aux prises avec le même problème mais je n'ai pas pu le résoudre, finalement ça marche.

voici mon fichier congfig,

files:
  "/etc/nginx/conf.d/01_proxy.conf":
    mode: "000755"
    owner: root
    group: root
    content: |
      client_max_body_size 50M;
      client_body_buffer_size 16k;

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

Le problème était,

J'utilisais un script python pour le pipeline de code qui n'inclut pas le dossier .ebextensions lors de la création de la construction.

Voici mes quelques centimes,

  1. assurez-vous que votre dossier .ebextensions est inclus dans le dossier zip de votre build qui se trouve dans s3bucket de votre compte aws
  2. assurez-vous qu'il ne se trouve pas dans le fichier .gitignore
  3. si vous utilisez un script pour générer la construction, assurez-vous qu'il inclut .ebextensions
harshal jadhav
la source
1

Après 3 longs jours à essayer de comprendre celui-ci, j'ai sauté sur un appel avec l'incroyable équipe de support AWS et ils m'ont donné des indices sur la façon de le résoudre. Tout d'abord, mon projet est en JAVA et j'utilise maven et spring boot pour l'exécuter via Elastic Beanstalk (EBS).

  1. Comme expliqué dans la documentation d'AWS , vous devez stocker les paramètres nginx personnalisés au niveau racine de votre projet. Pour ce faire , je l' ai créé un fichier client_max_body_size.conf et placé dans le chemin suivant: myprojectname /src/main/resources/ebextensions/nginx/conf.d/client_max_body_size.conf Ce fichier contient la ligne suivante:

    client_max_body_size 10M;
    
  2. Configurez maven pour ajouter ce fichier dans le dossier racine de mon projet lors de la construction. C'était un peu délicat, j'avais besoin d'ajouter la configuration suivante ( source ) dans mon POM.xml:

    <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <!-- here the phase you need -->
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${basedir}/target/.ebextensions</outputDirectory>
                <resources>
                    <resource>
                        <directory>src/main/resources/ebextensions</directory>
                        <filtering>true</filtering>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
    

  3. Vous pouvez maintenant déjà créer votre projet localement et exécuter la commande SSH suivante pour valider qu'il se trouve réellement à la racine de votre projet:

    jar tf main-1.0-SNAPSHOT.jar | grep .ebextensions
    
  4. Maintenant, c'est la partie délicate. Lorsque vous le téléchargez sur EBS, votre fichier ne doit contenir que le fichier SNAPSHOT.jar et le dossier .ebextensions. Par exemple, si vous allez maintenant compresser le fichier jar et le dossier et les télécharger manuellement, cela fonctionnera!

  5. Étant donné que j'utilise Jenkins pour mon déploiement, et en particulier le plug -in de déploiement AWS EBS , vous devez modifier les paramètres des fichiers / dossier que vous incluez dans le déploiement. Maintenant, pour une raison quelconque, je n'ai pas pu inclure le dossier .ebextensions, j'ai donc simplement exclu tout le reste, sauf le dossier et le fichier .jar. entrez la description de l'image ici

Cela marche!

Yanir Calisar
la source
1

En plus de client_max_body_size, j'ai dû ajouter client_body_buffer_size . Voici le fichier de configuration dot qui a fonctionné, pour une pièce jointe de 2 Mo:

fichiers: "/etc/nginx/conf.d/proxy.conf":
mode: "000755"
propriétaire:
groupe racine
: contenu racine : |
proxy_buffering activé;
proxy_buffer_size 128k;
proxy_buffers 8 256k;
client_body_buffer_size 2M;
proxy_busy_buffers_size 256k;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
client_max_body_size 3M;

Norme
la source
0

Pour la plateforme Java

Pour créer le fichier proxy de configuration NGINX, vous devez simplement ajouter

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

avec le contenu client_max_body_size 20M;en elle.

"proxy.conf" sera déployé dans "/etc/nginx/conf.d/proxy.conf" et automatiquement inclus par la configuration NGINX.

Lyudmyla
la source
0

Si vous exécutez EC2 et installez vous-même nginx, la meilleure solution consiste à créer un nouveau fichier dans

/etc/nginx/conf.d

dossier:

sudo nano /etc/nginx/conf.d/proxy.conf

puis ajoutez-y la ligne suivante:

client_max_body_size 20M;

puis enregistrez et redémarrez nginx:

sudo systemctl restart nginx
Aerodynamika
la source
C'est une solution, mais dans le cas où Elastic Beanstalk crée de nouvelles instances, vous devez donner cette configuration dans chaque instance. Et ce n'est pratiquement pas possible car nous devons constamment surveiller les intances EC2 et le processus de redémarrage de nginx n'est pas bon à chaque fois
Jijo Cleetus