Meningkatkan client_max_body_size di konfigurasi Nginx di AWS Elastic Beanstalk

121

Saya mengalami kesalahan "413 Permintaan Entitas Terlalu Besar" saat memposting file yang lebih besar dari 10MB ke API kami yang berjalan di AWS Elastic Beanstalk.

Saya telah melakukan sedikit penelitian dan percaya bahwa saya perlu menaikkan client_max_body_size untuk Nginx, namun saya tidak dapat menemukan dokumentasi apa pun tentang cara melakukan ini menggunakan Elastic Beanstalk. Dugaan saya adalah bahwa itu perlu dimodifikasi menggunakan file ebetension.

Adakah yang punya pemikiran tentang bagaimana saya bisa mencapai batas? 10MB cukup lemah, harus ada cara untuk meningkatkannya secara manual.

Nick Parsons
sumber
1
Standarnya hanya 1MB hari ini ...
rogerdpack
Sebagai catatan, semua solusi yang disediakan tidak menangani penerapan .NET. Jika Anda menggunakan .NET di AWS Elastic Beanstalk, Anda harus mengonfigurasi pengaturan IIS di proyek Anda. Bagi saya, saya harus mengkonfigurasi web.config di aplikasi net471 saya.
SimonH

Jawaban:

223

Ada dua metode yang dapat Anda lakukan untuk ini. Sayangnya beberapa bekerja untuk beberapa jenis aplikasi EB dan beberapa bekerja untuk yang lain.

Didukung / direkomendasikan dalam dokumentasi AWS

Untuk beberapa jenis aplikasi, seperti Java SE , Go , Node.js , dan mungkin Ruby (tidak didokumentasikan untuk Ruby, tetapi semua platform Nginx lainnya tampaknya mendukung ini), Elasticbeanstalk memiliki pemahaman bawaan tentang cara mengkonfigurasi Nginx.

Untuk memperluas konfigurasi nginx default Elastic Beanstalk, tambahkan file konfigurasi .conf ke folder yang diberi nama .ebextensions/nginx/conf.d/dalam paket sumber aplikasi Anda . Konfigurasi nginx Elastic Beanstalk menyertakan file .conf di folder ini secara otomatis.

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

Mengonfigurasi Proxy Terbalik - Java SE

Untuk meningkatkan ukuran unggahan maksimum secara khusus, kemudian buat file dengan .ebextensions/nginx/conf.d/proxy.confmenyetel ukuran tubuh maksimal ke ukuran yang Anda inginkan:

client_max_body_size 50M;

Buat file konfigurasi Nginx secara langsung

Setelah banyak penelitian dan berjam-jam bekerja dengan tim dukungan AWS yang luar biasa, saya membuat file konfigurasi di dalamnya .ebextensionsuntuk melengkapi konfigurasi nginx. Perubahan ini memungkinkan untuk ukuran tubuh posting yang lebih besar.

Di dalam .ebextensionsdirektori, saya membuat file bernama 01_files.configdengan konten berikut:

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

Ini menghasilkan file proxy.conf di dalam direktori /etc/nginx/conf.d. File proxy.conf hanya berisi satu liner client_max_body_size 20M;yang melakukan trik.

Perhatikan bahwa untuk beberapa platform, file ini akan dibuat selama penerapan, tetapi kemudian dihapus pada tahap penerapan selanjutnya.

Anda dapat menentukan arahan lain yang diuraikan dalam dokumentasi Nginx.

http://wiki.nginx.org/Configuration

Semoga ini bisa membantu orang lain!

Nick Parsons
sumber
2
Format file didokumentasikan di docs.aws.amazon.com/elasticbeanstalk/latest/dg/… . Kemajuannya dicatat di /var/log/cfn-init.log. Di log, Anda akan melihat sesuatu seperti 2014-xx-xx xx:xx:xx,xxx [DEBUG] Writing content to /etc/nginx/conf.d/proxy.conf. Saya tidak yakin, tetapi sepertinya memulai ulang server mungkin perlu.
h-kippo
2
Bekerja untukku dengan puma. Harus memulai ulang layanan seperti yang dikatakan @Will (sudo service nginx reload).
Dennis
1
Mudah-mudahan ini dapat membantu orang lain karena saya membutuhkan beberapa saat ... lekukan itu penting - harus sesuai dengan spesifikasi YAML - docs.saltstack.com/en/latest/topics/yaml
alexs
1
Dikonfirmasi berfungsi, pastikan .ebextensionstidak masuk .ebignoredan .gitignore🖖 Saya tidak perlu memulai ulang layanan nginx, eb deploydan berhasil 🎉
GabLeRoux
4
Untuk node js, metode kedua (files :) bekerja untuk saya. Yang pertama tidak berhasil. Bahkan dukungan AWS disarankan untuk menggunakan metode kedua untuk node 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;

Modifikasi jawaban di atas demi keamanan (dan sintaksnya salah, lihat, dua entri 'pemilik:' di YAML), kawan, tolong jangan tetapkan izin 777 pada APA SAJA. Kecuali jika Anda senang diretas, dan atur pemilik file konfigurasi Nginx ke root.

Juga lihat jawaban di bawah ini untuk membuat nginx pickup perubahan ini setelah penerapan.

pengguna3217794
sumber
22

EDIT: Setelah Anda menerapkan build dengan instruksi dalam jawaban yang diterima oleh Nick Parsons, Anda mungkin perlu memulai ulang server nginx untuk mengambil perubahan.

Untuk melakukan ini, ssh ke instance dan lakukan

sudo service nginx reload

Untuk mempelajari lebih lanjut tentang memuat ulang, lihat http://nginx.org/en/docs/beginners_guide.html .

Di versi Elastic Beanstalk sebelumnya, saya dapat menambahkan container_command untuk melakukannya, tetapi sekarang saya menemukan, seperti @cdmckay, bahwa hal ini menyebabkan kegagalan penerapan. Jika Anda membangun kembali lingkungan Anda, itu akan mengambil pengaturan client_max_body_size serta instruksi itu ada di file konfigurasi Anda.

Akan
sumber
Apakah ini perlu? Jika Anda tidak menambahkan ini, bagaimana cara memulai ulang?
cdmckay
Dalam pengalaman saya, saya merasa ini perlu.
Akan
@cdmckay dapatkah Anda mengatakan lebih banyak tentang masalah instance yang disebabkan oleh perintah muat ulang?
Akan
Saya tidak memeriksanya terlalu dekat, tetapi pada dasarnya mencegah server saya diluncurkan sampai saya menghapusnya. Sepertinya tidak perlu.
cdmckay
3
menurut pengalaman saya, saya merasa ini perlu, namun, saya harus menambahkan tanda centang untuk melihat apakah nginx sedang berjalan sebelum mencoba untuk memulai ulang untuk instance baru - 'pgrep nginx && service nginx reload || true '
alexs
16

Jawaban yang diterima tidak berfungsi untuk saya karena saya memiliki aplikasi berbasis JVM dan tampaknya melakukan konfigurasi NGINX secara berbeda. Saya akan melihat file proxy.conf sedang dibuat selama penerapan tetapi kemudian dihapus sebelum penerapan selesai. Dokumentasi AWS menjelaskan cara mengkonfigurasi proxy :

Buat .ebextensions/nginx/conf.d/proxy.conffile yang hanya berisi baris:client_max_body_size 40M;

Raymond 26
sumber
2
Sayangnya, itu tidak berhasil untuk saya (kontainer tunggal Docker ELB) - bahkan setelah reboot instance. Masuk ke instance melalui SSH tidak ada file proxy.conf yang sedang dibuat/etc/nginx/conf.d/
Udo G
Saya berasumsi itu karena Anda menggunakan Docker ELB dan nginx conf berbeda. Jawaban saya adalah untuk ELB preset-Java.
Raymond 26
Saya menggunakan aplikasi elb dan java. Bekerja untuk saya! Terima kasih!
Dimitar Vukman
Bagaimana Anda bisa melihat file proxy.conf sedang dibuat, hanya mencatat keberadaan sementara?
rogerdpack
9

Mengikuti dari jawaban yang diterima, Anda mungkin perlu memuat ulang file konfigurasi nginx.

Untuk melakukan ini tambahkan perintah berikut

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

Ini akan menjadi praktik yang lebih baik daripada melakukan ssh'ing ke dalam instance eb Anda dan melakukannya secara manual dengan sebuah perintah.

Ini dikombinasikan dengan jawaban yang diterima memecahkan masalah yang sama untuk saya. (Rel, Puma, NGINX)

ConorB
sumber
7

Satu-satunya hal yang berhasil bagi saya adalah membuat file ".config" di dalam .ebextensions seperti ini:

.ebextensions/
           proxy.config

dengan hanya konten ini di file .config:

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

tidak perlu subfolder, tidak perlu me-restart server aplikasi, perhatikan bahwa file ".config" bukan ".conf" di dalam .ebextensions dan penggunaan lekukan yang tepat untuk menghindari kesalahan di konsol aws, sisanya sama tidak peduli nama filenya,

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

Ed Vieira
sumber
6

Saya telah mencoba semua .ebextensionsmetode untuk menambahkan konfigurasi level implementasi dan itu tidak membantu saya di AMI Amazon Linux terbaru. Saya telah melakukan banyak penelitian dan setelah melalui log saya dapat menemukan pelari tugas penyebaran sedang memeriksa folder yang disebut .platformsetiap kali dan saya berpikir untuk menambahkan satu seperti ekstensi. Di bawah ini adalah pengaturan yang telah saya lakukan di folder root proyek saya.

Tambahkan pengaturan folder di bawah ini di tingkat root folder proyek Anda.

Struktur folder (.platform / nginx / conf.d / proxy.conf)

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

Isi File 1 - proxy.conf (Di dalam .platform/nginx/conf.d/folder)

client_max_body_size 50M;

Isi File 2 - 00_myconf.config (Di dalam .platform/folder)

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

Hati-hati dengan ekstensi. File pertama adalah .conf dan file kedua adalah .config .

Sekarang gunakan ulang proyek Anda ke Amazon Elastic Beanstalk dan Anda akan melihat keajaibannya. Konfigurasi ini akan ditambahkan ke semua instans EC2 Anda, yang dibuat sebagai bagian dari penskalaan otomatis.

Struktur folder terperinci di bawah.

masukkan deskripsi gambar di sini

Jijo Cleetus
sumber
2
Pria!!!!!!!! Terima kasih banyak. Ini adalah satu-satunya cara untuk mengatur konfigurasi nginx di AWS EB Amazon linux. Saya menghabiskan sepanjang hari mencoba setiap solusi yang tersedia !!! Saya tidak dapat mengungkapkan bagaimana mengucapkan terima kasih karena telah meluangkan waktu untuk menulis jawaban ini secara rinci. Diberkatilah Anda. Jika Anda memiliki akun patreon atau buymeacoffee, saya akan berkontribusi. @jijo Cleetus
InfinitePrime
2
Terima kasih banyak. Saya juga mencoba semua pendekatan yang mungkin digunakan .ebextensionsdan hanya pendekatan ini yang berhasil.
ArunDhaJ
Menyelamatkan saya dari banyak cobaan dan kegagalan membuat ini bekerja. Tidak bisa cukup berterima kasih!
Jalal El-Shaer
Terima kasih banyak, ini juga berfungsi untuk aplikasi Spring Boot; dengan Elastic Beans Talk menjalankan tomcat. Minum bir di tab saya :).
Awi
5

Jawaban yang diterima tidak berhasil untuk saya, jadi saya mengganti konfigurasi nginx dengan milik saya sendiri.

Saya membuat file bernama di nginx.confbawah direktori.ebextensions/nginx/

Saya melakukan SSH ke instance yang sedang berjalan dari aplikasi Pohon Kacang saya, dan menyalin konten nginx.conffile, menggunakan cat /etc/nginx/nginx.confdan menyalin dari terminal.

Saya menempelkan konten ke dalam nginx.conffile yang saya buat sebelumnya .ebextensions/nginx/, dan memodifikasi direktif http untuk disertakan client_max_body_size 50M;. Saya akhirnya menerapkan ulang aplikasi saya menggunakan eb deploydan berhasil. Anda harus mendapatkan pesan berikut selama penerapan:

INFO: Konfigurasi Nginx terdeteksi di direktori '.ebextensions / nginx'. AWS Elastic Beanstalk tidak akan lagi mengelola konfigurasi Nginx untuk lingkungan ini.

Ini adalah isi dari my .ebextensions/nginx/nginx.conf file :

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

Saya tidak perlu memulai ulang layanan nginx atau lingkungan.

Catatan : Pastikan .ebextensions Anda adalah bagian dari file .zip yang dibuat dan diunggah ke Beanstalk selama penerapan (tidak diabaikan di .gitignoreatau .ebignorejika Anda menggunakannya).

kskyriacou
sumber
Terima kasih untuk ini! Saya bertanya-tanya platform mana yang Anda gunakan? Untuk beberapa alasan Beanstalk tidak mendeteksi file `.ebextensions / nginx / nginx.conf` saya meskipun itu ada di file zip dan git repo.
Icid
Suara positif untuk catatan tersebut. Saya mengabaikan .ebextensionsyang menyebabkan jawaban yang diterima dan populer gagal. Saya tidak mencoba semua hal lain yang Anda sebutkan, tetapi terima kasih atas catatannya 🍻
GabLeRoux
3

Ini adalah solusi yang disediakan AWS , dan berfungsi (sesuaikan ukurannya dengan kebutuhan Anda)

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

Atau Anda dapat mengubah server proxy ke Apache. Untuk melakukan ini, buka Konfigurasi dan Edit Konfigurasi Perangkat Lunak. Opsi pertama di sini adalah "Server proxy", pilih "apache".

David Smits
sumber
Apache memiliki direktif LimitRequestBody sendiri untuk mengatur ukuran maksimal file yang diunggah.
Tom Harvey
@TomHarvey Jika tersedia, maukah Anda memberikan contoh lengkap untuk kasus penggunaan LimitRequestBody?
Hasan
1

Untuk Golang tanpa Docker saya mengikuti instruksi ini dari aws doc:

Mengonfigurasi Proksi Terbalik

Jika Anda ingin menyertakan arahan selain yang ada di blok http nginx.conf, Anda juga dapat menyediakan file konfigurasi tambahan di .ebextensions/nginx/conf.d/direktori bundel sumber Anda. Semua file di direktori ini harus berekstensi .conf. http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/go-environment.html#go-complex-apps

Saya membuat file proxy.confdi .ebextensions/nginx/conf.d/root proyek saya, hanya dengan 1 baris di dalamnya:

client_max_body_size 20M;

Jika masih tidak berhasil, pastikan .ebextensionsfolder dan sub-folder disertakan dalam zip penerapan Anda. Tidak perlu memulai ulang Nginx secara manual.

pascal
sumber
1

Saya berjuang dengan masalah yang sama tetapi tidak dapat menyelesaikannya, akhirnya berhasil.

ini file konfigurasi saya,

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"

Masalahnya adalah,

Saya menggunakan skrip python untuk pipa kode yang tidak menyertakan folder .ebextensions saat membuat build.

Ini beberapa sen saya,

  1. pastikan folder .ebextensions Anda termasuk dalam folder zip build Anda yang terletak di s3bucket akun aws Anda
  2. pastikan itu tidak ada dalam file .gitignore
  3. jika Anda menggunakan skrip untuk membuat build, pastikan itu menyertakan .ebextensions
harshal jadhav
sumber
1

Setelah 3 hari yang panjang mencoba mencari tahu yang satu ini, saya langsung menelepon tim dukungan AWS yang luar biasa dan mereka memberi saya beberapa petunjuk tentang cara menyelesaikannya. Pertama, proyek saya ada di JAVA dan saya menggunakan maven dan boot musim semi untuk menjalankannya melalui Elastic Beanstalk (EBS).

  1. Seperti yang dijelaskan di dokumentasi AWS , Anda perlu memiliki pengaturan nginx khusus yang disimpan di tingkat root proyek Anda. Untuk melakukan itu, saya telah membuat file client_max_body_size.conf dan meletakkannya di jalur berikut: myprojectname /src/main/resources/ebextensions/nginx/conf.d/client_max_body_size.conf File ini hanya berisi baris berikut:

    client_max_body_size 10M;
    
  2. Konfigurasikan maven untuk menambahkan file ini di folder root proyek saya selama pembuatan. Ini agak rumit, saya perlu menambahkan konfigurasi berikut ( sumber ) di POM.xml saya:

    <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. Sekarang Anda sudah dapat membangun proyek Anda secara lokal dan menjalankan perintah SSH berikut untuk memvalidasinya sebenarnya terletak di root proyek Anda:

    jar tf main-1.0-SNAPSHOT.jar | grep .ebextensions
    
  4. Sekarang bagian yang sulit. Saat Anda mengunggahnya ke EBS, file Anda harus berisi hanya file SNAPSHOT.jar dan folder .ebextensions. Misalnya, jika sekarang Anda akan membuat zip file jar dan foldernya dan mengunggahnya secara manual, itu akan berhasil!

  5. Karena saya menggunakan Jenkins untuk penerapan saya, dan khususnya AWS EBS Deployment Plugin - Anda perlu mengubah pengaturan file / folder yang Anda sertakan dalam penerapan. Sekarang untuk beberapa alasan saya tidak dapat menyertakan folder .ebextensions jadi saya hanya mengecualikan yang lainnya kecuali folder dan file .jar. masukkan deskripsi gambar di sini

Ini bekerja!

Yanir Calisar
sumber
1

Selain client_max_body_size, saya harus menambahkan client_body_buffer_size . Berikut adalah file konfigurasi titik yang berfungsi, untuk lampiran 2 MB:

files: "/etc/nginx/conf.d/proxy.conf":
mode: "000755"
pemilik:
grup root: root
konten: |
proxy_buffering pada;
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;

Norma
sumber
0

Untuk Platform Java

Untuk membuat file proxy konfigurasi NGINX, Anda harus menambahkan

.ebextension/nginx/conf.d/proxy.conf mengajukan

dengan konten client_max_body_size 20M;di dalamnya.

"proxy.conf" akan diterapkan ke "/etc/nginx/conf.d/proxy.conf" dan secara otomatis disertakan oleh konfigurasi NGINX.

Lyudmyla
sumber
0

Jika Anda menjalankan EC2 dan menginstal nginx sendiri, solusi terbaik Anda adalah membuat file baru di

/etc/nginx/conf.d

map:

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

dan kemudian tambahkan baris berikut di sana:

client_max_body_size 20M;

lalu simpan dan mulai ulang nginx:

sudo systemctl restart nginx
Aerodynamika
sumber
Ini adalah penyelesaian tetapi jika Elastic Beanstalk membuat instance baru, Anda perlu memberikan konfigurasi ini di setiap instance. Dan secara praktis tidak mungkin karena kami perlu terus memantau intance EC2 dan proses restart nginx tidak selalu baik
Jijo Cleetus