使用的環境

系統與使用工具
Centos 7.6
nginx/1.16.1
Naxsi 1.3

一、ngx_http_limit_req_module 寫法介紹

# 保存 10MB 的 ip 的 request 紀錄,每分鐘可以接受 100 個 request。
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=100r/m;

二、Nginx.conf 設定

如果要真實 IP 可以把 $binary_remote_addr換成$http_x_forwarded_for,除了remote_addrHTTP_CLIENT_IPhttp_x_forwarded_for可以被偽造。
remote_addr雖然可以取得安全可靠的 IP,但無法確定它是否為使用者真正的IP。

http
    {
      limit_req_zone $binary_remote_addr  zone=mylimit:1m rate=2r/s;
    }

三、Vhost.conf 設定

去網址的 conf 檔設定,可設定 location 路徑再套用限速規則。

location /login
    {
       limit_req zone=mylimit;
    }

四、 reload Nginx

$ nginx -s reload

五、查看是否有設定成功

去網站狂按 F5,看會不會出現 503,意思是「流量過大或正在維修」,有的話即為設定成功。

503  Service Temporarily Unavailable 

六、額外:也可以一次宣告多個 zone

# 也可以一次宣告多個 zone
http {
    limit_req_zone $binary_remote_addr zone=limit_verifyPhone:10m rate=2r/m;
    limit_req_zone $binary_remote_addr zone=limit_resetPassword:10m rate=1r/m;


    server {
    # 也可以套用在 POST 請求上
          location /api/verifyPhone 
      {
                limit_req zone=limit_verifyPhone;
              proxy_pass http://backend;
         }    
        location /api/resetPassword 
    {
              limit_req zone=limit_resetPassword;
             proxy_pass http://backend;
            }
     }
}

參考資料