هذا المقال يتطلب مستوى: متوسط. لازم تكون مرتاح مع سطر أوامر لينكس وعندك فكرة أساسية عن Nginx كـ reverse proxy. لو مبتدئ خالص، المثال في الأول هيوصّلك الفكرة قبل التفاصيل التقنية.
في 8 خطوات، هتحطّ حدًّا على عدد الطلبات اللي أي IP يقدر يبعتها لمسار حسّاس زي تسجيل الدخول. النتيجة العملية: هجوم تخمين كلمات السر اللي بيبعت 8000 طلب في الدقيقة هيتقصّ لـ 10 طلبات في الثانية بس، وضغط قاعدة بياناتك بينزل من 95% لأقل من 20% من غير ما تلمس كود التطبيق.
المشكلة باختصار
لو عندك endpoint زي /api/login مفتوح بلا حد، أي حد يقدر يقصفه بآلاف الطلبات في الثانية. ده بيعمل حاجتين وحشتين. الأولى: هجوم brute force بيجرّب كلمات سر كتير بسرعة. الثانية: طلب واحد تقيل مضروب آلاف المرات بيشيل الـ CPU والـ DB لـ 100% ويوقّع الخدمة لكل المستخدمين. الحل مش سيرفر أقوى، الحل بوابة بتنظّم التدفق قبل ما يوصل لتطبيقك.
الفكرة الأول بمثال، وبعدين علميًا
تخيّل ملهى فيه بوّاب على الباب. الصالة تستحمل ناس بمعدل ثابت، مثلًا واحد كل ثانية. لو جِه 50 شخص مرة واحدة، البوّاب مبيزنقهمش كلهم جوه. بيدخّل واحد كل ثانية، وبيخلّي عدد محدود يستنى في طابور صغير جنب الباب. اللي زاد عن الطابور بيترفض ويمشي. ده بالظبط اللي Nginx بيعمله بطلبات الـ HTTP.
علميًا، Nginx بينفّذ خوارزمية اسمها الدلو المسرّب (Leaky Bucket). تخيّل دلو له تقب صغير تحت. الطلبات بتصبّ فيه من فوق، والتقب بيسرّبها لتطبيقك بمعدل ثابت. حجم الدلو هو الـ burst. لو الطلبات جت أسرع من التسريب، الدلو بيمتلي؛ واللي يجي بعد ما يفيض بيترفض فورًا بكود 503 افتراضيًا أو 429 بعد ما نظبّطه. ركّز على الفرق: rate بيحدّد سرعة التسريب، وburst بيحدّد قد إيه تسمح بدفعة مفاجئة قبل الرفض.
الخطوات الثمانية
- قِس خط الأساس الأول. قبل ما تحطّ أي حد، اعرف المعدل الطبيعي لمستخدميك. بُصّ في access log واحسب أعلى معدل شرعي لكل IP. لو مستخدم عادي بيعمل 2 إلى 3 طلبات في الثانية وقت الذروة، حدّ 10r/s آمن وبيسيب مساحة.
- عرّف منطقة التتبّع في بلوك
http. دي بتحجز ذاكرة مشتركة تتابع فيها معدل كل مفتاح (هنا الـ IP). - طبّق الحد على المسار الحسّاس جوه بلوك
locationبتاع تسجيل الدخول أو الـ API. - اضبط
burstوnodelayعشان تسمح بدفعات قصيرة طبيعية من غير ما تعاقب المستخدم الشرعي. - غيّر كود الرفض لـ 429 بدل 503 الافتراضي، لأن 429 هو الكود القياسي الصحيح لـ "طلبات كتير أوي".
- اعمل استثناء للـ IPs الموثوقة زي سيرفرات المراقبة أو بوابة الدفع، عشان متتحدّش بالغلط.
- تحقّق من الإعداد وأعد التحميل بأمان.
nginx -tبيمنعك من كسر السيرفر بكونفيج غلط.