it-swarm.com.de

Erhöhung der client_max_body_size in Nginx conf auf AWS Elastic Beanstalk

Ich renne in die Fehler "413 Request Entity Too Large", wenn Sie Dateien mit einer Größe von mehr als 10 MB an unsere API senden, die auf AWS Elastic Beanstalk ausgeführt wird.

Ich habe einige Nachforschungen angestellt und glaube, dass ich die client_max_body_size für Nginx aufrüsten muss, jedoch finde ich keine Dokumentation, wie dies mit Elastic Beanstalk geschieht. Meine Vermutung ist, dass es mit einer Ebetension-Datei geändert werden muss.

Hat jemand eine Idee, wie ich das Limit erreichen kann? 10 MB sind ziemlich schwach, es muss eine Möglichkeit geben, diese manuell aufzurüsten.

92
Nick Parsons

Dafür gibt es zwei Methoden:

In der AWS-Dokumentation unterstützt/empfohlen

Für einige Anwendungstypen wie Java SE , Go , Node.js und möglicherweise Ruby (dies ist nicht für Ruby dokumentiert, aber alle anderen Nginx-Plattformen scheinen dies zu unterstützen), Elasticbeanstalk verfügt über ein integriertes Verständnis für die Konfiguration von Nginx.

Um die Standard-Nginx-Konfiguration von Elastic Beanstalk zu erweitern, fügen Sie .conf-Konfigurationsdateien zu einem Ordner mit dem Namen .ebextensions/nginx/conf.d/ in Ihrem Anwendungsquellenpaket hinzu. Die Nginx-Konfiguration von Elastic Beanstalk enthält automatisch .conf-Dateien in diesem Ordner.

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

Konfiguration des Reverse Proxy - Java SE

Um die maximale Uploadgröße gezielt zu erhöhen, erstellen Sie eine Datei unter .ebextensions/nginx/conf.d/proxy.conf, und legen Sie die maximale Körpergröße auf die gewünschte Größe fest:

client_max_body_size 50M;

Erstellen Sie die Nginx-Konfigurationsdatei direkt

Nach langem Suchen und stundenlangem Arbeiten mit dem wundervollen AWS-Support-Team erstellte ich eine Konfigurationsdatei in .ebextensions, um die nginx-Konfiguration zu ändern. Diese Änderung ermöglichte eine größere Nachkörpergröße.

Im .ebextensions-Verzeichnis habe ich eine Datei mit dem Namen 01_files.config mit folgendem Inhalt erstellt:

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

Dadurch wird eine proxy.conf -Datei im Verzeichnis /etc/nginx/conf.d generiert. Die Datei proxy.conf enthält lediglich den einen Code client_max_body_size 20M;, der den Trick ausführt.

Beachten Sie, dass diese Datei für einige Plattformen während der Bereitstellung erstellt, jedoch in einer späteren Bereitstellungsphase entfernt wird.

Sie können andere Anweisungen angeben, die in der Nginx-Dokumentation beschrieben werden.

http://wiki.nginx.org/Configuration

Hoffe das hilft anderen!

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

Die obige Antwort wurde aus Sicherheitsgründen modifiziert (und die Syntax war falsch, siehe zwei Einträge für "owner:" in der YAML). Sofern Sie nicht gerne gehackt werden und den Besitzer der Nginx-Konfigurationsdateien auf root setzen.

Siehe auch unter Antwort , damit Nginx diese Änderung nach der Bereitstellung übernimmt.

31
user3217794

BEARBEITEN: Nachdem Sie einen Build mit den Anweisungen in der akzeptierten Antwort von Nick Parsons bereitgestellt haben, müssen Sie möglicherweise den Nginx-Server neu starten, um die Änderungen zu übernehmen.

Um dies zu tun, ssh zur Instanz und tun

Sudo service nginx reload

Weitere Informationen zum Nachladen finden Sie unter http://nginx.org/de/docs/beginners_guide.html .

In einer früheren Version von Elastic Beanstalk konnte ich einen container_command hinzufügen, um dies zu erreichen. Jetzt stelle ich jedoch fest, dass @cdmckay einen Deployment-Fehler verursacht. Wenn Sie Ihre Umgebung neu erstellen, werden die Einstellungen für client_max_body_size übernommen, solange sich diese Anweisung in Ihrer Konfigurationsdatei befindet.

20
Will

Die akzeptierte Antwort funktionierte nicht für mich, da ich eine JVM-basierte App habe und die Konfiguration von NGINX anscheinend anders ist. Ich würde eine proxy.conf-Datei sehen, die während der Bereitstellung erstellt wurde, aber später gelöscht wurde, bevor die Bereitstellung abgeschlossen war. In der AWS-Dokumentation wird erläutert, wie der Proxy konfiguriert wird :

Erstellen Sie eine .ebextensions/nginx/conf.d/proxy.conf-Datei, die nur die Zeile enthält: client_max_body_size 40M;

14
Raymond26

Nach der akzeptierten Antwort müssen Sie möglicherweise die Nginx-Konfigurationsdatei erneut laden. 

Fügen Sie dazu den folgenden Befehl hinzu

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

Dies ist eine bessere Vorgehensweise, als in Ihre EB-Instanz zu ssh'en und dies manuell mit einem Befehl auszuführen.

In Kombination mit der akzeptierten Antwort wurde das gleiche Problem für mich gelöst. (Schienen, Puma, NGINX)

7
ConorB

Die akzeptierte Antwort hat bei mir nicht funktioniert, daher habe ich die Nginx-Konfiguration mit meiner eigenen überschrieben.

Ich habe eine Datei namens nginx.conf im Verzeichnis .ebextensions/nginx/ erstellt.

Ich habe mich in eine laufende Instanz meiner Beanstalk-App eingebunden und den Inhalt der nginx.conf-Datei mit cat /etc/nginx/nginx.conf kopiert und vom Terminal kopiert.

Ich habe den Inhalt in die nginx.conf-Datei eingefügt, die ich zuvor in .ebextensions/nginx/ erstellt habe, und die http-Direktive so geändert, dass sie client_max_body_size 50M; enthält. Ich habe meine App schließlich mit eb deploy neu bereitgestellt und es hat funktioniert. Sie sollten während der Bereitstellung die folgende Meldung erhalten:

INFO: Nginx-Konfiguration in '.ebextensions/nginx' .__ erkannt. Verzeichnis. AWS Elastic Beanstalk verwaltet das Nginx nicht mehr Konfiguration für diese Umgebung.

Dies sind die Inhalte meiner .ebextensions/nginx/nginx.conf-Datei:

# 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;
}

Ich musste weder den nginx-Dienst noch die Umgebung neu starten.

Hinweis : Stellen Sie sicher, dass Ihre .ebextensions-Komponente Teil der .Zip-Datei ist, die während der Bereitstellung in Beanstalk erstellt und hochgeladen wurde (wird in .gitignore oder .ebignore nicht ignoriert, wenn Sie sie verwenden).

3
kskyriacou

Alternativ können Sie den Proxyserver in Apache ändern. __ Gehen Sie dazu zur Konfiguration und bearbeiten Sie die Softwarekonfiguration. Die erste Option hier ist "Proxy-Server", wählen Sie "Apache".

2
David Smits

Das einzige, was für mich funktioniert hat, war das Erstellen einer ".config" -Datei in .ebextensions wie folgt:

.ebextensions/proxy.config

nur dieser Inhalt in der .config:

files:
  "/etc/nginx/conf.d/proxy.conf":
     content: |
       client_max_body_size 50M;

keine Notwendigkeit für Unterordner, kein Neustart des Anwendungsservers. Achten Sie darauf, dass es sich um eine ".config" - und keine ".conf" -Datei innerhalb von .ebextensions handelt. Der Rest ist der gleiche, um Fehler in der aws-Konsole zu vermeiden spielt keine Rolle, wie die Datei heißt,

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

1
felipe

Für Golang ohne Docker folgte ich diesen Anweisungen von aws doc:

Reverse Proxy konfigurieren

Wenn Sie Direktiven zusätzlich zu denen im http-Block nginx.conf einfügen möchten, können Sie im .ebextensions/nginx/conf.d/-Verzeichnis Ihres Quellpakets auch zusätzliche Konfigurationsdateien bereitstellen. Alle Dateien in diesem Verzeichnis müssen die Erweiterung .conf haben http://docs.aws.Amazon.com/elasticbeanstalk/latest/dg/go-environment.html#go-complex-apps

Ich habe die Datei proxy.conf in .ebextensions/nginx/conf.d/ in der Wurzel meines Projekts erstellt, mit nur einer Zeile:

client_max_body_size 20M;

Wenn es immer noch nicht funktioniert, stellen Sie sicher, dass der .ebextensions-Ordner und die Unterordner in Ihrer Implementierungs-Zip enthalten sind. Sie müssen Nginx nicht manuell neu starten. 

1
pascal

Für Java-Plattform

Um die NGINX-Konfigurations-Proxy-Datei zu erstellen, fügen Sie sie einfach hinzu

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

mit dem Inhalt client_max_body_size 20M; darin. 

"proxy.conf" wird in "/etc/nginx/conf.d/proxy.conf" implementiert und automatisch in die NGINX-Konfiguration eingefügt.

0
Lyudmyla