मेरा पहला उत्तर काम करता है लेकिन यह उस मामले के लिए अधिक अनुकूल है जहां सभी अनुरोधों को धीमा करने की आवश्यकता है। मुझे तब से एक समाधान के साथ आना पड़ा है जो मुझे केवल दर-दर-मामले के आधार पर दर सीमा को चालू करने की अनुमति देगा, और निम्न कॉन्फ़िगरेशन के साथ आया था। इसका उपयोग करने से पहले पूरे उत्तर को पढ़ना सुनिश्चित करें, क्योंकि जानने के लिए महत्वपूर्ण बारीकियां हैं।
location/{
if (-f somewhere/sensible/LIMIT) {
echo_sleep 1;
# Yes, we need this here too.
echo_exec /proxy$request_uri;
}
echo_exec /proxy$request_uri;
}
location /proxy/ {
internal;
# Ultimately, all this goes to a Django server.
proxy_pass http://django/;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
}
महत्वपूर्ण नोट: उपस्थिति या आगे के अभाव विभिन्न रास्तों में स्लैश कुछ फ़र्क पड़ता है। उदाहरण के लिए, proxy_pass http://django
, बिना पीछे की स्लैश के, उपरोक्त कोड में पंक्ति के समान ही काम करता है।
ऑपरेशन का सिद्धांत सरल है। अगर फ़ाइल somewhere/sensible/LIMIT
मौजूद है, तो location /
से मेल खाने वाले अनुरोध आगे बढ़ने से पहले एक सेकंड के लिए रुक गए हैं। तो मेरे परीक्षण सूट में, जब मैं नेटवर्क मंदी चाहता हूं, तो मैं फ़ाइल बना देता हूं, और जब मैं मंदी को हटाना चाहता हूं, तो मैं इसे हटा देता हूं। (और मेरे पास क्लीनअप कोड है जो इसे प्रत्येक परीक्षण के बीच हटा देता है।) सिद्धांत में मैं फ़ाइल के मुकाबले इसके लिए चर का उपयोग करना पसंद करूंगा, लेकिन समस्या यह है कि प्रत्येक अनुरोध के साथ वैरिएबल को फिर से शुरू किया जाता है।तो हमारे पास location
ब्लॉक नहीं हो सकता है जो सीमा को चालू करने के लिए एक चर सेट करेगा, और दूसरा इसे बंद करने के लिए। (यह पहली चीज है जिसकी मैंने कोशिश की, और यह चर के जीवनकाल के कारण विफल रहा)। संभवतः पर्ल मॉड्यूल या लुआ का उपयोग कुकीज़ के साथ चर या बेवकूफ बने रहने के लिए संभव होगा, लेकिन मैंने इन मार्गों को नीचे नहीं जाने का फैसला किया है।
महत्वपूर्ण नोट:
यह एक अच्छा विचार nginx का जायजा निर्देशों कि एक प्रतिक्रिया के उत्पादन में परिणाम के साथ echo
मॉड्यूल से निर्देशों (जैसे echo_sleep
और echo_exec
) मिश्रण नहीं है। मैंने शुरुआत में echo_sleep
को proxy_pass
के साथ मिला और खराब परिणाम प्राप्त हुए। यही कारण है कि हमारे पास location /proxy/
ब्लॉक है जो echo
सामान से स्टॉक निर्देशों को अलग करता है। (इस issue देखें एक ऐसी ही संघर्ष है कि एक ब्लॉक विभाजित करके हल किया गया था के लिए।)
दो echo_exec
निर्देशों के अंदर और बाहर if
, कैसे if
काम करता है की वजह से आवश्यक हैं।
internal
निर्देश ग्राहकों को सीधे /proxy/...
यूआरएल का अनुरोध करने से रोकता है।
दुर्भाग्य से, 'tc' केवल लिनक्स के लिए है, लेकिन ओएस एक्स पर प्रकट नहीं होता – jiyinyiyong