nginx - client_max_body_size ไม่มีผลใด ๆ


205

nginx พูดclient intended to send too large bodyต่อไป Googling และ RTM client_max_body_sizeชี้ให้ฉันไป ผมตั้งค่าให้200mในnginx.confเช่นเดียวกับในvhost conf, Nginx เริ่มต้นใหม่สองสามครั้ง แต่ฉันยังคงได้รับข้อผิดพลาด

ฉันมองข้ามบางสิ่งไปหรือเปล่า แบ็กเอนด์คือphp-fpm( max_post_sizeและmax_upload_file_sizeตั้งค่าตามความเหมาะสม)


4
มีปัญหากับ client_max_body_size บน SSL ที่เปิดใช้งาน ฉันเพิ่งมีปัญหาเดียวกันกับรุ่น nginx ที่ผ่านมาและมันไม่สนใจคำสั่งในการเชื่อมต่อที่ปลอดภัย ยังคงมองหาวิธีแก้ปัญหา
Neolo

14
ในกรณีที่คนอื่น googles นี้: Nginx 1.1.19 (บน Ubuntu 12.04) ดูเหมือนจะไม่สนใจ client_max_body_size ในคำสั่ง 'http' ถึงแม้ว่ามันจะดีกับมันใน 'เซิร์ฟเวอร์' ดูเหมือนว่าจะมีการนำมาใช้ในการอัปเดตในช่วง 6 เดือนที่ผ่านมาเพราะสำหรับฉันไฟล์ config เดียวกันบนเซิร์ฟเวอร์เดียวกันที่ใช้งานได้
เดฟ

1
@Dave และถ้าคุณมาที่นี่ในปี 2018 ดูเหมือนว่าจะได้รับการแก้ไข - client_max_body_sizeในhttpส่วนนี้จะมีผลกับ nginx รุ่น 1.14.1
DomQ

วิธีนี้จะตรวจสอบส่วนหัวความยาวเนื้อหา (อย่างน้อยใน 1.4.6) ดังนั้นหากไฟล์ขนาดใหญ่ถูกอัปโหลดด้วยความยาวเนื้อหาที่ไม่ได้ตั้งค่าหรือความยาวเนื้อหาตั้งค่าเป็นน้อยกว่าขนาดร่างกายสูงสุดจะไม่เปิด HTTP 413
Charles L.

คำตอบ:


131

การติดตามเอกสาร nginxคุณสามารถตั้งค่า client_max_body_size 20m (หรือค่าใด ๆ ที่คุณต้องการ) ในบริบทต่อไปนี้:

context: http, server, location

20
มันไม่ทำงานสำหรับฉันในสถานที่ทำงานในบริบทเซิร์ฟเวอร์ ไม่แน่ใจว่ามันถูกเขียนทับหรือไม่ไม่สามารถพูดได้
Dipen

@Dipen: น่าสนใจ คุณมี NGinx รุ่นใด
nembleton

7
เหมือนที่ Dipen พูดยกเว้นฉันไม่สามารถรับมันได้ในเซิร์ฟเวอร์ {} หรือที่ตั้ง {} บล็อก ... มันใช้ได้ในบริบท http {} เท่านั้น คี่
Robbie

4
ฉันสามารถยืนยันได้ว่าใช้งานได้กับ nginx / 1.4.1 เท่านั้นที่ทำงานบน Debian GNU / Linux 7.1 (เสียงฮืด) ในส่วน http {}
Fernando Kosh

การยืนยันการตั้งค่าล้มเหลวเมื่อตั้งค่าhttpหรือlocationตั้งค่า ทำงานเมื่อตั้งค่าในserverระดับ nginx / 1.4.4
AlbertEngelB

104

การอัปโหลดขนาดใหญ่ของ NGINX นั้นประสบความสำเร็จในการทำงานกับไซต์ WordPress ที่โฮสต์ในที่สุด (ตามคำแนะนำจาก nembleton & rjha94)

ฉันคิดว่ามันอาจจะมีประโยชน์สำหรับใครบางคนถ้าฉันเพิ่มคำอธิบายเล็กน้อยลงในคำแนะนำของพวกเขา สำหรับผู้เริ่มต้นโปรดตรวจสอบให้แน่ใจว่าคุณได้รวมคำสั่งการอัปโหลดที่เพิ่มขึ้นของคุณในบล็อกการแยกคำจำกัดความทั้งหมดสามรายการ (เซิร์ฟเวอร์ที่ตั้ง & http) แต่ละรายการควรมีรายการแยกต่างหาก ผลลัพธ์จะเป็นดังนี้ (ที่ ... แสดงถึงบรรทัดอื่น ๆ ในบล็อกคำจำกัดความ):

http {
    ...
    client_max_body_size 200M;
}    

(ในการตั้งค่า ISPconfig 3 ของฉันบล็อกนี้อยู่ในไฟล์ /etc/nginx/nginx.conf)

server {
    ...
    client_max_body_size 200M;
}

location / {
    ...
    client_max_body_size 200M;
} 

(ในการตั้งค่า ISPconfig 3 ของฉันบล็อกเหล่านี้อยู่ในไฟล์ /etc/nginx/conf.d/default.conf)

ตรวจสอบให้แน่ใจว่าไฟล์ php.ini ของเซิร์ฟเวอร์ของคุณสอดคล้องกับการตั้งค่า NGINX เหล่านี้ ในกรณีของฉันฉันเปลี่ยนการตั้งค่าในส่วน File_Uploads ของ php.ini เพื่ออ่าน:

upload_max_filesize = 200M

หมายเหตุ: หากคุณกำลังจัดการการตั้งค่า ISPconfig 3 (การตั้งค่าของฉันคือ CentOS 6.3 ตามThe Perfect Server ) คุณจะต้องจัดการรายการเหล่านี้ในไฟล์แยกต่างหากหลายไฟล์ หากการกำหนดค่าของคุณคล้ายกับการตั้งค่าทีละขั้นตอนไฟล์ NGINX conf ที่คุณต้องแก้ไขจะอยู่ที่นี่:

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

ไฟล์ php.ini ของฉันอยู่ที่นี่:

/etc/php.ini

ฉันมองข้ามบล็อก http {} ในไฟล์ nginx.conf ต่อไป เห็นได้ชัดว่าการมองเห็นสิ่งนี้มีผลต่อการ จำกัด การอัปโหลดเป็นขีด จำกัด เริ่มต้น 1M หลังจากทำการเปลี่ยนแปลงที่เกี่ยวข้องคุณจะต้องแน่ใจว่าได้เริ่มบริการ NGINX และ PHP FastCGI Process Manager (PHP-FPM) อีกครั้ง จากการกำหนดค่าข้างต้นฉันใช้คำสั่งต่อไปนี้:

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

24
ฉันอยากจะแนะนำให้คุณใช้/etc/init.d/nginx reloadแทน สิ่งนี้ได้เพิ่มประโยชน์เช่น 'ถ้าการกำหนดค่าผิด' NginX จะไม่หยุดทำงาน
Hengjie

ขอบคุณนี่มีประโยชน์จริง ๆ สำหรับฉัน! แก้ไขปัญหาของฉันหลังจากที่แฮ็คโดยมีการตั้งค่าไฟล์ php.ini ที่แตกต่างกันจำนวนมาก
Yos

ตัวพิมพ์เล็ก m ทำงานให้เรา client_max_body_size 100m;
so_mv

13
@Hengjie ฉันอยากจะแนะนำให้ใช้nginx -t(ทดสอบไวยากรณ์ไฟล์การกำหนดค่า) และจากนั้นnginx -s reload(ทำการโหลดจริง) แทน
Anoyz

เพียงแค่ต้องชี้ให้เห็นว่าในกล่องคนจรจัดของฉันมีสองไฟล์ ini - /etc/php5/cli/php.ini และ /etc/php5/fpm/php.ini และการกำหนดค่าที่โหลดของ Symfony คือไฟล์ fpm ดังนั้นอย่าลืมแก้ไขอันนี้
Jalal

65

เมื่อวันที่มีนาคม 2559ฉันพบปัญหาในการพยายามโพสต์ json ผ่านทาง https (จากคำขอไพ ธ อนไม่ใช่เรื่องสำคัญ)

เคล็ดลับคือการใส่"client_max_body_size 200M;" อย่างน้อยสองแห่ง http {}และserver {} :

1.httpไดเรกทอรี

  • โดยทั่วไปแล้วค่ะ /etc/nginx/nginx.conf

2.serverไดเรกทอรีใน vhost ของคุณ

  • สำหรับผู้ใช้ Debian / Ubuntu ที่ติดตั้งผ่าน apt-get (และผู้จัดการแพคเกจ distro อื่น ๆ ที่ติดตั้ง nginx ด้วย vhosts เป็นค่าเริ่มต้น) นั่น/etc/nginx/sites-available/mysite.comคือสำหรับผู้ที่ไม่มี vhosts อาจเป็น nginx.conf ของคุณหรือในไดเรกทอรีเดียวกัน

3.location /ไดเรกทอรีในสถานที่เดียวกันกับ2

  • คุณสามารถเฉพาะเจาะจงกว่า/นั้นได้ แต่ถ้ามันไม่ทำงานเลยฉันขอแนะนำให้ใช้สิ่งนี้กับมัน/และเมื่อมันทำงานได้เฉพาะเจาะจงมากขึ้น

โปรดจำไว้ว่า - ถ้าคุณมี SSL ที่จะทำให้คุณต้องตั้งค่าข้างต้นสำหรับใบรับรอง SSL serverและlocationเกินไปที่ใดก็ตามที่อาจจะ (นึกคิดเช่นเดียวกับ2 ) เราพบว่าหากลูกค้าของคุณพยายามอัพโหลดบน http และคุณคาดหวังว่าพวกเขาจะได้รับ 301 จาก https, nginx จะทำการเชื่อมต่อก่อนการเปลี่ยนเส้นทางเนื่องจากไฟล์มีขนาดใหญ่เกินไปสำหรับเซิร์ฟเวอร์ http ดังนั้นจึงต้อง ในทั้งสอง

ความคิดเห็นล่าสุดแนะนำว่ามีปัญหาในเรื่องนี้กับ SSL ที่มีเวอร์ชัน nginx ที่ใหม่กว่า แต่ฉันเป็น 1.4.6 และทุกอย่างดี :)


3
เอกสารระบุว่าค่าเริ่มต้นเป็น "1m" ซึ่งกลายเป็น 1 เมกะไบต์ - ไม่ใช่ 1 เมกะบิต ฉันคิดว่า - แม้ว่าฉันยังไม่ได้ทดสอบมันก็เป็นเมกะไบต์เสมอ
โทมัส

2
@ โทมัสใช่แล้วไม่ใช่เอ็มเสมอดังนั้นมันจึงเป็นเมกะไบต์อย่างแน่นอนเพราะฉันทำการทดสอบด้วยตัวเอง
CppLearner

1
ขอบคุณทั้งคู่ - ฉันลบบิต / ไบต์แล้ว
JJ

2
ตั้งแต่ปี 2018 และ nginx เวอร์ชั่น 1.14.1 ดูเหมือนว่าจะได้รับการแก้ไข - client_max_body_sizeได้รับเกียรติในส่วนhttpโดยไม่จำเป็นต้องเพิ่มที่อื่น
DomQ

27

คุณต้องใช้การเปลี่ยนแปลงต่อไปนี้:

  1. อัปเดตphp.ini(ค้นหาไฟล์ ini ที่ถูกต้องจากphpinfo();) และเพิ่มpost_max_sizeและupload_max_filesizeปรับขนาดตามที่คุณต้องการ:

    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. ปรับปรุงการตั้งค่า Nginx สำหรับเว็บไซต์ของคุณและเพิ่มclient_max_body_sizeค่าในของคุณlocation, httpหรือserverบริบท

    location / {
        client_max_body_size 200m;
        ...
    }
    
  3. รีสตาร์ท NginX และ PHP-FPM:

    service nginx restart
    service php5-fpm restart
    

หมายเหตุ: บางครั้ง (ในกรณีของฉันเกือบทุกครั้ง) คุณต้องฆ่าphp-fpmกระบวนการหากไม่ได้รีเฟรชโดยคำสั่งบริการอย่างถูกต้อง ในการทำเช่นนั้นคุณสามารถรับรายการกระบวนการ ( ps -elf | grep php-fpm) และฆ่าทีละรายการ ( kill -9 12345) หรือใช้คำสั่งต่อไปนี้เพื่อทำเพื่อคุณ:

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

12

โปรดดูว่าคุณกำลังตั้งค่า client_max_body_size คำสั่งภายใน http {} บล็อกและไม่อยู่ในตำแหน่ง {} บล็อก ฉันได้ตั้งค่าไว้ใน http {} บล็อกและทำงานได้


11

มีคนแก้ไขฉันหากสิ่งนี้ไม่ดี แต่ฉันชอบที่จะล็อคทุกอย่างให้มากที่สุดเท่าที่จะเป็นไปได้และถ้าคุณมีเป้าหมายเดียวสำหรับการอัปโหลด (ตามปกติจะเป็นกรณี) จากนั้นเพียงกำหนดเป้าหมายการเปลี่ยนแปลงของคุณ สิ่งนี้ใช้ได้กับฉันใน 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";
    (...)
}

ฉันชอบความคิดนี้เช่นกัน แต่สำหรับฉันมันไม่ทำงานด้วยวิธีนี้ สิ่งที่ฉันทำได้คือลดค่าและไม่เพิ่มในระดับสถานที่
Geza Turi

4

ฉันพบปัญหาที่คล้ายกันเมื่อเร็ว ๆ นี้และพบว่าclient_max_body_size 0;สามารถแก้ไขปัญหาดังกล่าวได้ สิ่งนี้จะตั้งค่าclient_max_body_sizeเป็นไม่ จำกัด แต่วิธีปฏิบัติที่ดีที่สุดคือการปรับปรุงโค้ดของคุณดังนั้นจึงไม่จำเป็นต้องเพิ่มขีด จำกัด นี้


3

สมมติว่าคุณได้ตั้งค่า client_max_body_size และการตั้งค่า PHP ต่าง ๆ (upload_max_filesize / post_max_size ฯลฯ ) ไว้ในคำตอบอื่น ๆ จากนั้นรีสตาร์ทหรือโหลดใหม่ NGINX และ PHP โดยไม่มีผลใด ๆ เรียกใช้สิ่งนี้ ...

nginx -T

สิ่งนี้จะทำให้คุณมีข้อผิดพลาดที่ยังไม่ได้แก้ไขในการกำหนดค่า NGINX ของคุณ ในกรณีของฉันฉันต่อสู้กับข้อผิดพลาด 413 ทั้งวันก่อนที่ฉันจะรู้ว่ามีข้อผิดพลาด SSL ที่ไม่ได้รับการแก้ไขอื่น ๆ ในการกำหนดค่า NGINX (การกำหนดเส้นทางผิดสำหรับ certs) ที่ต้องแก้ไข เมื่อฉันแก้ไขปัญหาที่ยังไม่ได้แก้ไขฉันได้รับจาก 'nginx -T', โหลด NGINX และ EUREKA อีกครั้ง !! ที่แก้ไขมัน


3

ฉันตั้งค่าเซิร์ฟเวอร์ dev เพื่อเล่นกับมิเรอร์สดที่ล้าสมัยของเราฉันใช้เซิร์ฟเวอร์ที่สมบูรณ์แบบ - Ubuntu 14.04 (nginx, BIND, MySQL, PHP, Postfix, Dovecot และ ISPConfig 3)

หลังจากประสบปัญหาเดียวกันฉันเจอโพสต์นี้และไม่มีอะไรทำงาน ฉันเปลี่ยนค่าในทุกไฟล์ที่แนะนำ (nginx.conf, ispconfig.vhost, / sites-available / default เป็นต้น)

ในที่สุดการเปลี่ยนnginx client_max_body_sizeของฉัน/etc/nginx/sites-available/apps.vhostและเริ่มใหม่เป็นสิ่งที่หลอกลวง หวังว่ามันจะช่วยให้คนอื่น


3

ฉันพบปัญหาเดียวกัน แต่ฉันพบว่าไม่มีอะไรเกี่ยวข้องกับ nginx ฉันกำลังใช้ nodejs เป็นเซิร์ฟเวอร์แบ็กเอนด์ใช้ nginx เป็นพร็อกซีย้อนกลับรหัส 413 ถูกทริกเกอร์โดยโหนดเซิร์ฟเวอร์ โหนดใช้koaแยกวิเคราะห์ร่างกาย koa จำกัดความยาวของ urlencoded

formLimit: ขีด จำกัด ของเนื้อหา urlencoded หากเนื้อหามีขนาดใหญ่กว่าขีด จำกัด นี้จะมีการส่งคืนรหัสข้อผิดพลาด 413 ค่าเริ่มต้นคือ 56kb

กำหนด formLimit ให้ใหญ่ขึ้นสามารถแก้ปัญหานี้ได้


0

มีปัญหาเดียวกันกับclient_max_body_sizeคำสั่งที่ถูกละเลย

ข้อผิดพลาดโง่ของฉันเป็นที่ฉันใส่ในแฟ้มซึ่งไม่ได้จบลงด้วย/etc/nginx/conf.d .confNginx จะไม่โหลดสิ่งเหล่านี้ตามค่าเริ่มต้น


-2

หากคุณใช้ windows รุ่น nginx คุณสามารถลองฆ่ากระบวนการ nginx ทั้งหมดและเริ่มต้นใหม่เพื่อดู ฉันพบปัญหาเดียวกันในสภาพแวดล้อมของฉัน แต่แก้ไขได้ด้วยวิธีนี้


นั่นคือปัญหาของฉันขอบคุณ! อินสแตนซ์ Nginx หนึ่งตัวไม่ได้ออกอย่างถูกต้องฉันเดาว่า ไม่เคยเลวร้ายที่จะตรวจสอบว่ามีการออกจากหน้าต่างหรือไม่tasklist /fi "imagename eq nginx.exe"
Valery Baranov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.