হ্যাঁ, অবশ্যই এটি এনজিআইএনএক্সে সম্ভব!
আপনি যা করতে পারেন তা হ'ল নিম্নলিখিত ডিএফএ বাস্তবায়ন :
মানগুলিকে স্বাভাবিক করার জন্য $http_referer
সম্ভবত কিছু রেজেক্স ব্যবহার করে ভিত্তি করে হার সীমাবদ্ধকরণ কার্যকর করুন map
। সীমা অতিক্রম করা হলে, একটি অভ্যন্তরীণ ত্রুটি পৃষ্ঠা উত্থাপিত হয়, যা আপনি কোনও সম্পর্কিত প্রশ্ন অনুসারেerror_page
হ্যান্ডলারের মাধ্যমে ধরতে পারবেন , অভ্যন্তরীণ পুনঃনির্দেশ হিসাবে (নতুন ক্লায়েন্টের কাছে দৃশ্যমান নয়) হিসাবে একটি নতুন অভ্যন্তরীণ স্থানে যান।
সীমা ছাড়িয়ে যাওয়ার জন্য উপরের অবস্থানে, আপনি একটি সতর্কতা অনুরোধ সম্পাদন করুন, বহিরাগত যুক্তি বিজ্ঞপ্তিটি সম্পাদন করতে দিন; এই অনুরোধটি পরবর্তী সময়ে ক্যাশে করা হয়েছে, তা নিশ্চিত করে যে আপনি নির্দিষ্ট সময় উইন্ডোতে কেবল 1 টি অনন্য অনুরোধ পাবেন।
পূর্বের অনুরোধের এইচটিটিপি স্থিতি কোডটি ধরুন (a 300 স্ট্যাটাস কোডটি ফিরিয়ে দিয়ে এবং ব্যবহার করে proxy_intercept_errors on
, বা বিকল্পভাবে, বিল্ট-ইন-বিল্ট-ডিফল্ট ব্যবহার করুন auth_request
বা add_after_body
"ফ্রি" সাব্রাইকেস্ট করতে), এবং আসল অনুরোধটি এমনভাবে সম্পূর্ণ করুন যেন পূর্বের পদক্ষেপ জড়িত ছিল না। নোট করুন যে এটি কাজ করার জন্য আমাদের পুনরাবৃত্ত error_page
হ্যান্ডলিং সক্ষম করতে হবে ।
এখানে আমার পিওসি এবং একটি এমভিপি, https://github.com/cnst/StackOverflow.cnst.nginx.conf/blob/master/sf.432636.detecting-slashdot-effect-in-nginx.conf এও রয়েছে :
limit_req_zone $http_referer zone=slash:10m rate=1r/m; # XXX: how many req/minute?
server {
listen 2636;
location / {
limit_req zone=slash nodelay;
#limit_req_status 429; #nginx 1.3.15
#error_page 429 = @dot;
error_page 503 = @dot;
proxy_pass http://localhost:2635;
# an outright `return 200` has a higher precedence over the limit
}
recursive_error_pages on;
location @dot {
proxy_pass http://127.0.0.1:2637/?ref=$http_referer;
# if you don't have `resolver`, no URI modification is allowed:
#proxy_pass http://localhost:2637;
proxy_intercept_errors on;
error_page 429 = @slash;
}
location @slash {
# XXX: placeholder for your content:
return 200 "$uri: we're too fast!\n";
}
}
server {
listen 2635;
# XXX: placeholder for your content:
return 200 "$uri: going steady\n";
}
proxy_cache_path /tmp/nginx/slashdotted inactive=1h
max_size=64m keys_zone=slashdotted:10m;
server {
# we need to flip the 200 status into the one >=300, so that
# we can then catch it through proxy_intercept_errors above
listen 2637;
error_page 429 @/.;
return 429;
location @/. {
proxy_cache slashdotted;
proxy_cache_valid 200 60s; # XXX: how often to get notifications?
proxy_pass http://localhost:2638;
}
}
server {
# IRL this would be an actual script, or
# a proxy_pass redirect to an HTTP to SMS or SMTP gateway
listen 2638;
return 200 authorities_alerted\n;
}
মনে রাখবেন যে এটি প্রত্যাশার মতো কাজ করে:
% sh -c 'rm /tmp/slashdotted.nginx/*; mkdir /tmp/slashdotted.nginx; nginx -s reload; for i in 1 2 3; do curl -H "Referer: test" localhost:2636; sleep 2; done; tail /var/log/nginx/access.log'
/: going steady
/: we're too fast!
/: we're too fast!
127.0.0.1 - - [26/Aug/2017:02:05:49 +0200] "GET / HTTP/1.1" 200 16 "test" "curl/7.26.0"
127.0.0.1 - - [26/Aug/2017:02:05:49 +0200] "GET / HTTP/1.0" 200 16 "test" "curl/7.26.0"
127.0.0.1 - - [26/Aug/2017:02:05:51 +0200] "GET / HTTP/1.1" 200 19 "test" "curl/7.26.0"
127.0.0.1 - - [26/Aug/2017:02:05:51 +0200] "GET /?ref=test HTTP/1.0" 200 20 "test" "curl/7.26.0"
127.0.0.1 - - [26/Aug/2017:02:05:51 +0200] "GET /?ref=test HTTP/1.0" 429 20 "test" "curl/7.26.0"
127.0.0.1 - - [26/Aug/2017:02:05:53 +0200] "GET / HTTP/1.1" 200 19 "test" "curl/7.26.0"
127.0.0.1 - - [26/Aug/2017:02:05:53 +0200] "GET /?ref=test HTTP/1.0" 429 20 "test" "curl/7.26.0"
%
আপনি দেখতে পাচ্ছেন যে প্রথম অনুরোধের ফলাফলটি একটি সম্মুখ-প্রান্ত এবং একটি ব্যাকএন্ড হিট হিসাবে প্রত্যাশিত হয় (আমাকে সেই জায়গাতে একটি ডামি ব্যাকএন্ড যুক্ত করতে হয়েছিল limit_req
, কারণ return 200
এটি সীমা ছাড়িয়ে অগ্রাধিকার গ্রহণ করবে, সত্যিকারের ব্যাকএন্ডের প্রয়োজন নেই হ্যান্ডলিং বাকি জন্য)।
দ্বিতীয় অনুরোধ সীমা ছাড়িয়ে গেছে, সুতরাং, আমরা সতর্কতা প্রেরণ করি (পেয়েছি 200
), এবং এটি ক্যাশে করে, ফিরে আসছি 429
(300 এর নীচে অনুরোধগুলি ধরা যায় না যে উল্লিখিত সীমাবদ্ধতার কারণে এটি প্রয়োজনীয়), যা পরবর্তীকালে সম্মুখ-প্রান্তে ধরা পড়ে , যা এখন যা করতে চাই তা বিনামূল্যে নিখরচায়।
তৃতীয় অনুরোধটি এখনও সীমা অতিক্রম করছে, তবে আমরা ইতিমধ্যে সতর্কতা প্রেরণ করেছি, সুতরাং কোনও নতুন সতর্কতা প্রেরণ করা হবে না।
সম্পন্ন! গিটহাবে এটি কাঁটাচামচ করতে ভুলবেন না!