nginx - client_max_body_size nie ma wpływu

205

nginx ciągle mówi client intended to send too large body. Wskazały mnie Googling i RTM client_max_body_size. Ustawiłem go 200mna, nginx.confa także vhost confponownie uruchomiłem Nginx kilka razy, ale wciąż pojawia się komunikat o błędzie.

Czy coś przeoczyłem? Backend jest php-fpm( max_post_sizei max_upload_file_sizesą odpowiednio ustawione).

q_no
źródło
4
Wystąpił problem z parametrem client_max_body_size przy włączonym SSL. Właśnie dostałem ten sam problem w przypadku trwałej wersji nginx i ignoruje tę dyrektywę w bezpiecznych połączeniach. Wciąż szukam rozwiązania.
Neolo
14
W przypadku, gdy ktoś inny przejmie to: Nginx 1.1.19 (na Ubuntu 12.04) wydaje się ignorować client_max_body_size w dyrektywie „http”, chociaż w przypadku „server” jest to w porządku. Wydaje się, że zostało to wprowadzone w aktualizacji w ciągu ostatnich 6 miesięcy, ponieważ dla mnie ten sam plik konfiguracyjny na tym samym serwerze działał.
Dave
1
@Dave, a jeśli przyjedziesz tutaj w 2018 roku, wydaje się to naprawione - client_max_body_sizew httpsekcji ma oczekiwany efekt w wersji
1.14.1
Sprawdza to nagłówek długości treści (przynajmniej w 1.4.6), więc jeśli przesyłany jest duży plik z nieokreśloną długością treści lub ustawioną długością treści na wartość mniejszą niż maksymalny rozmiar ciała, to nie uruchomi HTTP 413
Charles L.

Odpowiedzi:

131

Postępując zgodnie z dokumentacją nginx , możesz ustawić client_max_body_size 20m (lub dowolną potrzebną wartość) w następującym kontekście:

context: http, server, location
nembleton
źródło
20
Nie działało to dla mnie w lokalizacji, działało w kontekście serwera. Nie jestem pewien, czy to zostało zastąpione, nie mogę powiedzieć.
Dipen
@Dipen: Interesujące. Jaką wersję NGinx posiadasz?
nembleton
7
To samo, co powiedział Dipen, z wyjątkiem tego, że nie mogę dostać go do serwera {} lub bloku lokalizacji {} ... działa tylko w kontekście http {}. Nieparzysty
Robbie,
4
Mogę potwierdzić, że działa tylko na nginx / 1.4.1 działającym na Debian GNU / Linux 7.1 (wheezy) w sekcji http {}.
Fernando Kosh,
Potwierdzenie ustawienia nie powiedzie się po włączeniu httplub locationustawieniach. Działa, gdy jest ustawiony na serverpoziomie. nginx / 1.4.4
AlbertEngelB
104

W końcu duże pliki do przesyłania NGINX z powodzeniem działają na hostowanych stronach WordPress (zgodnie z sugestiami nembleton i rjha94)

Pomyślałem, że może to być pomocne dla kogoś, jeśli dodam trochę wyjaśnienia do ich sugestii. Na początek upewnij się, że umieściłeś dyrektywę zwiększonego przesyłania w WSZYSTKICH TRZY oddzielnych blokach definicji (serwer, lokalizacja i http). Każdy powinien mieć osobny wpis wiersza. Wynik polubi coś takiego (gdzie ... odzwierciedla inne linie w bloku definicji):

http {
    ...
    client_max_body_size 200M;
}    

(w mojej konfiguracji ISPconfig 3 ten blok znajduje się w pliku /etc/nginx/nginx.conf)

server {
    ...
    client_max_body_size 200M;
}

location / {
    ...
    client_max_body_size 200M;
} 

(w mojej konfiguracji ISPconfig 3 te bloki znajdują się w pliku /etc/nginx/conf.d/default.conf)

Upewnij się także, że plik php.ini twojego serwera jest zgodny z tymi ustawieniami NGINX. W moim przypadku zmieniłem ustawienie w sekcji File_Uploads php.ini, aby czytać:

upload_max_filesize = 200M

Uwaga: jeśli zarządzasz konfiguracją ISPconfig 3 (moja konfiguracja dotyczy CentOS 6.3, zgodnie z The Perfect Server ), będziesz musiał zarządzać tymi wpisami w kilku osobnych plikach. Jeśli twoja konfiguracja jest podobna do konfiguracji krok po kroku, pliki conf NGINX, które musisz zmodyfikować, znajdują się tutaj:

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

Mój plik php.ini znajdował się tutaj:

/etc/php.ini

Nadal przeoczyłem blok http {} w pliku nginx.conf. Najwyraźniej przeoczenie tego skutkowało ograniczeniem przesyłania do domyślnego limitu 1M. Po dokonaniu powiązanych zmian będziesz również musiał ponownie uruchomić usługi NGINX i PHP FastCGI Process Manager (PHP-FPM). W powyższej konfiguracji używam następujących poleceń:

/etc/init.d/nginx restart
/etc/init.d/php-fpm restart
jadik
źródło
24
Sugeruję użycie /etc/init.d/nginx reloadzamiast tego. Dodało to korzyści, takie jak „jeśli konfiguracja jest nieprawidłowa”, NginX nie przestanie działać.
Hengjie,
Dziękuję, to było dla mnie bardzo pomocne! Rozwiązałem mój problem po włamaniu się z wieloma różnymi ustawieniami plików php.ini itp.
Yos
Małe litery m działały dla nas. client_max_body_size 100m;
so_mv
13
@Hengjie Polecam zamiast tego użyć nginx -t(testuje składnię pliku konfiguracyjnego), a następnie nginx -s reload(faktycznie przeładowuje).
Anoyz
Muszę tylko zaznaczyć, że w moim błądzącym pudełku były dwa pliki ini - /etc/php5/cli/php.ini i /etc/php5/fpm/php.ini, a załadowana konfiguracja Symfony to fpm. Więc nie zapomnij edytować tego.
Jalal
65

W marcu 2016 r. Napotkałem ten problem, próbując POST json przez https (z żądań Pythona, ale to nie ma znaczenia).

Sztukąhttp {}server {} jest umieszczenie „client_max_body_size 200M;” w co najmniej dwóch miejscach i :

1.http katalogu

  • Zazwyczaj w /etc/nginx/nginx.conf

2.server katalog w vhost.

  • Dla użytkowników Debiana / Ubuntu, którzy zainstalowali się za pośrednictwem apt-get (i innych menedżerów pakietów dystrybucyjnych, którzy domyślnie instalują nginx z vhostami), to /etc/nginx/sites-available/mysite.comznaczy, dla tych, którzy nie mają vhostów, prawdopodobnie jest to twój nginx.conf lub w tym samym katalogu, co on.

3.location / katalog w tym samym miejscu co 2.

  • Możesz być bardziej szczegółowy niż /, ale jeśli w ogóle nie działa, zaleciłbym zastosowanie tego do, /a następnie, gdy jego działanie będzie bardziej szczegółowe.

Pamiętaj - jeśli masz SSL, będziesz musiał ustawić powyższe dla SSL, servera locationtakże, gdziekolwiek to może być (najlepiej tak samo jak 2. ). Odkryłem, że jeśli twój klient spróbuje przesłać na http i oczekujesz, że dostanie 301 do https, nginx faktycznie porzuci połączenie przed przekierowaniem z powodu zbyt dużego pliku dla serwera http, więc musi to być w obu .

Ostatnie komentarze sugerują, że jest problem z SSL w nowszych wersjach nginx, ale mam 1.4.6 i wszystko jest dobrze :)

JJ
źródło
3
Dokumentacja podaje domyślną wartość „1m”, która okazała się mieć 1 megabajt - a nie 1 megabit. Myślę, że - choć jeszcze tego nie przetestowałem - zawsze ma rozmiar megabajta.
Thomas
2
@Thomas tak, zawsze było m, a nie M, więc na pewno jest to megabajt, ponieważ sam przeprowadziłem test.
CppLearner,
1
Dziękuję wam obojgu - usunąłem bit bit / bajt.
JJ
2
Począwszy od 2018 r. I wersji 1.14.1 nginx, wydaje się to naprawione - zostało client_max_body_sizeto uhonorowane w sekcji httpbez potrzeby dodawania go gdzie indziej.
DomQ,
27

Musisz zastosować następujące zmiany:

  1. Zaktualizuj php.ini(Znajdź odpowiedni plik ini z phpinfo();) i zwiększ post_max_sizei upload_max_filesizedostosuj do odpowiedniego rozmiaru:

    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. Aktualizacja nginx ustawienia swojej stronie i dodać client_max_body_sizewartość w swojej location, httplub serverkontekstu.

    location / {
        client_max_body_size 200m;
        ...
    }
    
  3. Uruchom ponownie NginX i PHP-FPM:

    service nginx restart
    service php5-fpm restart
    

UWAGA: Kiedyś (w moim przypadku prawie za każdym razem) musisz zabić php-fpm proces, jeśli nie został poprawnie odświeżony poleceniem serwisowym. Aby to zrobić, możesz uzyskać listę procesów ( ps -elf | grep php-fpm) i zabijać jeden po drugim ( kill -9 12345) lub użyć następującego polecenia, aby zrobić to za Ciebie:

ps -elf | grep php-fpm | grep -v grep | awk '{ print $4 }' | xargs kill -9
Qorbani
źródło
12

Sprawdź, czy ustawiasz dyrektywę client_max_body_size w bloku http {}, a nie wewnątrz bloku {}. Ustawiłem go w bloku http {} i działa

rjha94
źródło
11

Ktoś mnie poprawi, jeśli to źle, ale lubię blokować wszystko tak bardzo, jak to możliwe, a jeśli masz tylko jeden cel do przesyłania (jak to zwykle bywa), po prostu skieruj zmiany do tego jednego pliku. Działa to dla mnie na pakiet Ubuntu nginx-extras mainline 1.7+:

location = /upload.php {
    client_max_body_size 102M;
    fastcgi_param PHP_VALUE "upload_max_filesize=102M \n post_max_size=102M";
    (...)
}
digitaltoast
źródło
Ten pomysł też mi się podoba, ale dla mnie to nie działa w ten sposób. Wszystko, co mogę zrobić, to zmniejszyć wartość i nie zwiększać jej na poziomie lokalizacji.
Geza Turi,
4

Miałem ostatnio podobny problem i odkryłem, że client_max_body_size 0;można go rozwiązać. Spowoduje to ustawienie client_max_body_size na brak limitu. Ale najlepszą praktyką jest poprawa kodu, więc nie ma potrzeby zwiększania tego limitu.

Adrián Molčan
źródło
3

Zakładając, że ustawiłeś już rozmiar klienta_max_body_size i różne ustawienia PHP (upload_max_filesize / post_max_size itp.) W innych odpowiedziach, a następnie ponownie uruchomiłeś lub ponownie załadowałem NGINX i PHP bez żadnego wyniku, uruchom ten ...

nginx -T

To da ci nierozwiązane błędy w twoich konfiguracjach NGINX. W moim przypadku walczyłem z błędem 413 przez cały dzień, zanim zdałem sobie sprawę, że były jeszcze inne nierozwiązane błędy SSL w konfiguracji NGINX (niewłaściwe ścieżki dla certyfikatów), które wymagały naprawy. Gdy naprawiłem nierozwiązane problemy, które otrzymałem z 'nginx-T', ponownie załadowałem NGINX i EUREKA !! To naprawiło to.

P-Didz
źródło
3

Konfiguruję serwer deweloperów, aby grać z tymi serwerami lustrzanymi naszego przestarzałego live, użyłem The Perfect Server - Ubuntu 14.04 (nginx, BIND, MySQL, PHP, Postfix, Dovecot i ISPConfig 3)

Po napotkaniu tego samego problemu natrafiłem na ten post i nic nie działało. Zmieniłem wartość w każdym zalecanym pliku (nginx.conf, ispconfig.vhost, / sites-available / default itp.)

Wreszcie, zmiana client_max_body_sizew moim /etc/nginx/sites-available/apps.vhosti restartowanie nginx jest tym, co załatwiło sprawę. Mam nadzieję, że pomaga komuś innemu.

Jeramiah Harland
źródło
3

Napotykam ten sam problem, ale nie znalazłem nic wspólnego z nginx. Używam nodejs jako serwera zaplecza, używam nginx jako odwrotnego proxy, kod 413 jest uruchamiany przez serwer węzła. użycie węzła koa parsuje ciało. koa ogranicza długość urlencoded.

formLimit: limit urlencodowanego ciała. Jeśli ciało ostatecznie przekroczy ten limit, zwracany jest kod błędu 413. Domyślnie jest to 56kb.

ustawienie formLimit na większe może rozwiązać ten problem.

pangpang
źródło
0

Miałem ten sam problem, co client_max_body_size dyrektywa została zignorowana.

Mój głupi błąd polegał na tym, że włożyłem do niego plik, /etc/nginx/conf.dktóry się nie kończył .conf. Nginx nie ładuje ich domyślnie.

Philippe Gerber
źródło
-2

Jeśli używasz systemu Windows w wersji nginx, możesz spróbować zabić cały proces nginx i uruchomić go ponownie, aby zobaczyć. Napotkałem ten sam problem w moim środowisku, ale rozwiązałem go za pomocą tego rozwiązania.

nathan.xu
źródło
To był mój problem, dziękuję! Pewnie jedna instancja Nginx nie została poprawnie zamknięta. Nigdy nie jest źle sprawdzać, czy jest zamykane w oknachtasklist /fi "imagename eq nginx.exe"
Valery Baranov