কীভাবে এনগিনেক্সে রেট-সীমা রাখতে হবে তবে নির্দিষ্ট আইপি ঠিকানাগুলি অন্তর্ভুক্ত / বাদ দিয়ে?


27

আমি limit_reqআমার সার্ভারে সমস্ত অনুরোধগুলি রেট-সীমাবদ্ধ করতে ব্যবহার করতে সক্ষম ।

তবে আমি নির্দিষ্ট আইপি অ্যাড্রেসগুলির জন্য হারের সীমাবদ্ধতা (যেমন শ্বেতলিস্ট) মুছে ফেলতে এবং নির্দিষ্ট অন্যদের জন্য পৃথক হারের সীমাবদ্ধতা (যেমন নির্দিষ্ট আইপি আমি 1r / s এর চেয়ে কম চাই) ব্যবহার করতে চাই।

আমি শর্তসাপেক্ষে (উদাহরণস্বরূপ if ( $remote_addr = "1.2.3.4" ) {}) ব্যবহার করার চেষ্টা করেছি তবে মনে হয় এটি কেবল পুনর্লিখনের নিয়মের সাথে কাজ করে, রেট-সীমা নিয়মের জন্য নয়।

উত্তর:


33

"যদি" নির্দেশনা ব্যবহার করা এড়ানো ভাল তবেই ভাল। সীমা_আরক_জোন (এবং সীমা_কন_জোন) -র কীটি ফাঁকা থাকলে সীমাবদ্ধতা প্রয়োগ করা হয় না। আপনি থ্রটল সীমা প্রয়োগ করা হয়নি এমন আইপিগুলির একটি শ্বেত তালিকা তৈরি করতে আপনি মানচিত্র এবং জিও মডিউলগুলির সাথে একত্রে এটি ব্যবহার করতে পারেন।

এই উদাহরণটি দেখায় যে কীভাবে একক আইপি থেকে উভয় যুগ্ম অনুরোধ এবং অনুরোধের হারের সীমাটি কনফিগার করতে হয়।

http {
    geo $whitelist {
       default 0;
       # CIDR in the list below are not limited
       1.2.3.0/24 1;
       9.10.11.12/32 1;
       127.0.0.1/32 1;
    }

    map $whitelist $limit {
        0     $binary_remote_addr;
        1     "";
    }

    # The directives below limit concurrent connections from a 
    # non-whitelisted IP address to five

    limit_conn_zone      $limit    zone=connlimit:10m;

    limit_conn           connlimit 5;
    limit_conn_log_level warn;   # logging level when threshold exceeded
    limit_conn_status    503;    # the error code to return

    # The code below limits the number requests from a non-whitelisted IP
    # to one every two seconds with up to 3 requests per IP delayed 
    # until the average time between responses reaches the threshold. 
    # Further requests over and above this limit will result 
    # in an immediate 503 error.

    limit_req_zone       $limit   zone=one:10m  rate=30r/m;

    limit_req            zone=one burst=3;
    limit_req_log_level  warn;
    limit_req_status     503;

জোন নির্দেশগুলি অবশ্যই HTTP স্তরে স্থাপন করা উচিত, তবে অন্যান্য নির্দেশাবলী আরও নীচে রাখা যেতে পারে, যেমন সার্ভারে বা অবস্থানের স্তরে তাদের ক্ষেত্র সীমাবদ্ধ করতে বা আরও দরজী সীমাবদ্ধ করতে।

আরও তথ্যের জন্য Nginx ডকুমেন্টেশন ngx_http_limit_req_module এবং ngx_http_limit_conn_module দেখুন


এই 2 মডিউল মধ্যে পার্থক্য কি?
মেনেটে

1
মতামত অনুসারে, প্রথম একযোগে সংযোগগুলি সীমাবদ্ধ করে, দ্বিতীয় সংযোগের হারকে সীমাবদ্ধ করে
shonky linux ব্যবহারকারী 23

সঙ্গে আপনি ব্যাখ্যা করতে পারেন আপনি কেন দুটি পর্যায়ে ম্যাপিং না, geoদ্বারা অনুসরণ mapবরং ব্যবহার করার পরিবর্তে, geoসেট করতে $limitসরাসরি?
মার্কাস ডাউনিং

2
এটি geoকোনও ভেরিয়েবলের মানচিত্র করতে পারে না বলে মনে হয় যদি আপনি $binary_remote_addrম্যাপিংয়ের মান হিসাবে নির্দিষ্ট করেন তবে এটি আক্ষরিক স্ট্রিংয়ে অনুবাদ করবে "$binary_remote_addr", ভেরিয়েবলের মান নয়।
কলিনম 10'16

1
আমি যুক্ত করতে চাই যে প্রশ্নে থাকা আইপি যদি ইতিমধ্যে জোনে থাকে তবে আপনাকে অবশ্যই এনজিএনএক্স পুনরায় চালু করতে হবে ; একটি পুনরায় লোড যথেষ্ট নয়।
হাফগগার

5

আপনি নিরাপদে নামকরণ করা অবস্থানগুলি ব্যবহার করতে পারেন, যেমন একটি (@) ব্লকে "@ অবস্থান"।

দেখুন: http://wiki.nginx.org/IfIsEvil

এর মতো কিছু কাজ করা উচিত:

http {

   limit_req_zone $binary_remote_addr zone=delay:10m rate=1r/m;

   server {
      ...

      error_page 410 = @slowdown;

      if( $remote_addr != "1.2.3.4" ) {
         return 410;
      }

      location @slowdown {
         limit_req zone=delay burst 5;
         ...
      }

      location / {
         ...
      }
   }

"অবস্থান / low n" এর মতো একই তথ্যের সাথে "অবস্থান @ স্লোডাউন {}" পূরণ করুন, যেমন আপনি যদি বিপরীত প্রক্সি হিসাবে এনজিনেক্স ব্যবহার করেন তবে প্রক্সি_পাস।


আমি নিশ্চিত না যে আমি 410 অংশটি বুঝতে পেরেছি? ক্লায়েন্টটি কি আসলে একটি HTTP 410 স্থিতি কোড দেখতে পাবে?
সোভিস্ট

1
বাহ, এটি আসলে কাজ করে! খুব নিফটি error_pageট্রিক, +1! @ স্প্রিসট, এরকম কিছু কীভাবে কাজ করবে এবং কেন হবে তার সম্পূর্ণ ব্যাখ্যা পেতে সার্ভারফল্ট / এ / ৮70০১70০/110020 দেখুন ।
সিএনএসটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.