Nginx實戰案例—限制用戶的訪問
1. 爲什麼要限制用戶訪問
我們經常會遇到這種情況,服務器流量異常,負載過大等等。對於大流量惡意的攻擊訪問,會帶來帶寬的浪費、服務器壓力、影響業務,往往考慮對同一個ip的連接數、併發數進行限制。
2. 如何限制用戶訪問
修改nginx配置文件:
vim /usr/local/nginx/conf/nginx.conf
33 #gzip on;
34 limit_conn_zone $binary_remote_addr zone=addr:10m; #大小是10M內存,10M的內存用來對於IP傳輸開銷
35 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #1s中不超過一個請求
36 server {
37 listen 80;
38 server_name localhost;
39
40 #charset koi8-r;
41
42 #access_log logs/host.access.log main;
43
44 location / {
45 root html;
46 index index.html index.htm;
47 }
48 location /download {
49 limit_conn addr 1; ##只能一個併發,多了會報錯
50 #limit_rate 50k; ##限制帶寬,每秒最多50k,訪問速度會變的很慢
51 }
nginx -t #語法檢測
nginx -s reload #在不暫停服務的情況下重新加載
說明:
limit_conn_zone
用來限制同一時間連接數,即併發限制
limit_req_zone
用來限制單位時間內的請求數,即速率限制,採用的漏桶算法 “leaky bucket”
$binary_remote_addr
是限制同一客戶端ip地址
zone=one:10m
表示生成一個大小爲10M,名字爲one的內存區域,用來存儲訪問的頻此信息
定義一個名爲addr的limit_conn_zone
mkdir /usr/local/nginx/html/download/
cd /usr/local/nginx/html/download/
ls
cd /usr/local/nginx/logs
>access.log #清空日誌(方便實驗效果的觀察)
測試(在真機中):
ab -c 10 -n 1000 http://172.25.1.1/download/huge.jpg #一次10個併發,一共併發1000(也就是模擬10個人,發送1000個請求)
查看日至(在server1中):
200就是可以的,503就是服務器端有問題(服務器端發現併發太多了,就會返回503)