nginx - client_max_body_size tidak berpengaruh

205

nginx terus berkata client intended to send too large body. Googling dan RTM menunjuk saya ke client_max_body_size. Saya mengaturnya 200mdi dalam nginx.confdan di vhost conf, restart Nginx beberapa kali tapi saya masih mendapatkan pesan kesalahan.

Apakah saya mengabaikan sesuatu? Backend adalah php-fpm( max_post_sizedan max_upload_file_sizediatur sesuai).

q_no
sumber
4
Ada masalah dengan client_max_body_size di SSL diaktifkan. Saya baru saja mendapat masalah yang sama pada versi nginx yang berlangsung dan mengabaikan petunjuk ini dalam koneksi yang aman. Masih mencari solusi.
Neolo
14
Dalam kasus orang lain googles ini: Nginx 1.1.19 (di Ubuntu 12.04) tampaknya mengabaikan client_max_body_size dalam arahan 'http', meskipun tidak masalah dengan itu di 'server'. Ini tampaknya telah diperkenalkan dalam pembaruan dalam 6 bulan terakhir atau lebih, karena bagi saya file konfigurasi yang sama pada server yang sama digunakan untuk bekerja.
Dave
1
@Dave dan jika Anda datang ke sini pada tahun 2018, ini tampaknya tetap - client_max_body_sizedi httpbagian ini memiliki efek yang diharapkan dengan nginx versi 1.14.1
DomQ
Ini memeriksa tajuk panjang konten (setidaknya dalam 1.4.6), jadi jika file besar diunggah dengan panjang konten yang tidak disetel, atau panjang konten yang disetel ke nilai kurang dari ukuran tubuh maks, itu tidak akan memicu HTTP 413
Charles L.

Jawaban:

131

Mengikuti dokumentasi nginx , Anda dapat mengatur client_max_body_size 20m (atau nilai apa pun yang Anda butuhkan) dalam konteks berikut:

context: http, server, location
nembleton
sumber
20
Itu tidak berfungsi untuk saya di lokasi, bekerja dalam konteks server. Tidak yakin apakah itu ditimpa, tidak dapat mengatakan.
Dipen
@Dipen: Menarik. Versi NGinx apa yang Anda miliki?
nembleton
7
Ditto apa yang dikatakan Dipen, kecuali saya tidak bisa mendapatkannya di server {} atau blok lokasi {} ... hanya berfungsi dalam konteks http {}. Ganjil
Robbie
4
Saya dapat mengonfirmasi bahwa ini hanya berfungsi pada nginx / 1.4.1 yang berjalan pada Debian GNU / Linux 7.1 (wheezy) di bagian http {}.
Fernando Kosh
Mengkonfirmasi pengaturan gagal saat pengaturan aktif httpatau locationpengaturan. Bekerja ketika diatur pada serverlevel. nginx / 1.4.4
AlbertEngelB
104

NGINX unggahan besar berhasil bekerja di situs WordPress yang dihosting, akhirnya (sesuai saran dari nembleton & rjha94)

Saya pikir mungkin bermanfaat bagi seseorang, jika saya menambahkan sedikit klarifikasi pada saran mereka. Sebagai permulaan, harap pastikan Anda telah memasukkan arahan unggah Anda yang meningkat dalam SEMUA TIGA blok definisi terpisah (server, lokasi & http). Masing-masing harus memiliki entri baris yang terpisah. Hasilnya akan menyukai sesuatu seperti ini (di mana ... mencerminkan baris lain di blok definisi):

http {
    ...
    client_max_body_size 200M;
}    

(dalam pengaturan ISPconfig 3 saya, blok ini ada di file /etc/nginx/nginx.conf)

server {
    ...
    client_max_body_size 200M;
}

location / {
    ...
    client_max_body_size 200M;
} 

(dalam pengaturan ISPconfig 3 saya, blok-blok ini ada di file /etc/nginx/conf.d/default.conf)

Juga, pastikan bahwa file php.ini server Anda konsisten dengan pengaturan NGINX ini. Dalam kasus saya, saya mengubah pengaturan di bagian File_Uploads php.ini untuk membaca:

upload_max_filesize = 200M

Catatan: jika Anda mengelola pengaturan ISPconfig 3 (pengaturan saya adalah pada CentOS 6.3, sesuai The Perfect Server ), Anda perlu mengelola entri ini dalam beberapa file terpisah. Jika konfigurasi Anda mirip dengan yang ada di pengaturan langkah-demi-langkah, file conf NGINX yang perlu Anda modifikasi ada di sini:

/etc/nginx/nginx.conf
/etc/nginx/conf.d/default.conf 

File php.ini saya ada di sini:

/etc/php.ini

Saya terus mengabaikan blok http {} di file nginx.conf. Tampaknya, mengabaikan ini memiliki efek membatasi pengunggahan ke batas default 1M. Setelah membuat perubahan terkait, Anda juga ingin memastikan untuk memulai kembali layanan NGINX dan PHP FastCGI Process Manager (PHP-FPM) Anda. Pada konfigurasi di atas, saya menggunakan perintah berikut:

/etc/init.d/nginx restart
/etc/init.d/php-fpm restart
jadik
sumber
24
Saya sarankan Anda menggunakan /etc/init.d/nginx reloadsebagai gantinya. Ini memiliki manfaat tambahan seperti 'jika konfigurasi salah' NginX tidak akan berhenti berfungsi.
Hengjie
Terima kasih ini sangat membantu saya! Memecahkan masalah saya setelah meretas dengan banyak pengaturan file php.ini yang berbeda, dll.
Yos
Huruf kecil m bekerja untuk kita. client_max_body_size 100m;
so_mv
13
@ Hengjie Saya akan merekomendasikan menggunakan nginx -t(menguji sintaks file konfigurasi) dan kemudian nginx -s reload(melakukan reload sebenarnya) sebagai gantinya.
Anoyz
Hanya perlu menunjukkan bahwa di kotak gelandangan saya ada dua file ini - /etc/php5/cli/php.ini dan /etc/php5/fpm/php.ini dan konfigurasi yang dimuat Symfony adalah fpm. Jadi jangan lupa edit yang ini.
Jalal
65

Pada Maret 2016 , saya mengalami masalah ini mencoba POST json over https (dari permintaan python, bukan itu penting).

Caranya adalah dengan menempatkan "client_max_body_size 200M;" setidaknya di dua tempat http {}danserver {} :

1. yang httpdirektori

  • Biasanya masuk /etc/nginx/nginx.conf

2. yang serverdirektori dalam vhost Anda.

  • Untuk pengguna Debian / Ubuntu yang menginstal melalui apt-get (dan manajer paket distro lainnya yang menginstal nginx dengan vhosts secara default), itu /etc/nginx/sites-available/mysite.com, bagi mereka yang tidak memiliki vhosts, itu mungkin nginx.conf Anda atau di direktori yang sama dengannya.

3. para location /direktori di tempat yang sama seperti 2.

  • Anda dapat lebih spesifik daripada /, tetapi jika tidak berfungsi sama sekali, saya akan merekomendasikan menerapkan ini /dan kemudian setelah itu bekerja lebih spesifik.

Ingat - jika Anda memiliki SSL, itu akan mengharuskan Anda untuk mengatur di atas untuk SSL serverdan locationjuga, di mana pun itu (idealnya sama dengan 2. ). Saya menemukan bahwa jika klien Anda mencoba mengunggah di http, dan Anda berharap mereka mendapatkan 301'd ke https, nginx sebenarnya akan memutuskan koneksi sebelum pengalihan karena file terlalu besar untuk server http, jadi itu harus di keduanya .

Komentar terbaru menunjukkan bahwa ada masalah dengan ini di SSL dengan versi nginx yang lebih baru, tetapi saya menggunakan 1.4.6 dan semuanya baik-baik saja :)

JJ
sumber
3
Dokumentasi menyatakan default sebagai "1m" yang ternyata 1 megabyte - bukan 1 megabit. Saya pikir - meskipun saya belum mengujinya - selalu megabyte.
Thomas
2
@ Thomas ya itu selalu m bukan M, jadi pasti megabyte, karena saya menjalankan tes sendiri.
CppLearner
1
Terima kasih keduanya - saya telah menghapus bit / byte bit.
JJ
2
Pada 2018 dan nginx versi 1.14.1, ini tampaknya tetap - client_max_body_sizedihormati di bagian httptanpa perlu menambahkannya di tempat lain.
DomQ
27

Anda perlu menerapkan perubahan berikut:

  1. Update php.ini(Cari file ini langsung dari phpinfo();) dan meningkatkan post_max_sizedan upload_max_filesizeuntuk ukuran yang Anda inginkan:

    sed -i "s/post_max_size =.*/post_max_size = 200M/g" /etc/php5/fpm/php.ini
    sed -i "s/upload_max_filesize =.*/upload_max_filesize = 200M/g" /etc/php5/fpm/php.ini```
    
  2. Perbarui nginx pengaturan untuk website Anda dan add client_max_body_sizenilai dalam Anda location, httpatau serverkonteks.

    location / {
        client_max_body_size 200m;
        ...
    }
    
  3. Mulai ulang NginX dan PHP-FPM:

    service nginx restart
    service php5-fpm restart
    

CATATAN: Suatu saat (dalam kasus saya hampir setiap waktu) Anda harus mematikan php-fpmproses jika tidak menyegarkan dengan perintah layanan dengan benar. Untuk melakukannya, Anda bisa mendapatkan daftar proses ( ps -elf | grep php-fpm) dan membunuh satu per satu ( kill -9 12345) atau menggunakan perintah berikut untuk melakukannya untuk Anda:

ps -elf | grep php-fpm | grep -v grep | awk '{ print $4 }' | xargs kill -9
Qorbani
sumber
12

Silakan lihat apakah Anda mengatur direktif client_max_body_size di dalam blok http {} dan bukan di dalam blok lokasi {}. Saya telah mengaturnya di dalam blok http {} dan berfungsi

rjha94
sumber
11

Seseorang mengoreksi saya jika ini buruk, tetapi saya ingin mengunci semuanya sebanyak mungkin, dan jika Anda hanya punya satu target untuk diunggah (seperti biasanya), maka targetkan perubahan Anda pada satu file itu. Ini berfungsi untuk saya di paket mainline nginx-ekstra Ubuntu 1.7+:

location = /upload.php {
    client_max_body_size 102M;
    fastcgi_param PHP_VALUE "upload_max_filesize=102M \n post_max_size=102M";
    (...)
}
digitaltoast
sumber
Saya suka ide ini juga bagi saya itu tidak bekerja seperti ini. Yang bisa saya lakukan adalah mengurangi nilai dan tidak meningkatkannya di tingkat lokasi.
Geza Turi
4

Saya memiliki masalah yang sama baru-baru ini dan menemukan, yang client_max_body_size 0;dapat memecahkan masalah seperti itu. Ini akan mengatur client_max_body_size ke batas. Tetapi praktik terbaik adalah meningkatkan kode Anda, jadi tidak perlu meningkatkan batas ini.

Adrián Molčan
sumber
3

Dengan anggapan Anda telah menetapkan client_max_body_size dan berbagai pengaturan PHP (upload_max_filesize / post_max_size, dll) di jawaban lain, lalu mulai ulang atau muat ulang NGINX dan PHP tanpa hasil apa pun, jalankan ini ...

nginx -T

Ini akan memberi Anda kesalahan yang tidak terselesaikan di konfigurasi NGINX Anda. Dalam kasus saya, saya berjuang dengan kesalahan 413 selama sehari penuh sebelum saya menyadari ada beberapa kesalahan SSL lain yang belum terselesaikan dalam konfigurasi NGINX (jalur salah untuk sertifikat) yang perlu diperbaiki. Setelah saya memperbaiki masalah yang belum saya selesaikan dari 'nginx -T', memuat ulang NGINX, dan EUREKA !! Itu memperbaikinya.

P-Didz
sumber
3

Saya menyiapkan server dev untuk bermain dengan mirror live lama kami, saya menggunakan The Perfect Server - Ubuntu 14.04 (nginx, BIND, MySQL, PHP, Postfix, Dovecot dan ISPConfig 3)

Setelah mengalami masalah yang sama, saya menemukan posting ini dan tidak ada yang berhasil. Saya mengubah nilai di setiap file yang disarankan (nginx.conf, ispconfig.vhost, / sites-available / default, dll.)

Akhirnya, mengubah nginx client_max_body_sizesaya /etc/nginx/sites-available/apps.vhostdan memulai kembali adalah yang berhasil. Semoga ini bisa membantu orang lain.

Jeramiah Harland
sumber
3

Saya menemui masalah yang sama, tetapi saya menemukan itu tidak ada hubungannya dengan nginx. Saya menggunakan nodejs sebagai server backend, menggunakan nginx sebagai proxy terbalik, kode 413 dipicu oleh server node. simpul menggunakan koa mem-parsing tubuh. koa batasi panjang urlencoded.

formLimit: batas tubuh yang di-urlencode. Jika tubuh akhirnya lebih besar dari batas ini, kode kesalahan 413 dikembalikan. Standarnya adalah 56kb.

mengatur formLimit menjadi lebih besar dapat menyelesaikan masalah ini.

pangpang
sumber
0

Punya masalah yang sama bahwa client_max_body_sizearahan diabaikan.

Kesalahan konyol saya adalah, bahwa saya meletakkan file di dalamnya /etc/nginx/conf.dyang tidak berakhir dengan .conf. Nginx tidak akan memuat ini secara default.

Philippe Gerber
sumber
-2

Jika Anda menggunakan versi windows nginx, Anda dapat mencoba untuk mematikan semua proses nginx dan restart untuk melihatnya. Saya mengalami masalah yang sama di lingkungan saya, tetapi mengatasinya dengan solusi ini.

nathan.xu
sumber
Itu masalah saya, terima kasih! Satu contoh Nginx tidak keluar dengan benar kurasa. Tidak pernah buruk untuk memeriksa apakah itu keluar di windowstasklist /fi "imagename eq nginx.exe"
Valery Baranov