AWS Elastic Beanstalk'ta Nginx yapılandırmasında client_max_body_size artırılıyor


123

İçine çalıştırıyorum "413 Talep Çok Büyük" AWS Elastik Beanstalk üzerinde çalışan API'mıza 10MB daha büyük dosyaları gönderirken hataları.

Oldukça fazla araştırma yaptım ve Nginx için client_max_body_size'yi yükseltmem gerektiğine inanıyorum , ancak Elastic Beanstalk kullanarak bunu nasıl yapacağıma dair herhangi bir belge bulamıyorum. Tahminimce bir ebetension dosyası kullanılarak değiştirilmesi gerekiyor.

Limiti nasıl yükseltebileceğime dair düşüncesi olan var mı? 10MB oldukça zayıf, bunu manuel olarak yükseltmenin bir yolu olmalı.


1
Varsayılan değer bugünlerde sadece 1MB ...
rogerdpack

Kayıt için, sağlanan tüm çözümler .NET dağıtımlarının üstesinden gelmez. AWS Elastic Beanstalk'ta .NET kullanıyorsanız, projenizdeki IIS ayarlarını yapılandırmanız gerekir. Benim için net471 uygulamamdaki web.config'i yapılandırmam gerekiyordu.
SimonH

Yanıtlar:


223

Bunun için alabileceğiniz iki yöntem var. Ne yazık ki bazıları bazı EB uygulama türleri için çalışırken bazıları diğerleri için çalışır.

AWS belgelerinde desteklenir / önerilir

Java SE , Go , Node.js ve belki Ruby gibi bazı uygulama türleri için (Ruby için belgelenmemiştir, ancak diğer tüm Nginx platformları bunu desteklemektedir), Elasticbeanstalk, Nginx'in nasıl yapılandırılacağına dair yerleşik bir anlayışa sahiptir.

Elastic Beanstalk'ın varsayılan nginx yapılandırmasını genişletmek için, .conf yapılandırma dosyalarını .ebextensions/nginx/conf.d/uygulama kaynak paketinizde adı verilen bir klasöre ekleyin . Elastic Beanstalk'ın nginx yapılandırması, bu klasörde otomatik olarak .conf dosyalarını içerir.

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

Ters Proxy'yi Yapılandırma - Java SE

Maksimum yükleme boyutunu özellikle artırmak için .ebextensions/nginx/conf.d/proxy.conf, maksimum gövde boyutunu tercih ettiğiniz boyuta ayarlayarak bir dosya oluşturun :

client_max_body_size 50M;

Nginx yapılandırma dosyasını doğrudan oluşturun

Harika AWS destek ekibiyle çok fazla araştırma yaptıktan ve saatlerce çalıştıktan sonra .ebextensions, nginx yapılandırmasını tamamlamak için içinde bir yapılandırma dosyası oluşturdum . Bu değişikliğe daha büyük bir post gövde boyutu için izin verildi.

İçerisi .ebextensionsdizin adında bir dosya oluşturdum 01_files.configaşağıdaki içeriği ile:

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

Bu, /etc/nginx/conf.d dizininin içinde bir proxy.conf dosyası oluşturur. Proxy.conf dosyası basitçe client_max_body_size 20M;hile yapan bir satır içerir .

Bazı platformlar için bu dosyanın dağıtım sırasında oluşturulacağını, ancak daha sonraki bir dağıtım aşamasında kaldırılacağını unutmayın.

Nginx belgelerinde ana hatları verilen diğer yönergeleri belirtebilirsiniz.

http://wiki.nginx.org/Configuration

Umarım bu başkalarına yardımcı olur!


2
Dosya biçimi docs.aws.amazon.com/elasticbeanstalk/latest/dg/… adresinde belgelenmiştir . İlerleme, /var/log/cfn-init.log adresinde kaydedilir. Günlüklerde buna benzer bir şey görmelisiniz 2014-xx-xx xx:xx:xx,xxx [DEBUG] Writing content to /etc/nginx/conf.d/proxy.conf. Emin değilim, ancak sunucuyu yeniden başlatmak gerekli olabilir gibi görünüyordu.
h-kippo

2
Benim için puma ile çalışıyor. @Will'in söylediği gibi servisi yeniden başlatmak zorunda kaldım (sudo service nginx reload).
Dennis

1
Umarım bu biraz zaman aldığından başka birine yardımcı olabilir ... girinti önemlidir - YAML şartnamesine uymak zorundadır - docs.saltstack.com/en/latest/topics/yaml
alexs

1
Çalışmayı doğruladım .ebextensions, içinde olmadığından emin olun .ebignoreve .gitignore🖖 nginx hizmetini yeniden başlatmam gerekmedi eb deployve işe yaradı 🎉
GabLeRoux

4
Düğüm js için, ikinci yöntem (dosyalar :) benim için çalıştı. İlki işe yaramadı. AWS desteği bile 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;

Güvenlik uğruna yukarıdaki cevabı değiştirdik (ve sözdizimi yanlıştı, bakın, YAML'deki iki 'sahip:' girişi), çocuklar, lütfen HERHANGİ BİR ŞEY üzerinde 777 izin ayarlamayın. Saldırıya uğramaktan hoşlanmıyorsanız ve Nginx yapılandırma dosyalarının sahibini root olarak ayarlamıyorsanız.

Ayrıca, nginx'in dağıtımdan sonra bu değişikliği almasını sağlamak için aşağıdaki yanıta bakın .


22

DÜZENLEME: Nick Parsons tarafından kabul edilen cevaptaki talimatlarla bir yapı kurduktan sonra, değişiklikleri almak için nginx sunucusunu yeniden başlatmanız gerekebilir.

Bunu yapmak için örneğe ssh yapın ve

sudo service nginx reload

Yeniden yükleme hakkında daha fazla bilgi edinmek için bkz. Http://nginx.org/en/docs/beginners_guide.html .

Elastic Beanstalk'ın önceki bir sürümünde, bunu başarmak için bir container_command ekleyebildim, ancak şimdi @cdmckay gibi bunun bir dağıtım hatasına neden olduğunu görüyorum. Ortamınızı yeniden oluşturursanız, bu talimat yapılandırma dosyanızda olduğu sürece client_max_body_size ayarlarını alır.


Bu gerekli mi? Bunu eklemezseniz, nasıl yeniden başlayacak?
cdmckay

Deneyimlerime göre bunu gerekli buldum.
Will

@cdmckay yeniden yükleme komutunun neden olduğu örnek sorunları hakkında daha fazla bilgi verebilir misiniz?
Will

Çok yakından bakmadım, ancak temelde sunucumun ben onu kaldırana kadar başlatılmasını engelledi. Gerekli görünmüyor.
cdmckay

3
Deneyimlerime göre bunun gerekli olduğunu anladım, ancak yeni örnekler için yeniden başlatmaya çalışmadan önce nginx'in çalışıp çalışmadığını kontrol etmek için bir kontrol eklemem gerekiyordu - 'pgrep nginx && service nginx reload || doğru '
alexs

16

Kabul edilen yanıt benim için işe yaramadı çünkü JVM tabanlı bir uygulamam var ve NGINX yapılandırmasını farklı yapıyor gibi görünüyor. Dağıtım sırasında bir proxy.conf dosyasının oluşturulduğunu ancak daha sonra dağıtım tamamlanmadan önce silindiğini görürdüm. AWS belgeleri , proxy'nin nasıl yapılandırılacağını açıklar :

.ebextensions/nginx/conf.d/proxy.confYalnızca şu satırı içeren bir dosya oluşturun :client_max_body_size 40M;


2
Ne yazık ki bu benim için işe yaramadı (tek kapsayıcılı Docker ELB) - örneğin yeniden başlatıldıktan sonra bile. Örnekte SSH aracılığıyla oturum açmak, içinde oluşturulan proxy.conf dosyası yok/etc/nginx/conf.d/
Udo G

Bunun bir Docker ELB kullanıyor olmanızdan ve nginx yapılandırmasını farklı şekilde yaptığından dolayı olduğunu varsayıyorum. Cevabım Java için önceden ayarlanmış ELB için.
Raymond26

Elb ve java uygulamasını kullanıyorum. Benim için çalışıyor! Teşekkürler!
Dimitar Vukman

Oluşturulan proxy.conf dosyasını geçici olarak varlığına dikkat ederek nasıl görebilirsiniz?
rogerdpack

9

Kabul edilen cevabın ardından, nginx yapılandırma dosyasını yeniden yüklemeniz gerekebilir.

Bunu yapmak için aşağıdaki komutu ekleyin

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

Bu, eb örneğinize ssh'lamaktan ve bunu bir komutla manuel olarak yapmaktan daha iyi bir uygulama olacaktır.

Bu kabul edilen cevapla birleştirildiğinde benim için aynı sorunu çözdü. (Raylar, Puma, NGINX)


7

Benim için işe yarayan tek şey .ebextensions içinde şöyle bir ".config" dosyası oluşturmaktı:

.ebextensions/
           proxy.config

.config dosyasında yalnızca bu içerikle:

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

alt klasörlere gerek yok, uygulama sunucusunu yeniden başlatmaya gerek yok, .ebextensions içinde bir ".config" dosyası olmamasına ve aws konsolunda hataları önlemek için uygun girintinin kullanılmasına dikkat edin geri kalanı aynı dosyanın adı önemli değil,

teşekkürler: http://kroltech.com/2014/09/14/quick-tip-increase-upload-size-in-aws-elastic-beanstalk-node-js-env/


7

.ebextensionsUygulama düzeyi yapılandırması eklemenin tüm yöntemlerini denedim ve en son Amazon Linux AMI'de bana yardımcı olmadı. Çok fazla araştırma yaptım ve günlükleri .platforminceledikten sonra, dağıtım görevi çalıştırıcısının her seferinde çağrılan bir klasörü kontrol ettiğini bulabilirim ve tıpkı .ebextensions gibi bir tane eklemeyi düşündüm. Projemin kök klasöründe yaptığım ayarlar aşağıdadır.

Aşağıdaki klasör kurulumunu proje klasörünüzün kök düzeyine ekleyin.

Klasör yapısı (.platform / nginx / conf.d / proxy.conf)

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

Dosya 1'in İçeriği - proxy.conf ( .platform/nginx/conf.d/Klasörün içinde)

client_max_body_size 50M;

Dosya 2 - 00_myconf.config İçeriği ( .platform/Klasörün içinde)

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

Uzantılara dikkat edin. İlk dosya .conf ve ikinci dosya .config'dir .

Şimdi projenizi Amazon Elastic Beanstalk'a yeniden dağıtın ve sihri göreceksiniz. Bu yapılandırma, otomatik ölçeklendirmenin bir parçası olarak oluşturulan tüm EC2 bulut sunucularınıza eklenecektir.

Aşağıda ayrıntılı klasör yapısı.

görüntü açıklamasını buraya girin


3
Adam!!!!!!!! Çok teşekkür ederim. AWS EB Amazon linux'ta nginx yapılandırmasını ayarlamanın tek yolu budur. Mevcut her çözümü denemek için bütün günü boşa harcadım !!! Bu cevabı ayrıntılı olarak yazmak için zaman ayırdığınız için size nasıl teşekkür edeceğimi ifade edemem. Seni korusun. Bir çeşit patronunuz varsa veya bir meacoffee hesabınız varsa, II katkıda bulunun. @jijo Cleetus
InfinitePrime

2
Çok teşekkürler. Ben de tüm olası yaklaşımları kullanarak denedim .ebextensionsve sadece bu yaklaşım işe yaradı.
ArunDhaJ

1
Bunun işe yaraması için beni tonlarca deneme ve başarısızlıktan kurtardı. Yeterince teşekkür edemem!
Jalal El-Shaer

1
Çok teşekkürler, bu bir Spring Boot uygulaması için de işe yaradı; Elastic Beans Talk ile tomcat çalıştırıyor. Benim hesabımda bir bira iç :).
Awi

5

Kabul edilen cevap benim için işe yaramadı, bunun yerine nginx yapılandırmasını kendimle değiştirdim.

nginx.confDizinin altında adlı bir dosya oluşturdum.ebextensions/nginx/

Beanstalk uygulamamın çalışan bir örneğine SSH yaptım ve terminalden nginx.confkullanarak cat /etc/nginx/nginx.confve kopyalayarak dosyanın içeriğini kopyaladım .

İçeriği nginx.confdaha önce içinde oluşturduğum dosyaya yapıştırdım ve .ebextensions/nginx/http direktifini içerecek şekilde değiştirdim client_max_body_size 50M;. Sonunda uygulamamı kullanarak yeniden konuşlandırdım eb deployve işe yaradı. Dağıtım sırasında aşağıdaki mesajı almalısınız:

BİLGİ: '.ebextensions / nginx' dizininde Nginx yapılandırması algılandı. AWS Elastic Beanstalk artık bu ortam için Nginx yapılandırmasını yönetmeyecektir.

Bunlar dosyamın içeriği .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;
}

Nginx hizmetini veya ortamı yeniden başlatmam gerekmedi.

Not : .ebextensions'ınızın, dağıtım sırasında oluşturulan ve Beanstalk'a yüklenen .zip dosyasının bir parçası olduğundan emin olun (içinde yok sayılmaz .gitignoreveya .ebignorekullanıyorsanız).


Bunun için teşekkürler! Hangi platformu kullandığınızı merak ediyordum. Bazı nedenlerden dolayı Beanstalk, zip dosyasında ve git deposunda olmasına rağmen ".ebextensions / nginx / nginx.conf` dosyamı algılamıyor.
Icid

Not için oy verildi. .ebextensionsKabul edilen ve popüler cevabın başarısız olmasına neden olanı görmezden geliyordum . Bahsettiğiniz her şeyi denemedim ama not için teşekkürler 🍻
GabLeRoux

3

Bu, AWS tarafından sağlanan çözümdür ve işe yarar (boyutu ihtiyaçlarınıza göre ayarlayın)

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

2

Alternatif olarak, proxy sunucusunu Apache olarak değiştirebilirsiniz. Bunu yapmak için, Yapılandırma'ya gidin ve Yazılım Yapılandırmasını Düzenleyin. Buradaki ilk seçenek “Proxy sunucu” dur, “apache” yi seçin.


Apache, karşıya yüklenen dosyaların maksimum boyutunu ayarlamak için kendi LimitRequestBody yönergesine sahiptir.
Tom Harvey

@TomHarvey Varsa, kullanım senaryosu için tam bir örnek verir LimitRequestBodymisiniz?
Hasan

1

Docker'sız Golang için aws doc'tan şu talimatları izledim:

Ters Proxy'yi Yapılandırma

Nginx.conf http bloğuna ek olarak yönergeleri dahil etmek istiyorsanız .ebextensions/nginx/conf.d/, kaynak paketinizin dizininde ek yapılandırma dosyaları da sağlayabilirsiniz . Bu dizindeki tüm dosyalar .conf uzantısına sahip olmalıdır. http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/go-environment.html#go-complex-apps

Ben dosyayı oluştururken proxy.confiçinde .ebextensions/nginx/conf.d/basitçe 1 satır içi ile, projemin kökünde:

client_max_body_size 20M;

Hala çalışmıyorsa .ebextensions, dağıtım zip dosyanıza klasör ve alt klasörlerin dahil edildiğinden emin olun . Nginx'i manuel olarak yeniden başlatmaya gerek yok.


1

Aynı sorunla mücadele ediyordum ama çözemedim, sonunda işe yaradı.

işte benim congfig dosyam,

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"

Sorun şuydu:

Derlemeyi oluştururken .ebextensions klasörünü içermeyen kod ardışık düzeni için bir python betiği kullanıyordum.

İşte benim birkaç sentim

  1. .ebextensions klasörünüzün, yapınızın, aws hesabınızın s3bucket'ında bulunan zip klasörüne dahil edildiğinden emin olun
  2. .gitignore dosyasında olmadığından emin olun
  3. yapıyı oluşturmak için bir komut dosyası kullanıyorsanız, .ebextensions içerdiğinden emin olun

1

Bunu çözmeye çalıştığım 3 uzun günden sonra, harika AWS destek ekibiyle bir görüşmeye atladım ve bana bunu nasıl çözeceğime dair bazı ipuçları verdiler. İlk olarak, projem JAVA'da ve onu Elastic Beanstalk (EBS) ile çalıştırmak için maven ve spring boot kullanıyorum.

  1. AWS'nin belgelerinde açıklandığı gibi, özel nginx ayarlarının projenizin kök düzeyinde depolanması gerekir. Bunu yapmak için bir client_max_body_size.conf dosyası oluşturdum ve aşağıdaki yola yerleştirdim: myprojectname /src/main/resources/ebextensions/nginx/conf.d/client_max_body_size.conf Bu dosya sadece aşağıdaki satırı içerir:

    client_max_body_size 10M;
    
  2. Bu dosyayı derleme sırasında projemin kök klasörüne eklemek için maven'i yapılandırın. Bu biraz zordu, POM.xml dosyama aşağıdaki yapılandırmayı ( kaynak ) eklemem gerekiyordu:

    <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. Artık projenizi zaten yerel olarak oluşturabilir ve aslında projenizin kök dizininde bulunduğunu doğrulamak için aşağıdaki SSH komutunu çalıştırabilirsiniz:

    jar tf main-1.0-SNAPSHOT.jar | grep .ebextensions
    
  4. Şimdi işin zor kısmı. EBS'ye yüklediğinizde, dosyanız yalnızca SNAPSHOT.jar dosyasını ve .ebextensions klasörünü içermelidir. Örneğin, şimdi jar dosyasını ve klasörü sıkıştırıp manuel olarak yüklerseniz çalışacaktır!

  5. Dağıtımım için Jenkins ve özellikle AWS EBS Deployment Plugin'i kullandığım için, dağıtıma dahil ettiğiniz dosyaların / klasörlerin ayarlarını değiştirmeniz gerekir. Şimdi bazı nedenlerden dolayı .ebextensions klasörünü dahil edemedim, bu yüzden klasör ve .jar dosyası dışındaki her şeyi hariç tuttum. görüntü açıklamasını buraya girin

Bu çalışıyor!


1

Client_max_body_size'ye ek olarak client_body_buffer_size eklemek zorunda kaldım . İşte 2 MB'lık bir ek için çalışan nokta yapılandırma dosyası:

dosyalar: "/etc/nginx/conf.d/proxy.conf":
mod: "000755"
sahip: kök
grup: kök
içeriği: |
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;


0

Java Platformu için

NGINX yapılandırma proxy dosyasını oluşturmak için şunu eklemelisiniz:

.ebextension/nginx/conf.d/proxy.conf dosya

içeriğiyle client_max_body_size 20M;.

"proxy.conf", "/etc/nginx/conf.d/proxy.conf" dizinine konuşlandırılacak ve NGINX yapılandırmasına otomatik olarak dahil edilecektir.


0

EC2 çalıştırıyorsanız ve nginx'i kendiniz kurduysanız, en iyi çözümünüz şurada yeni bir dosya oluşturmaktır:

/etc/nginx/conf.d

Klasör:

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

ve sonra aşağıdaki satırı oraya ekleyin:

client_max_body_size 20M;

ardından nginx'i kaydedin ve yeniden başlatın:

sudo systemctl restart nginx

Bu bir çözümdür, ancak Elastic Beanstalk yeni bir örnek oluşturduğu takdirde, her durumda bu yapılandırmayı vermeniz gerekir. EC2 girişlerini sürekli izlememiz gerektiğinden ve nginx yeniden başlatma süreci her
seferinde
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.