مشاكل حد المعدل بالرغم من أن IP في القائمة البيضاء

نحن نستخدم Discourse في حاوية Docker. لدينا حدود للمعدل معدة بعنوان IP مدرج في القائمة البيضاء. ومع ذلك، ما زلنا نتلقى أخطاء تجاوز حدود المعدل عند إجراء طلبات من هذا الـ IP. أنا متأكد من أن إعداد Nginx صحيح، إليك كيف يبدو:

geo $limit {
    default 1;
    1.1.1.1 0; # ليس الـ IP الحقيقي
}

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

limit_req_zone $limit_key zone=flood:10m rate=12r/s;
limit_req_zone $limit_key zone=bot:10m rate=200r/m;
limit_req_status 429;
limit_conn_zone $limit_key zone=connperip:10m;
limit_conn_status 429;

...
  location @discourse {
    limit_conn connperip 20;
    limit_req zone=flood burst=12 nodelay;
    limit_req zone=bot burst=100 nodelay;
   ...
  }

تم تكوين Nginx لتسجيل خطأ في حالة الوصول إلى حد المعدل ونحن بالفعل نرى بعض رسائل السجل - ولكن لا شيء من الـ IP المدرج في القائمة البيضاء. ومع ذلك، ما زلنا نتلقى الكثير من رسائل 429 عند إجراء طلبات من الـ IP المدرج في القائمة البيضاء. عناوين URL للطلبات هي ملفات تعريف المستخدمين (على سبيل المثال، /users/foo.json). هل هناك نوع من حدود المعدل في Discourse نفسها؟

إعجابَين (2)

مرحباً، Nginx يدير بالفعل تحديد المعدل كما ذكرت، ولكن لدى Discourse أيضًا طريقته الخاصة لإدارة تحديد المعدل على مستوى التطبيق. لدى سام مقال مثير للاهتمام حول هذا الموضوع:

الشيء الوحيد الذي أتساءل عنه هو ما إذا كان يمكننا بالفعل تحديد المعدل مع استثناءات (أي، وضع قائمة بيضاء للعناوين IP من خلال هذه القواعد). ما زلت أبحث عن طريقة للقيام بذلك… :sweat_smile:

حسنًا، أعتقد أنني اكتشفت شيئًا:

ربما DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS هو بالضبط ما احتجناه :grin:

إعجاب واحد (1)

أنا أيضًا أواجه حدًا للمعدل وهو 60 استدعاء لواجهة برمجة التطبيقات في الدقيقة، ولا يبدو أنني أستطيع تخفيفه. لقد قمت بتعيين كل هذه:\n\n - DISCOURSE_MAX_REQS_PER_IP_MODE=none\n - DISCOURSE_MAX_USER_API_REQS_PER_MINUTE=20000\n - DISCOURSE_MAX_USER_API_REQS_PER_DAY=30000\n - DISCOURSE_MAX_ADMIN_API_REQS_PER_MINUTE=20000\n - DISCOURSE_MAX_REQS_PER_IP_PER_MINUTE=20000\n - DISCOURSE_MAX_REQS_PER_IP_PER_10_SECONDS=2000\n - DISCOURSE_MAX_ASSET_REQS_PER_IP_PER_10_SECONDS=2000\n - DISCOURSE_SKIP_PER_IP_RATE_LIMIT_TRUST_LEVEL=0\n - DISCOURSE_MAX_ADMIN_API_REQS_PER_KEY_PER_MINUTE=20000\n - DISCOURSE_MESSAGE_BUS_MAX_BACKLOG_SIZE=1000\n - DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS=....\n\nأعلم أن الأمر ليس nginx لأنني أتلقى رسالة “لقد قمت بهذا الإجراء عدة مرات”، مما يعني أن Discourse RateLimiter يتعامل مع الأمر.\n\nهل وجدت حلاً؟

إعجابَين (2)