web-dev-qa-db-fra.com

Augmentation de client_max_body_size dans Nginx conf sur AWS Elastic Beanstalk

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.

92
Nick Parsons

Vous pouvez utiliser deux méthodes pour cela:

Prise en charge/recommandée 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 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

Configuration du proxy inverse - Java SE

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;

Créez le fichier de configuration Nginx directement

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!

187
Nick Parsons
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.

31
user3217794

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.

20
Will

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;

14
Raymond26

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)

7
ConorB

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).

3
kskyriacou

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”.

2
David Smits

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/

1
felipe

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. 

1
pascal

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.

0
Lyudmyla