nginx - client_max_body_size etkisizdir


207

nginx söylemeye devam ediyor client intended to send too large body. Google ve RTM beni işaret etti client_max_body_size. Ben ayarlayın 200miçinde nginx.confhem olduğu gibi vhost conf, yeniden Nginx birkaç kez ama hala hata mesajı alıyorum.

Bir şeyi gözden kaçırdım mı? Arka uç php-fpm( max_post_sizeve max_upload_file_sizebuna göre ayarlanır).


4
SSL etkinken client_max_body_size ile ilgili bir sorun var. Uzun süren nginx sürümünde aynı sorunu aldım ve güvenli bağlantılarda bu yönergeyi yok sayar. Hala çözüm arıyor.
Neolo

14
Başka birisinin bunu Google'da yapması durumunda: Nginx 1.1.19 (Ubuntu 12.04'te) , 'http' yönergesinde client_max_body_size değerini 'server' ile uyumlu olsa da yok sayıyor gibi görünüyor . Bu, son 6 ay içinde bir güncellemede tanıtılmış gibi görünüyor, çünkü benim için aynı sunucudaki aynı yapılandırma dosyası eskiden çalışıyor.
Dave

1
@Dave ve 2018 yılında buraya gelirlerse, bu sabit görünüyor - client_max_body_sizein httpbölümde nginx sürümü 1.14.1 ile beklenen etkiye sahiptir
DomQ

Bu, içerik uzunluğu başlığını kontrol eder (en azından 1.4.6'da), bu nedenle ayarlanmamış içerik uzunluğuna veya içerik uzunluğu maksimum gövde boyutundan daha küçük bir değere ayarlanmış büyük bir dosya yüklenirse, HTTP 413
Charles'ı

Yanıtlar:


132

Aşağıdaki nginx belgelerinde , sen client_max_body_size 20m (veya gerekmez herhangi bir değer) aşağıdaki bağlamında ayarlayabilirsiniz:

context: http, server, location

21
Benim için yerinde çalışmadı, sunucu bağlamında çalıştı. Geçersiz kılındığından emin değil, söyleyemem.
Dipen

@Dipen: İlginç. Hangi NGinx sürümüne sahipsiniz?
nembleton

7
Dipen'in söylediği gibi, {} veya location {} bloklarında alamıyorum dışında ... sadece http {} bağlamında çalışıyor. Tek
Robbie

4
Sadece http {} bölümünde Debian GNU / Linux 7.1 (wheezy) üzerinde çalışan nginx / 1.4.1 üzerinde çalıştığını doğrulayabilirim.
Fernando Kosh

Ayarlar httpveya locationayarlar yapılırken ayarın onaylanamaması . Seviyeye ayarlandığında çalışır server. nginx / 1.4.4
AlbertEngelB

105

NGINX büyük yüklemeleri, barındırılan WordPress sitelerinde başarıyla çalışmaktadır (nihayet (nembleton ve rjha94'ün önerilerine göre)

Eğer önerilerine biraz açıklama eklersem, birisi için yararlı olabileceğini düşündüm. Yeni başlayanlar için, yükleme yönergelerinizi ÜÇÜNCÜ TÜM ayrı tanım bloklarına (sunucu, konum ve http) eklediğinizden emin olun. Her birinin ayrı bir satır girişi olmalıdır. Sonuç böyle bir şeye benzeyecektir (... tanım bloğundaki diğer satırları yansıtır):

http {
    ...
    client_max_body_size 200M;
}    

(ISPconfig 3 kurulumumda, bu blok /etc/nginx/nginx.conf dosyasındadır)

server {
    ...
    client_max_body_size 200M;
}

location / {
    ...
    client_max_body_size 200M;
} 

(ISPconfig 3 kurulumumda, bu bloklar /etc/nginx/conf.d/default.conf dosyasında bulunur)

Ayrıca, sunucunuzun php.ini dosyasının bu NGINX ayarlarıyla tutarlı olduğundan emin olun. Benim durumumda, php.ini'nin File_Uploads bölümündeki ayarı okumak için değiştirdim:

upload_max_filesize = 200M

Not: Bir ISPconfig 3 kurulumunu yönetiyorsanız (kurulumum Mükemmel Sunucu'ya göre CentOS 6.3 üzerindedir ), bu girişleri birkaç ayrı dosyada yönetmeniz gerekir. Yapılandırmanız adım adım kurulumdakine benzerse, değiştirmeniz gereken NGINX conf dosyaları burada bulunur:

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

Php.ini dosyam burada bulundu:

/etc/php.ini

Nginx.conf dosyasındaki http {} bloğunu gözden kaçırmaya devam ettim. Görünüşe göre, bunu gözden kaçırmak, yüklemeyi 1M varsayılan sınırına sınırlama etkisine sahipti. İlişkili değişiklikleri yaptıktan sonra, NGINX ve PHP FastCGI Process Manager (PHP-FPM) hizmetlerinizi yeniden başlattığınızdan emin olmak istersiniz. Yukarıdaki yapılandırmada, aşağıdaki komutları kullanıyorum:

/etc/init.d/nginx restart
/etc/init.d/php-fpm restart

24
Bunun /etc/init.d/nginx reloadyerine kullanmanızı öneririm . Bu, 'yapılandırma yanlışsa' NginX'in çalışmayı durdurmayacağı gibi avantajlar sağladı.
Hengjie

Teşekkür ederim bu benim için gerçekten yararlı oldu! Birçok php.ini dosya ayarları vb.
İle

Küçük m harfi bizim için çalıştı. müşteri_max_body_size 100m;
so_mv

13
@Hengjie nginx -t(yapılandırma dosyası sözdizimini test eder) ve sonra nginx -s reload(gerçek yeniden yükleme yapar ) kullanmanızı tavsiye ederim .
Anoyz

Sadece benim vagrant kutusunda iki ini dosyası olduğunu belirtmek gerekir - /etc/php5/cli/php.ini ve /etc/php5/fpm/php.ini ve Symfony yüklü yapılandırma fpm bir oldu. Bu yüzden bunu düzenlemeyi unutmayın.
Celal

66

Mart 2016 itibariyle, bu sorunu https üzerinden json POST yapmaya çalıştım (önemli değil, python isteklerinden).

İşin püf noktası "client_max_body_size 200M;" en az iki yerde http {}veserver {} :

1.http dizin

  • Genellikle /etc/nginx/nginx.conf

2.server senin vhostu içinde dizin.

  • Apt-get (ve varsayılan olarak /etc/nginx/sites-available/mysite.comnginx'i vhosts ile yükleyen diğer dağıtım paketi yöneticileri) aracılığıyla yüklenen Debian / Ubuntu kullanıcıları için, bu, vhost'ları olmayanlar için muhtemelen nginx.conf'unuz veya onunla aynı dizinde.

3.location / olarak aynı yerde dizin 2.

  • Daha spesifik olabilirsiniz /, ancak eğer hiç çalışmıyorsa, bunu uygulamanızı /ve daha sonra bir kez daha spesifik çalışmanızı öneririm .

Unutmayın - Eğer SSL varsa, o SSL için yukarıda belirtilen gerekli kılar serverve locationde her yerde olduğu (aynı ideal olarak aynı olabilir 2. ). Müşteriniz http'ye yüklemeye çalışırsa ve 301'lerin https'ye ulaşmasını beklerseniz, dosya http sunucusu için çok büyük olduğu için nginx'in yeniden yönlendirmeden önce bağlantıyı bırakacağını fark ettim, bu yüzden içinde hem .

Son yorumlar, yeni nginx sürümleriyle SSL'de bununla ilgili bir sorun olduğunu gösteriyor, ancak 1.4.6'dayım ve her şey iyi :)


3
Belgelerde varsayılan değer "1m" olarak belirtilir; bu, 1 megabit değil, 1 megabayt olduğu ortaya çıktı. Bence - henüz test etmeme rağmen - her zaman megabayt.
Thomas

2
@Thomas evet her zaman M değil, bu yüzden kesinlikle megabayt, çünkü kendim bir test yaptım.
CppLearner

1
İkinize de teşekkür ederim - bit / bayt bitini sildim.
JJ

2
2018 ve nginx sürüm 1.14.1'den itibaren, bu sabit görünüyor - başka bir yere eklemeye gerek kalmadan client_max_body_sizebölümde onurlandırıldı http.
DomQ

27

Aşağıdaki değişiklikleri uygulamanız gerekir:

  1. Güncelleme php.ini(sağ ini dosyasını bulun phpinfo();) ve arttırmak post_max_sizeve upload_max_filesizeboyutu istediğiniz:

    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. Güncelleme Nginx web siteniz ve eklenti ayarları client_max_body_sizesizin değer location, httpya da serverbağlam.

    location / {
        client_max_body_size 200m;
        ...
    }
    
  3. NginX ve PHP-FPM'yi yeniden başlatın:

    service nginx restart
    service php5-fpm restart
    

NOT: Bazen (Benim durumumda neredeyse her seferinde) php-fpmservis komutuyla düzgün bir şekilde yenilenmediyse işlemi öldürmeniz gerekir. Bunu yapmak için işlemler ( ps -elf | grep php-fpm) listesini alabilir ve tek tek ( kill -9 12345) öldürebilir veya sizin için yapmak için aşağıdaki komutu kullanabilirsiniz:

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

12

Lütfen client_max_body_size yönergesini http {} bloğunun içinde değil de {} bloğunun içinde ayarlayıp ayarlamadığınızı görün. Http {} bloğunun içine yerleştirdim ve işe yarıyor


11

Birisi bu kötü ise beni düzeltin, ancak her şeyi olabildiğince kilitlemek istiyorum ve yüklemeler için sadece bir hedefiniz varsa (genellikle durum böyle), o zaman değişikliklerinizi o dosyaya hedefleyin. Bu benim için Ubuntu nginx-extras mainline 1.7+ paketinde çalışıyor:

location = /upload.php {
    client_max_body_size 102M;
    fastcgi_param PHP_VALUE "upload_max_filesize=102M \n post_max_size=102M";
    (...)
}

Ben de bu fikri seviyorum ama benim için bu böyle çalışmıyor. Tüm yapabileceğim değeri azaltmak ve konum düzeyinde artırmak değil.
Geza Turi

4

Son zamanlarda benzer bir sorun yaşadım ve bunun client_max_body_size 0;böyle bir sorunu çözebileceğini öğrendim . Bu, client_max_body_size değerini sınırlandırmayacak. Ancak en iyi uygulama kodunuzu geliştirmektir, bu nedenle bu sınırı artırmanıza gerek yoktur.


3

Diğer yanıtlarda zaten client_max_body_size ve çeşitli PHP ayarlarını (upload_max_filesize / post_max_size, vb.) Ayarladığınızı varsayarak, NGINX ve PHP'yi herhangi bir sonuç olmadan yeniden başlattı veya yeniden yüklediniz, bunu çalıştırın ...

nginx -T

Bu, NGINX yapılandırmalarınızda çözülmemiş hataları size verecektir. Benim durumumda, NGINX yapılandırmasında (certs için yanlış yol) düzeltilmesi gereken başka çözülmemiş SSL hataları olduğunu fark etmeden önce bir gün boyunca 413 hatasıyla mücadele ettim. Bir kez 'nginx -T', yeniden yüklenen NGINX ve EUREKA var çözülmemiş sorunları düzeltti! Bunu düzelttim.


3

Modası geçmiş canlı olanı yansıtan bir dev sunucusu kuruyorum, The Perfect Server - Ubuntu 14.04 (nginx, BIND, MySQL, PHP, Postfix, Dovecot ve ISPConfig 3) kullandım

Aynı sorunu yaşadıktan sonra bu yazıyla karşılaştım ve hiçbir şey işe yaramadı. Önerilen her dosyadaki değeri değiştirdim (nginx.conf, ispconfig.vhost, / sites-available / default, vb.)

Sonunda, client_max_body_sizebenim /etc/nginx/sites-available/apps.vhostnginx değiştirmek ve yeniden başlatmak hile yaptı. Umarım başka birine yardımcı olur.


3

Aynı problemle karşılaşıyorum, ama nginx ile ilgisi yoktu. Ben arka uç sunucusu olarak nodejs kullanıyorum, ters proxy olarak nginx kullanın, 413 kodu düğüm sunucusu tarafından tetiklenir. düğüm kullanın koa vücudu ayrıştırmak. koa urlencoded uzunluğunu sınırlar.

formLimit: urlen kodlanmış gövdenin sınırı. Gövde bu sınırdan daha büyük olursa, 413 hata kodu döndürülür. Varsayılan 56 kb'dir.

formLimit öğesini daha büyük olarak ayarlamak bu sorunu çözebilir.


0

client_max_body_sizeDirektifin göz ardı edildiği aynı sorun vardı .

Aptalca hatam, içine /etc/nginx/conf.dbitmeyen bir dosya koymak oldu .conf. Nginx bunları varsayılan olarak yüklemez.


-2

Windows sürüm nginx kullanıyorsanız, tüm nginx işlemini öldürüp görmek için yeniden başlatabilirsiniz. Aynı sorunla çevremde karşılaştım, ancak bu çözümle çözdüm.


Benim sorunum buydu, teşekkürler! Sanırım bir Nginx örneğinden düzgün çıkılmadı. Pencerelerden çıkıp çıkmadığını kontrol etmek asla kötü değildirtasklist /fi "imagename eq nginx.exe"
Valery Baranov
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.