रेट सीमित करते समय मैं 429 http कोड वापस करने के लिए nginx को कैसे कॉन्फ़िगर करूं?


11

जब मैं थ्रॉटलिंग / दर सीमित कर रहा हूं, तो डिफ़ॉल्ट 503 (सेवा अनुपलब्ध) के बजाय http स्थिति कोड 429 (बहुत सारे अनुरोध) वापस करने के लिए मैं nginx को कैसे कॉन्फ़िगर करूं?

FYI करें, मैं Nginx HttpLimitReqModule के साथ एक रिवर्स प्रॉक्सी के रूप में उपयोग कर रहा हूं। 429 स्टेटस कोड के लिए ड्राफ्ट कल्पना RFC6585 है

Stackexchanged पर यह (बंद) प्रश्न दिखाता है कि error_page निर्देश का उपयोग करना संभव है । हालांकि, मैं एक 429 वापस नहीं करना चाहता हूं अगर वास्तव में सर्वर की समस्या है (ग्राहक हमें बहुत ज्यादा नहीं मार रहा है) और सर्वर को 503 सेवा उपलब्ध नहीं होना चाहिए।

कोई सुझाव?


FYI करें, मैंने इस सुविधा के लिए एक एन्हांसमेंट अनुरोध बनाया है क्योंकि यह सभी 503s से 429s तक मैप किए बिना संभव नहीं है।
अद्राम्बोड

जवाबों:


19

अच्छी खबर है, संस्करण 1.3.15 के साथ http://mailman.nginx.org/pipermail/nginx/2013-March/038x6.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
abसे एक उपकरण है apache2-utils। ubuntu पर यह है, abलेकिन CentOs के तहत यह है ab2
डाइटर

1

VBart की प्रतिक्रिया और अन्य टिप्पणियों के आधार पर, यह स्पष्ट है कि सबसे अच्छा विकल्प 503 त्रुटियों को 429s पर मैप करना है।

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

चूंकि nginx (1.3.x) केवल limit_req और limit_conn के लिए 503 स्थिति कोड का उपयोग करता है, यह एक ठीक दृष्टिकोण होना चाहिए।


यह वह जगह है नहीं सबसे अच्छा विकल्प। 429 एक विशिष्ट उपयोग मामला है, 429 को वापस करने के लिए सभी संभावित 503s (सेवा अनुपलब्ध) की मैपिंग उपयोगकर्ताओं के लिए भ्रामक और अमान्य है। उदाहरण के लिए, एक ग्राहक 429 देख सकता है और एक बैक-ऑफ रिट्री लॉजिक का उपयोग कर सकता है, लेकिन यदि 503 असंबंधित है तो यह थ्रॉटलिंग करने में मदद नहीं करता है।
एडी

0

Nginx स्वयं को कभी भी limit_req और limit_conn के अलावा अन्य मामलों में 503 नहीं लौटाती है।


1
आह, यह दिलचस्प है। तो आप कह रहे हैं कि अगर मैं error_page का उपयोग करते हुए 503 को 429 से बदल देता हूं, तो मैं कभी भी ग्राहकों को बहुत सारे अनुरोध नहीं बताऊंगा, जब तक कि वे वास्तव में कई अनुरोध नहीं भेज रहे हों?
एडाम्ब्रॉड

हां, सच है, लेकिन केवल एक अपवाद के साथ, जो आपने (proxy/factcgi/scgi/uwsgi)_intercept_errorsसक्षम नहीं किया है । nginx.org/r/proxy_intercept_errors
VBart

यह भी संभव है कि nginx द्वारा दिया गया ऐप 503 पर वापस लौटेगा, जिससे क्लाइंट के लिए यह देखना मुश्किल हो जाता है कि यह ऐप से nginx या सर्वर त्रुटि से कनेक्शन सीमा है।
bbaja42
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.