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 ของเรา ที่จะช่วยให้เซิร์ฟเวอร์ของคุณปลอดภัยและเสถียรไปตลอด!

