Nginx

Rate Limiting ใน Nginx — ป้องกัน Abuse

Rate Limiting ใน Nginx — ป้องกัน Abuse

Rate limiting เป็นเทคนิคสำคัญในการป้องกันการใช้บริการแบบไม่ถูกต้องและการโจมตี DDoS บน Nginx นั่นคือการจำกัดจำนวนคำขอ (requests) ที่สามารถรับได้ในช่วงเวลาที่กำหนด เช่น 10 requests ต่อวินาที หรือ 100 requests ต่อนาที ซึ่งช่วยป้องกันเว็บไซต์และเซิร์ฟเวอร์ของคุณจากการถูกใช้ประโยชน์อย่างไม่เป็นธรรมชาติ

ในบทความนี้ คุณจะได้เรียนรู้วิธีการตั้งค่า rate limiting ใน Nginx ตั้งแต่พื้นฐานไปจนถึงขั้นสูง รวมถึงการใช้ directive ต่างๆ เทคนิคการ whitelisting และการรวมกับมาตรการความปลอดภัยอื่นๆ เพื่อให้เซิร์ฟเวอร์ของคุณทำงานได้อย่างเสถียรและปลอดภัย

Rate Limiting คืออะไร และเหตุใดจึงสำคัญ

Rate limiting คือการจำกัดจำนวนคำขอที่ Nginx ยอมรับจากไคลเอนต์หนึ่งๆ ในระยะเวลาที่กำหนด ไม่ว่าจะเป็นการจำกัดตามที่อยู่ IP หรือตามเส้นทาง URL ที่เฉพาะเจาะจง

เหตุใดจึงสำคัญ:

  • ป้องกัน DDoS (Distributed Denial of Service) — ลดความเสี่ยงจากการโจมตีแบบหลายจุด
  • ป้องกัน Brute Force Attacks — จำกัดการพยายามเข้าสู่ระบบซ้ำๆ
  • บริหารจัดการทรัพยากรเซิร์ฟเวอร์ — ป้องกันไม่ให้เซิร์ฟเวอร์ถูกใช้งานเกินกำลัง
  • ป้องกัน API Abuse — จำกัดการใช้งาน API ที่ไม่มีสัญญา
  • ป้องกัน Web Scraping — ลดการที่ bot ไม่มีการอนุญาตจำลองข้อมูล

limit_req_zone Directive — การตั้งค่าโซนอัตราจำกัด

Directive ที่สำคัญที่สุดสำหรับการตั้งค่า rate limiting คือ limit_req_zone ซึ่งใช้เพื่อกำหนดโซนจำกัดอัตราและตั้งค่าพารามิเตอร์ที่จำเป็น

ไวยากรณ์พื้นฐาน

ในไฟล์ nginx.conf ให้ใส่ directive ต่อไปนี้ใน http context:

limit_req_zone $binary_remote_addr zone=basic:10m rate=10r/s;

องค์ประกอบของ Directive นี้:

  • $binary_remote_addr — ตัวแปรที่ใช้เพื่อระบุ IP address ของไคลเอนต์ในรูปแบบฐานสองซึ่งประหยัดหน่วยความจำ
  • zone=basic:10m — ชื่อของโซน (basic) และขนาดหน่วยความจำที่ใช้ (10 MB)
  • rate=10r/s — กำหนดอัตราสูงสุด 10 requests ต่อวินาที

ตัวอย่างขั้นสูงเพิ่มเติม

คุณสามารถตั้งค่าหลายโซนด้วยอัตราที่แตกต่างกันได้:

limit_req_zone $binary_remote_addr zone=strict:10m rate=5r/s;
limit_req_zone $binary_remote_addr zone=moderate:10m rate=20r/s;
limit_req_zone $binary_remote_addr zone=api:10m rate=100r/m;

Limit_req Directive — การใช้โซนอัตราจำกัด

หลังจากกำหนดโซนแล้ว ให้ใช้ limit_req directive เพื่อใช้การจำกัดอัตรากับเส้นทาง URL หรือ server block ที่ต้องการ

ไวยากรณ์พื้นฐาน

server {
    listen 80;
    server_name example.com;

    location / {
        limit_req zone=basic burst=15 nodelay;
        proxy_pass http://backend;
    }
}

องค์ประกอบ:

  • zone=basic — ชื่อของโซนที่ใช้
  • burst=15 — จำนวนคำขอที่อนุญาตให้เกินขีด จำกัด (burst) ในคิว รอ
  • nodelay — ตอบสนองทันที (โดยไม่เสมหรือล่าช้า) สำหรับคำขอที่อยู่ใน burst

การจำกัดอัตราต่อคำขออื่นๆ

นอกจากการจำกัดตาม IP แล้ว คุณยังสามารถจำกัดตามเงื่อนไขอื่นๆ ได้:

จำกัดตาม HTTP Header

limit_req_zone $http_x_forwarded_for zone=api:10m rate=50r/m;

server {
    location /api/ {
        limit_req zone=api burst=10;
    }
}

จำกัดตาม User-Agent

map $http_user_agent $limit_api {
    default $binary_remote_addr;
    ~*bot $binary_remote_addr;
}

limit_req_zone $limit_api zone=bots:10m rate=5r/m;

Error Handling — การตอบสนองเมื่อจำกัด

เมื่อผู้ใช้เกินขีดจำกัดอัตรา Nginx จะส่งกลับโค้ด HTTP 429 (Too Many Requests) โดยค่าเริ่มต้น หากต้องการกำหนดเองสามารถตั้งค่าได้ดังนี้:

limit_req_status 429;

server {
    location /api {
        limit_req zone=api burst=5 nodelay;
        error_page 429 =429 @rate_limit;
    }

    location @rate_limit {
        default_type text/html;
        return 429 "กรุณารอสักครู่ เพื่อให้คำขอของคุณสำเร็จ";
    }
}

Whitelisting IP Addresses ด้วย Geo Module

บ่อยครั้งคุณอาจต้องการให้ IP addresses บางตัว (เช่น API partners หรือ internal services) ข้ามการจำกัดอัตรา สามารถทำได้ด้วย Geo Module:

geo $limit {
    default 1;
    192.168.1.0/24 0;  # Whitelist internal network
    203.0.113.0/24 0;  # Whitelist partner IPs
}

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

limit_req_zone $limit_api zone=api:10m rate=50r/m;

server {
    location /api/ {
        limit_req zone=api burst=10;
    }
}

การกำหนดอัตราแตกต่างตามเส้นทาง URL

ในหลายสถานการณ์ คุณอาจต้องการให้อัตราการจำกัดแตกต่างกันตามเส้นทาง URL:

limit_req_zone $binary_remote_addr zone=upload:10m rate=2r/m;
limit_req_zone $binary_remote_addr zone=download:10m rate=100r/m;
limit_req_zone $binary_remote_addr zone=search:10m rate=30r/m;

server {
    location /upload/ {
        limit_req zone=upload burst=1;
    }

    location /download/ {
        limit_req zone=download burst=50;
    }

    location /search/ {
        limit_req zone=search burst=5;
    }
}

การตรวจสอบ Status ของ Rate Limiting

หากต้องการเห็น status ของ rate limiting คุณสามารถใช้ Nginx Plus (commercial version) หรือ debug mode ได้ แต่วิธีที่ง่ายที่สุดคือดูที่ Nginx logs:

tail -f /var/log/nginx/access.log | grep "429"

# หรือค้นหา requests ที่ถูกจำกัด
grep "429" /var/log/nginx/access.log | wc -l

Best Practices สำหรับ Rate Limiting

  • เลือกอัตราที่เหมาะสม — อัตราต่ำเกินไปจะบล็อก legitimate users บ่อยเกินไป ให้คิด throughput ของระบบก่อน
  • ใช้ burst parameter อย่างชาญฉลาด — ช่วยให้เกิด spike ในลักษณะธรรมชาติ
  • Monitor และทดลอง — ใช้ Nginx logs เพื่อตรวจสอบจำนวน requests ที่ถูกจำกัด และปรับค่าตามความเหมาะสม
  • Whitelist trusted sources — ใช้ Geo Module เพื่อข้ามการจำกัดสำหรับ IP addresses ที่신뢰
  • รวมกับเครื่องมือความปลอดภัยอื่น — Rate limiting ควรเป็นส่วนหนึ่งของกลยุทธ์ความปลอดภัยที่กว้างขวาง (WAF, DDoS protection, etc.)

สรุป

Rate limiting ใน Nginx เป็นเครื่องมือที่ทรงพลังและจำเป็นสำหรับการปกป้องเซิร์ฟเวอร์จากการใช้งานแบบผิดวิธี ด้วยการตั้งค่า directive เช่น limit_req_zone และ limit_req อย่างถูกต้อง คุณสามารถป้องกันเว็บไซต์ของคุณจากการโจมตี DDoS Brute force attacks และ API abuse ได้อย่างมีประสิทธิภาพ

ความสำคัญคือการทำให้สมดุลระหว่างการป้องกันและการให้บริการแก่ legitimate users ดังนั้นจึงต้องทำการตรวจสอบและปรับแต่งค่าต่างๆ อย่างต่อเนื่อง

แนะนำบริการ DE

หากคุณต้องการเซิร์ฟเวอร์ที่มีการตั้งค่า rate limiting และความปลอดภัยที่เหมาะสม Cloud VPS ของ DE เป็นตัวเลือกที่เหมาะสม ด้วยบัญชี root ที่สมบูรณ์และการสนับสนุนจาก Support Team ที่มีประสบการณ์ คุณสามารถกำหนดค่า rate limiting ได้อย่างยืดหยุ่นและมีประสิทธิภาพตามความต้องการของคุณ

นอกจากนี้ หากคุณต้องการเซิร์ฟเวอร์ที่จัดการอยู่แล้ว โดยไม่ต้องกังวลเรื่องการตั้งค่าเองเอง Cloud Hosting ของ DE ก็เป็นตัวเลือกที่เหมาะสม ด้วยทีม support ที่พร้อมช่วยเหลือคุณตลอดเวลา

ติดต่อ DE วันนี้ เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับบริการ Cloud VPS และ Cloud Hosting ของเรา ที่จะช่วยให้เซิร์ฟเวอร์ของคุณปลอดภัยและเสถียรไปตลอด!