- Konu sahibi
- #1
Nginx'te dosya yükleme sınırı nasıl yönetilir?
Nginx'te istemcinin tek istekte gönderebileceği gövde boyutunu
client_max_body_size yönergesiyle yönetirsiniz. Örneğin 20 MiB yüklemeye izin vermek için ilgili http, server veya location bloğuna client_max_body_size 20m; ekleyin. Değişiklikten sonra yapılandırmayı test edip Nginx'i yeniden yükleyin. Sınır aşılırsa Nginx genellikle HTTP 413 yanıtı döndürür; uygulamaya ulaşmadan önce isteği reddeder.Yönergenin çalışma kapsamı
Değer, bulunduğu yapılandırma bağlamına göre uygulanır.
http tüm sanal sunucuları, server tek bir alan adını, location ise eşleşen URL yolunu etkiler. Daha dar kapsamlı bir tanım, daha genel tanımı geçersiz kılar.Örnek değerler farklı bağlamların kapsamını gösterir; satırlar tek bir tutarlı kurulum değildir. Aşağıdaki gerçek örnekte /upload/ için 20m, diğer yollar için 2m kullanılır:
| Konum | Örnek değer | Etkilediği alan |
|---|---|---|
http | 2m | Bu Nginx yapılandırmasındaki tüm sunucular |
server | 10m | Tek sanal sunucu |
location /upload/ | 20m | Yalnız eşleşen yükleme yolu |
Bu nedenle en güvenli başlangıç, sınırı yalnızca gerçekten büyük dosya kabul eden
location içinde tanımlamaktır. Genel sınırı yükseltmek, sitenin ilgisiz uç noktalarına da büyük istek kabul ettirebilir.Uygulanabilir örnek
Aşağıdaki örnek,
example.com sanal sunucusunda /upload/ isteklerini bir uygulama sunucusuna iletir ve bu yol için 20 MiB sınır koyar. 192.0.2.10:8080 dokümantasyon amaçlı örnek bir arka uç adresidir; kendi çalışan uygulama adresinizle değiştirilmelidir.
Kod:
server {
listen 80;
server_name example.com;
location / {
client_max_body_size 2m;
proxy_pass http://192.0.2.10:8080;
}
location /upload/ {
client_max_body_size 20m;
proxy_pass http://192.0.2.10:8080;
}
}
Bu
server bloğunu Nginx'in etkin yapılandırmasına, genellikle http bloğu içindeki sanal sunucu tanımlarının bulunduğu yere yerleştirin. Arka uç uygulamanın ilgili adreste çalışması ve kendi dosya/form sınırlarının da hedef yükü kabul etmesi gerekir; Nginx sınırını artırmak uygulamanın sınırını otomatik olarak artırmaz.Uygulama sırasını şu şekilde tamamlayın:
- Yapılandırmada doğru
server_nameve yükleme yolunu kullandığınızı kontrol edin. - Nginx yapılandırmasını
nginx -tkomutuyla test edin. - Test başarılıysa
nginx -s reloadkomutuyla yeniden yükleyin. İşletim sisteminizin servis yöneticisini kullanıyorsanız eşdeğer yeniden yükleme komutunu tercih edin. - İstek gövdesi sınırının altında ve üstünde iki kontrollü yükleme deneyin. Başarılı istek uygulamaya ulaşmalı; aşan istek HTTP 413 ile reddedilmelidir.
nginx -t hata verirse Nginx eski çalışan yapılandırmayı korur; hata mesajındaki dosya ve satırı düzeltmeden yeniden yükleme yapmayın. Yükleme limiti değişmiş görünmüyorsa isteğin gerçekten beklenen server veya location bloğuna eşleştiğini ve arada başka bir proxy/CDN bulunup bulunmadığını kontrol edin.Sınır belirlerken önemli ayrımlar
client_max_body_size toplam HTTP istek gövdesini sınırlar. multipart/form-data kullanılıyorsa dosya yanında alan adları ve diğer form verileri de bu toplamın içindedir; bu yüzden dosya boyutuna birebir eşit bir değer yerine küçük bir pay bırakın.client_body_timeout toplam yükleme süresinin sınırı değildir; gövde okunurken ardışık iki okuma arasındaki beklemeyi denetler. Bu aralık aşılırsa Nginx 408 yanıtı verebilir. Yavaş bağlantı nedeniyle kesilen yüklemeyi düzeltmek için yalnızca boyut sınırını artırmak yeterli değildir. Tersine,
client_max_body_size 0; sınır denetimini kaldırır; bu ayarı genel sunucuda kullanmak yerine gereken en büyük dosya boyutunu açıkça belirlemek daha kontrollüdür.Uygulama veya PHP gibi başka bir katman da daha düşük bir yükleme sınırı uyguluyorsa sonuç 413 dışında bir uygulama hatası olabilir. Böyle durumda Nginx değerini yükseltmeden önce isteğin hangi katmanda reddedildiğini yanıt kodu ve uygulama günlükleriyle ayırın.
Sık sorulan sorular
Nginx değişikliğinden sonra 413 hatası devam ederse ne kontrol edilir?
Önce etkin yapılandırmada aynı yol için daha dar bir
location tanımı olup olmadığını ve isteğin doğru sanal sunucuya gittiğini kontrol edin. Nginx 413 döndürmüyorsa arka uç, CDN veya başka bir proxy kendi gövde sınırını uyguluyor olabilir.Dosya yükleme limiti ile bağlantı hızı aynı ayar mıdır?
Hayır.
client_max_body_size boyutu, client_body_timeout ise gönderimin zamanlamasını denetler. Yavaş yükleme sorununda iki ayarı aynı sorunmuş gibi değiştirmek yerine hangi sınırın tetiklendiğini günlüklerden belirleyin.