NGINX - ร้องขอให้เร่งเร้าเพื่อป้องกันการละเมิด


28

เหตุผลที่ฉันต้องการทำเช่นนี้เป็นเพราะผู้ใช้พัฒนากับ API ของเราด้วย JavaScript และนักพัฒนาบางคนสับสนและทำให้ผู้เข้าชมสแลมเซิร์ฟเวอร์ด้วยคำขอ AJAX เมื่อสิ่งนี้เกิดขึ้นฉันต้องการที่จะสามารถเร่งการร้องขอ API เพื่อ50 คำขอต่อนาทีหรือสิ่งที่ผลกระทบที่

หมายเหตุ: (โดยเฉพาะอย่างยิ่งฐานข้อมูลเข้มข้น DB ดังนั้นอาจอยู่ในระดับพา ธ มากกว่าเซิร์ฟเวอร์ (เช่น throttle "/ json_api /" แต่ไม่ใช่ "/ static /")

คำตอบ:


36

สิ่งนี้สามารถทำได้โดยใช้LimitReqModuleกับ Nginx แต่ถ้านี้เป็นพร็อกซี่กลับคุณอาจต้องการที่จะลองใหม่จำกัด อัตราการสนับสนุนจาก HAProxy

ฉันพบว่าอัตรา nginx ที่ จำกัด นั้นค่อนข้างสับสนเล็กน้อยเพื่อให้ได้อัตราที่แน่นอนที่คุณต้องการ

แต่โดยทั่วไปคุณมีสิ่งที่ชอบ:

limit_req_zone  $binary_remote_addr  zone=default:10m   rate=50r/m;

ในhttpส่วนและจากนั้นสิ่งต่อไปนี้ในlocationส่วนภายในserverส่วน:

limit_req zone=default burst=10 nodelay;

เพื่อไม่ให้มีบางส่วนเช่น/staticคุณเพียงแค่ทำให้แยกlocationและไม่รวมถึงlimit_reqคำสั่ง (หรือผกผัน)


ขอบคุณ คุณช่วยอธิบายสิ่งที่พวกเขากำลังทำอยู่ (โซน, ระเบิด, nodelay)? และคุณหมายถึงใส่zone=limit_req_zoneแทนหรือเปล่า?
orokusaki

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

2
zone, burst และ nodelay ได้รับการบันทึกไว้ในหน้า Nginx wiki เกี่ยวกับโมดูลการ จำกัด อัตราซึ่งเชื่อมโยงกับคำตอบข้างต้นแล้ว
Mark Stosberg

ไคล์, คุณรู้หรือไม่ว่ามีวิธีการรวมขีด จำกัด อัตราต่อสถานที่กับทริกเกอร์อื่น (เช่น Authorization-Header) ในกรณีของฉันฉันอาจต้องการ จำกัด อัตราผู้ใช้เฉพาะ
นิลส์

1
@Nils AFAICS คุณสามารถใช้$http_authorizationตัวแปรเพื่อกำหนดโซนใหม่โดยที่คีย์คือส่วนหัวดังกล่าวแทนที่จะเป็นที่อยู่ IP เช่นlimit_req_zone $http_authorization zone = per_user : 10m rate = 5r/sจากนั้นใช้per_userโซนในส่วนตำแหน่งที่คุณต้องการ จำกัด อัตราต่อผู้ใช้ ยังไม่ได้ทดสอบฉันแค่อ่านเอกสารและรายการตัวแปร nginx ... แจ้งให้เราทราบหากคุณลองใช้ดู!
idrarig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.