ฉันจะกำหนดค่า nginx ให้ส่งคืนรหัส http 429 เมื่อ จำกัด อัตราได้อย่างไร


11

ฉันจะกำหนดค่า nginx เพื่อส่งคืนรหัสสถานะ http 429 (คำขอมากเกินไป) แทนค่าเริ่มต้น 503 (ไม่พร้อมใช้งานบริการ) เมื่อ จำกัด ปริมาณ / อัตราได้อย่างไร

FYI ฉันใช้ nginx เป็น reverse proxy กับ HttpLimitReqModule ข้อมูลจำเพาะร่าง 429 รหัสสถานะเป็นRFC6585

คำถาม (ปิด) นี้ของstackexchanged แสดงว่าเป็นไปได้ที่จะใช้error_page directive อย่างไรก็ตามฉันไม่ต้องการส่งคืน 429 หากมีปัญหาเซิร์ฟเวอร์จริง ๆ (ไม่ใช่ลูกค้าที่ตีเรามากเกินไป) และเซิร์ฟเวอร์ควรส่งคืน 503 Service Unavailable

ข้อเสนอแนะใด ๆ


FYI ฉันได้สร้างคำขอการปรับปรุงสำหรับคุณลักษณะนี้เนื่องจากไม่สามารถทำการแมปทั้งหมด 503 ถึง 429
adambrod

คำตอบ:


19

ข่าวดีกับรุ่น 1.3.15 http://mailman.nginx.org/pipermail/nginx/2013-March/038306.html

เรามีคำสั่ง "limit_req_status" และ "limit_conn_status" ฉันเพิ่งทดสอบพวกเขาบน Gentoo Linux (โปรดทราบว่าคุณต้องมีโมดูล limit_req และ limit_con รวบรวมไว้)

ด้วยการตั้งค่าเหล่านี้ฉันคิดว่าคุณสามารถบรรลุสิ่งที่คุณต้องการ:

limit_req_status 429;
limit_conn_status 429;

ฉันได้ตรวจสอบสิ่งนี้อย่างรวดเร็ว:

ab2 -n 100000 -c 55 "http://127.0.0.1/api/v1

คำขอส่วนใหญ่ที่ล้มเหลวหลังจากเปิดใช้งานคำสั่งเนื่องจากอัตราคำขอสูงและขีด จำกัด ที่กำหนดค่าไว้ใน nginx:

limit_req zone=api burst=15 nodelay;

1
.. อะไรคือ "ab2"
XXL

1
abapache2-utilsเป็นเครื่องมือจาก บน Ubuntu มันเป็นabแต่ภายใต้ CentOS ab2มันเป็น
dieter

1

ตามการตอบสนองของ VBart และความคิดเห็นอื่น ๆ เป็นที่ชัดเจนว่าตัวเลือกที่ดีที่สุดคือการแมปข้อผิดพลาด 503 ถึง 429 วินาที

error_page 503 = 429 /too-many-requests.html

เนื่องจาก nginx (1.3.x) ใช้รหัสสถานะ 503 รายการสำหรับ limit_req และ limit_conn เท่านั้นจึงควรใช้วิธีนี้


นี่ไม่ใช่ตัวเลือกที่ดีที่สุด 429 เป็นกรณีการใช้งานเฉพาะการทำแผนที่ 503s ที่อาจเกิดขึ้นทั้งหมด (บริการไม่พร้อมใช้งาน) เพื่อส่งกลับ 429 เป็นการหลอกลวงและไม่ถูกต้องสำหรับผู้ใช้ ตัวอย่างเช่นลูกค้าอาจเห็น 429 และใช้ตรรกะลองใหม่แบบแบ็คออฟ แต่ถ้า 503 ไม่เกี่ยวข้องกับการควบคุมปริมาณมันไม่ได้ช่วยอะไรเลย
Eddie

0

Nginx เองจะไม่ส่งคืน 503 ในกรณีอื่นนอกจาก limit_req และ limit_conn


1
น่าสนใจมาก คุณกำลังบอกว่าถ้าฉันแทนที่ 503 ด้วย 429 โดยใช้ error_page ฉันจะไม่บอกลูกค้าคำขอมากเกินไปจนกว่าพวกเขาจะส่งคำขอมากเกินไปจริงหรือ
adambrod

ใช่จริง แต่มีข้อยกเว้นเพียงข้อเดียวเท่านั้นที่คุณไม่ได้(proxy/factcgi/scgi/uwsgi)_intercept_errorsเปิดใช้งาน nginx.org/r/proxy_intercept_errors
VBart

อาจเป็นไปได้ว่าแอปที่ให้บริการโดย nginx จะคืนค่า 503 ซึ่งทำให้ลูกค้าเห็นได้ยากว่ามันคือขีด จำกัด การเชื่อมต่อจากข้อผิดพลาด nginx หรือเซิร์ฟเวอร์จากแอป
bbaja42
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.