Erhöhen von client_max_body_size in Nginx conf auf AWS Elastic Beanstalk

121

Ich laufe in „413 anfordern Wesen zu groß“ Fehler , wenn Dateien , die größer als 10 MB auf unsere API läuft auf AWS Elastic Beanstalk veröffentlichen.

Ich habe ziemlich viel recherchiert und glaube, dass ich die client_max_body_size für Nginx erhöhen muss , aber ich kann anscheinend keine Dokumentation dazu finden, wie dies mit Elastic Beanstalk gemacht wird. Ich vermute, dass es mit einer Ebetension-Datei geändert werden muss.

Hat jemand Gedanken darüber, wie ich das Limit erhöhen kann? 10 MB sind ziemlich schwach, es muss eine Möglichkeit geben, dies manuell zu erhöhen.

Nick Parsons
quelle
1
Die Standardeinstellung ist heutzutage nur 1
MB
Alle bereitgestellten Lösungen befassen sich nicht mit .NET-Bereitstellungen. Wenn Sie .NET in AWS Elastic Beanstalk verwenden, müssen Sie die IIS-Einstellungen in Ihrem Projekt konfigurieren. Für mich musste ich die web.config in meiner net471 App konfigurieren.
SimonH

Antworten:

223

Hierfür können Sie zwei Methoden anwenden. Leider funktionieren einige für einige EB-Anwendungstypen und einige für andere.

Unterstützt / empfohlen in der AWS-Dokumentation

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) verfügt Elasticbeanstalk über ein integriertes Verständnis für die Konfiguration von Nginx.

Fügen Sie.ebextensions/nginx/conf.d/ zum Erweitern der Standard- Nginx-Konfiguration von Elastic Beanstalk .conf-Konfigurationsdateien zu einem Ordner hinzu, der in Ihrem Anwendungsquellpaket angegeben ist . 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

Reverse Proxy konfigurieren - Java SE

Um die maximale Upload-Größe speziell zu erhöhen, erstellen Sie eine Datei, .ebextensions/nginx/conf.d/proxy.confindem Sie die maximale Körpergröße auf die gewünschte Größe einstellen:

client_max_body_size 50M;

Erstellen Sie die Nginx-Konfigurationsdatei direkt

Nach vielen Recherchen und stundenlanger Arbeit mit dem wunderbaren AWS-Support-Team habe ich eine Konfigurationsdatei erstellt .ebextensions, die die Nginx-Konfiguration ergänzt. Diese Änderung ermöglichte eine größere Körpergröße des Pfostens.

Innerhalb des .ebextensionsVerzeichnisses habe ich eine Datei 01_files.configmit dem folgenden 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 einfach den einen Liner, client_max_body_size 20M;der den Trick ausführt .

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

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

http://wiki.nginx.org/Configuration

Hoffe das hilft anderen!

Nick Parsons
quelle
2
Das Dateiformat ist unter docs.aws.amazon.com/elasticbeanstalk/latest/dg/… dokumentiert . Der Fortschritt wird unter /var/log/cfn-init.log protokolliert. In den Protokollen sollten Sie so etwas sehen 2014-xx-xx xx:xx:xx,xxx [DEBUG] Writing content to /etc/nginx/conf.d/proxy.conf. Ich bin mir nicht sicher, aber es schien notwendig, den Server neu zu starten.
h-kippo
2
Ich arbeite mit Puma für mich. Musste den Dienst neu starten, wie @Will sagte (sudo service nginx reload).
Dennis
1
Hoffentlich kann dies jemand anderem helfen, da ich eine Weile gebraucht habe
alexs
1
Bestätigte Arbeit, stellen Sie sicher, dass .ebextensionsnicht in .ebignoreund .gitignore🖖 Ich musste den Nginx-Dienst nicht neu starten, eb deployund es hat funktioniert worked
GabLeRoux
4
Für den Knoten js hat die zweite Methode (files :) für mich funktioniert. Der erste hat nicht funktioniert. Sogar der AWS-Support empfahl, die zweite Methode für den Knoten js docs.aws.amazon.com/elasticbeanstalk/latest/dg/… zu verwenden
Kapil
33
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 geändert (und die Syntax war falsch, siehe zwei "Eigentümer:" -Einträge in der YAML), Leute, bitte setzen Sie keine 777-Berechtigungen für ALLES. Es sei denn, Sie genießen es, gehackt zu werden, und setzen den Eigentümer von Nginx-Konfigurationsdateien auf root.

Lesen Sie auch die folgende Antwort , damit Nginx diese Änderung nach der Bereitstellung übernimmt.

user3217794
quelle
22

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

Dazu ssh zur Instanz und mach

sudo service nginx reload

Weitere Informationen zum Neuladen finden Sie unter http://nginx.org/en/docs/beginners_guide.html .

In einer früheren Version von Elastic Beanstalk konnte ich einen container_command hinzufügen, um dies zu erreichen, aber jetzt stelle ich wie @cdmckay fest, dass dies einen Bereitstellungsfehler verursacht. Wenn Sie Ihre Umgebung neu erstellen, werden die Einstellungen für client_max_body_size sowie die Anweisungen in Ihrer Konfigurationsdatei übernommen.

Wille
quelle
Ist das notwendig? Wenn Sie dies nicht hinzufügen, wie wird es neu gestartet?
CDMckay
Nach meiner Erfahrung fand ich dies notwendig.
Will
@cdmckay Können Sie mehr über die Instanzprobleme sagen, die durch den Befehl reload verursacht wurden?
Will
Ich habe es mir nicht genau angesehen, aber es hat meinen Server im Grunde daran gehindert, zu starten, bis ich ihn entfernt habe. Es scheint nicht notwendig zu sein.
CDMckay
3
Nach meiner Erfahrung war dies notwendig. Ich musste jedoch eine Überprüfung hinzufügen, um festzustellen, ob nginx ausgeführt wurde, bevor ich versuchte, es für neue Instanzen neu zu starten - 'pgrep nginx && service nginx reload || true '
alexs
16

Die akzeptierte Antwort hat bei mir nicht funktioniert, da ich eine JVM-basierte App habe und die NGINX-Konfiguration anscheinend anders funktioniert. Ich würde sehen, dass eine proxy.conf-Datei während der Bereitstellung erstellt, aber später gelöscht wird, bevor die Bereitstellung abgeschlossen wurde. In der AWS-Dokumentation wird erläutert, wie Sie den Proxy konfigurieren :

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

Raymond26
quelle
2
Leider hat das bei mir nicht funktioniert (Single-Container Docker ELB) - auch nicht nach einem Neustart der Instanz. Wenn Sie sich über SSH bei der Instanz anmelden, wird in/etc/nginx/conf.d/
Udo G
Ich gehe davon aus, dass es an der Tatsache liegt, dass Sie eine Docker-ELB verwenden und dass nginx conf anders funktioniert. Meine Antwort ist für Java-voreingestellte ELB.
Raymond26
Ich benutze Elb und Java App. Funktioniert bei mir! Vielen Dank!
Dimitar Vukman
Wie können Sie sehen, dass die Datei proxy.conf erstellt wird, wenn Sie nur ihre vorübergehende Anwesenheit bemerken?
Rogerdpack
9

Nach der akzeptierten Antwort müssen Sie möglicherweise die nginx-Konfigurationsdatei neu 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.

Dies zusammen mit der akzeptierten Antwort löste das gleiche Problem für mich. (Schienen, Puma, NGINX)

ConorB
quelle
7

Das einzige, was für mich funktioniert hat, war, eine ".config" -Datei in .ebextensions wie folgt zu erstellen:

.ebextensions/
           proxy.config

mit nur diesem Inhalt in der .config-Datei:

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

Keine Notwendigkeit für Unterordner, keine Notwendigkeit, den Anwendungsserver neu zu starten. Achten Sie darauf, dass es sich bei ".config" nicht um eine ".conf" -Datei in .ebextensions handelt. Verwenden Sie die richtigen Einrückungen, um Fehler in der aws-Konsole zu vermeiden. Der Rest ist der gleiche spielt keine Rolle für den Namen der Datei,

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

Ed Vieira
quelle
4

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

Ich habe eine Datei erstellt, die nginx.confunter dem Verzeichnis aufgerufen wird.ebextensions/nginx/

Ich habe eine SSH-Verbindung zu einer laufenden Instanz meiner Beanstalk-App hergestellt und den Inhalt der nginx.confDatei mithilfe cat /etc/nginx/nginx.confdes Terminals kopiert und kopiert .

Ich habe den Inhalt in die nginx.confDatei eingefügt, in der ich zuvor erstellt habe .ebextensions/nginx/, und die http-Direktive so geändert, dass sie enthält client_max_body_size 50M;. Ich habe meine App endlich neu bereitgestellt eb deployund es hat funktioniert. Während der Bereitstellung sollte die folgende Meldung angezeigt werden:

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

Dies sind die Inhalte meiner .ebextensions/nginx/nginx.confDatei:

# 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 Teil der .zip-Datei sind, die während der Bereitstellung erstellt und auf Beanstalk hochgeladen wurde (sie wird in .gitignoreoder .ebignorewenn Sie sie verwenden, nicht ignoriert ).

kskyriacou
quelle
Danke dafür! Ich habe mich gefragt, welche Plattform Sie verwenden? Aus irgendeinem Grund erkennt Beanstalk meine Datei ".ebextensions / nginx / nginx.conf" nicht, obwohl sie sich in der Zip-Datei und im Git-Repo befindet.
Icid
Upvoted für die Notiz. Ich ignorierte das, .ebextensionswas dazu führte, dass die akzeptierte und beliebte Antwort fehlschlug. Ich habe nicht alles andere ausprobiert, was Sie erwähnt haben, aber danke für den Hinweis Gab
GabLeRoux
4

Ich habe alle .ebextensionsMethoden zum Hinzufügen von Konfigurationen auf Implementierungsebene ausprobiert und es hat mir im neuesten Amazon Linux AMI nicht geholfen. Ich habe viel recherchiert und nachdem ich die Protokolle durchgesehen habe, kann ich feststellen, dass der Runner der Bereitstellungsaufgabe .platformjedes Mal nach einem Ordner mit dem Namen sucht, und ich dachte daran, einen Ordner wie die .ebextensions hinzuzufügen. Unten finden Sie die Einstellungen, die ich in meinem Stammordner meines Projekts vorgenommen habe.

Fügen Sie das folgende Ordner-Setup in der Stammebene Ihres Projektordners hinzu.

Ordnerstruktur (.platform / nginx / conf.d / proxy.conf)

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

Inhalt von Datei 1 - proxy.conf ( Innenordner.platform/nginx/conf.d/ )

client_max_body_size 50M;

Inhalt der Datei 2 - 00_myconf.config (Innerhalb des .platform/Ordners)

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

Sorgfältig mit den Verlängerungen umgehen. Die erste Datei ist .conf und die zweite Datei ist .config .

Stellen Sie Ihr Projekt nun erneut auf Amazon Elastic Beanstalk bereit und Sie werden die Magie sehen. Diese Konfiguration wird allen Ihren EC2-Instanzen hinzugefügt, die im Rahmen der automatischen Skalierung erstellt wurden.

Detaillierte Ordnerstruktur unten.

Geben Sie hier die Bildbeschreibung ein

Jijo Cleetus
quelle
2
Mann!!!!!!!! Ich danke dir sehr. Dies ist die einzige Möglichkeit, die Nginx-Konfiguration unter AWS EB Amazon Linux festzulegen. Ich habe einen ganzen Tag damit verbracht, jede verfügbare Lösung auszuprobieren !!! Ich kann nicht ausdrücken, wie ich Ihnen dafür danken soll, dass Sie sich die Zeit genommen haben, diese Antwort im Detail zu schreiben. Gesundheit. Wenn Sie eine Art Patreon- oder Buymeacoffee-Konto haben, tragen Sie dazu bei. @jijo Cleetus
InfinitePrime
2
Vielen Dank. Ich habe auch alle möglichen Ansätze ausprobiert .ebextensionsund nur dieser Ansatz hat funktioniert.
ArunDhaJ
Ersparte mir Tonnen von Versuchen und Misserfolgen, damit dies funktioniert. Ich kann dir nicht genug danken!
Jalal El-Shaer
3

Dies ist die von AWS bereitgestellte Lösung und funktioniert (passen Sie die Größe an Ihre Bedürfnisse an).

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
quelle
2

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

David Smits
quelle
Apache hat eine eigene LimitRequestBody-Direktive, um die maximale Größe der hochgeladenen Dateien festzulegen.
Tom Harvey
@TomHarvey Wenn verfügbar, würden Sie bitte ein vollständiges Beispiel für den Anwendungsfall mit bereitstellen LimitRequestBody?
Hasan
1

Für Golang ohne Docker habe ich diese Anweisungen aus aws doc befolgt:

Reverse Proxy konfigurieren

Wenn Sie zusätzlich zu den Anweisungen im http-Block nginx.conf Anweisungen einfügen möchten, können Sie auch zusätzliche Konfigurationsdateien im .ebextensions/nginx/conf.d/Verzeichnis Ihres Quellpakets 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.confim .ebextensions/nginx/conf.d/Stammverzeichnis meines Projekts mit nur einer Zeile erstellt:

client_max_body_size 20M;

Wenn es immer noch nicht funktioniert, stellen Sie sicher, dass .ebextensionsOrdner und Unterordner in Ihrer Bereitstellungs-Zip enthalten sind. Nginx muss nicht manuell neu gestartet werden.

Pascal
quelle
1

Ich hatte mit dem gleichen Problem zu kämpfen, konnte es aber nicht lösen, schließlich funktionierte es.

Hier ist meine Congfig-Datei.

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"

Das Problem war,

Ich habe beim Erstellen des Builds ein Python-Skript für die Code-Pipeline verwendet, das den Ordner .ebextensions nicht enthält.

Hier sind meine paar Cent,

  1. Stellen Sie sicher, dass Ihr .ebextensions-Ordner im Zip-Ordner Ihres Builds enthalten ist, der sich in s3bucket Ihres aws-Kontos befindet
  2. Stellen Sie sicher, dass es nicht in der .gitignore-Datei enthalten ist
  3. Wenn Sie ein Skript zum Generieren des Builds verwenden, stellen Sie sicher, dass es .ebextensions enthält
Harshal Jadhav
quelle
1

Nachdem ich drei lange Tage lang versucht hatte, dieses Problem zu lösen, rief ich das erstaunliche AWS-Support-Team an und sie gaben mir einige Hinweise, wie ich es lösen könnte. Erstens ist mein Projekt in JAVA und ich verwende Maven und Spring Boot, um es durch Elastic Beanstalk (EBS) auszuführen.

  1. Wie in der AWS-Dokumentation erläutert , müssen die benutzerdefinierten Nginx-Einstellungen in der Stammebene Ihres Projekts gespeichert sein. Dazu habe ich eine client_max_body_size.conf-Datei erstellt und in den folgenden Pfad eingefügt : myprojectname /src/main/resources/ebextensions/nginx/conf.d/client_max_body_size.conf Diese Datei enthält nur die folgende Zeile:

    client_max_body_size 10M;
    
  2. Konfigurieren Sie maven so, dass diese Datei während des Builds im Stammordner meines Projekts hinzugefügt wird. Dies war etwas schwierig, ich musste die folgende Konfiguration ( Quelle ) in meine POM.xml einfügen:

    <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. Sie können Ihr Projekt jetzt bereits lokal erstellen und den folgenden SSH-Befehl ausführen, um zu überprüfen, ob es sich tatsächlich im Stammverzeichnis Ihres Projekts befindet:

    jar tf main-1.0-SNAPSHOT.jar | grep .ebextensions
    
  4. Jetzt ist es der schwierige Teil. Wenn Sie es auf EBS hochladen, sollte Ihre Datei nur die Datei SNAPSHOT.jar und den Ordner .ebextensions enthalten. Wenn Sie jetzt beispielsweise die JAR-Datei und den Ordner komprimieren und manuell hochladen, funktioniert dies!

  5. Da ich Jenkins für meine Bereitstellung und insbesondere das AWS EBS Deployment Plugin verwende , müssen Sie die Einstellungen der Dateien / Ordner ändern, die Sie in die Bereitstellung aufnehmen. Aus irgendeinem Grund konnte ich den Ordner .ebextensions nicht einschließen, sodass ich nur alles andere außer dem Ordner und der JAR-Datei ausschloss. Geben Sie hier die Bildbeschreibung ein

Das funktioniert!

Yanir Calisar
quelle
0

Für Java Platform

Um die NGINX-Konfigurations-Proxy-Datei zu erstellen, müssen Sie nur hinzufügen

.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" bereitgestellt und automatisch von der NGINX-Konfiguration aufgenommen.

Lyudmyla
quelle
0

Wenn Sie EC2 ausführen und nginx selbst installiert haben, ist es am besten, eine neue Datei in zu erstellen

/etc/nginx/conf.d

Ordner:

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

und fügen Sie dort die folgende Zeile hinzu:

client_max_body_size 20M;

Speichern Sie dann nginx und starten Sie es neu:

sudo systemctl restart nginx
Aerodynamika
quelle
Dies ist eine Problemumgehung, aber falls Elastic Beanstalk neue Instanzen erstellt, müssen Sie diese Konfiguration in jeder Instanz angeben. Und es ist praktisch nicht möglich, da wir die EC2-Intances ständig überwachen müssen und der Nginx-Neustart nicht immer gut ist
Jijo Cleetus
0

Zusätzlich zu client_max_body_size musste ich client_body_buffer_size hinzufügen . Hier ist die Punktkonfigurationsdatei, die für einen 2-MB-Anhang funktioniert hat:

Dateien: "/etc/nginx/conf.d/proxy.conf":
Modus: "000755"
Eigentümer:
Stammgruppe: Stamminhalt
: |
proxy_buffering on;
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;

Norm
quelle