NginxÏÞÖÆ»á¼ûƵÂÊÉèÖ㬱ÜÃâ¶ñÒâ¹¥»÷
nginxÏÞÖÆ»á¼ûƵÂÊÉèÖ㬱ÜÃâ¶ñÒâ¹¥»÷
Ëæ×Å»¥ÁªÍøµÄÉú³¤£¬ÍøÕ¾µÄÇå¾²ÐÔ³ÉΪÁËÒ»¸öÖ÷ÒªµÄÎÊÌ⡣ΪÁ˱ÜÃâ¶ñÒâ¹¥»÷£¬ÎÒÃÇÐèÒª¶Ô»á¼ûƵÂʾÙÐÐÏÞÖÆ¡£¶øNginx×÷Ϊһ¸ö¸ßÐÔÄܵÄWebЧÀÍÆ÷£¬¿ÉÒÔͨ¹ýÉèÖÃÀ´ÊµÏÖÕâ¸öÄ¿µÄ¡£
NginxÌṩÁËÒ»¸öÄ£¿é½Ð×ölimit_req_module£¬¸ÃÄ£¿é¿ÉÒÔÏÞÖÆ»á¼ûƵÂÊ¡£ÔÚ¾ÙÐÐÉèÖÃ֮ǰ£¬ÎÒÃÇÐèҪȷ±£ÒѾÆôÓÃÁ˸ÃÄ£¿é¡£ÔÚnginx.confÎļþÖУ¬ÎÒÃÇÕÒµ½http½Úµã£¬²¢ÔÚÆäÖÐÌí¼ÓÈçÏ´úÂ룺
http { ... limit_req_zone $binary_remote_addr zone=myzone:10m rate=5r/s; ... }
µÇ¼ºó¸´ÖÆ
ÉÏÃæµÄ´úÂëÖУ¬limit_req_zoneÓÃÓÚ½ç˵һ¸öÄÚ´æÇøÓò£¬¸ÃÇøÓò»á¼Í¼ÿ¸öIPµØµãµÄ»á¼û´ÎÊý¡£$binary_remote_addrÊÇÒ»¸öNginx±äÁ¿£¬ÌåÏÖ¿Í»§¶ËµÄIPµØµã¡£zone=myzoneÊÇÒ»¸öÇøÓòµÄÃû×Ö£¬¿ÉÒÔ×Ô½ç˵¡£10mÌåÏÖ¸ÃÇøÓòµÄ¾ÞϸΪ10Õ××Ö½Ú¡£rate=5r/sÌåÏÖÿÃë×î¶àÔÊÐí5¸öÇëÇó¡£
½ÓÏÂÀ´£¬ÎÒÃÇ¿ÉÒÔÔÚÏêϸµÄlocationÉèÖÃÖÐÓ¦ÓÃÕâ¸öÏÞÖÆ¡£ºÃ±È£¬ÎÒÃÇÏëÒª¶ÔÒ»¸ö½Ó¿Ú¾ÙÐÐÏÞÖÆ£¬´úÂëÈçÏ£º
location /api/ { ... limit_req zone=myzone burst=10 nodelay; ... }
µÇ¼ºó¸´ÖÆ
ÉÏÃæµÄ´úÂëÖУ¬limit_reqÖ¸ÁîÓÃÓÚÆôÓÃÇëÇóƵÂÊÏÞÖÆÄ£¿é£¬²¢Ö¸¶¨ÁË֮ǰ½ç˵µÄÇøÓòÃûΪmyzone¡£burst=10ÌåÏÖÔÚÁè¼ÝÏÞÖÆƵÂʺó£¬×î¶à»áÑÓ³Ù10¸öÇëÇó¡£nodelayÌåÏÖÈôÊÇÁè¼ÝÏÞÖÆƵÂÊ£¬²»»á·ºÆðÑÓ³Ù£¬¶øÊÇÖ±½Ó·µ»Ø503¹ýʧ¡£
³ýÁËÉÏÃæµÄÉèÖ÷½·¨£¬ÎÒÃÇ»¹¿ÉÒÔ¶ÔÖ¸¶¨µÄʱ¼ä¶Î¾ÙÐÐÏÞÖÆ¡£ºÃ±È£¬ÎÒÃÇÖ»ÏëÔÚÊÂÇéʱ¼ä¶ÎÄÚ¾ÙÐÐÏÞÖÆ£¬´úÂëÈçÏ£º
location /api/ { ... limit_req zone=myzone burst=10 nodelay; limit_req_status 403; limit_req_log_level error; limit_req_time 8h; ... }
µÇ¼ºó¸´ÖÆ
ÉÏÃæµÄ´úÂëÖУ¬limit_req_timeÓÃÓÚÖ¸¶¨ÏÞÖƵÄʱ¼ä¶Î£¬ÔÚÕâÀïÎÒÃÇÏÞÖÆÁË8Сʱ¡£ÆäËûµÄÖ¸ÁîÈçlimit_req_status¡¢limit_req_log_levelÓÃÓÚÉèÖÃÁè¼ÝƵÂÊÏÞÖÆʱµÄ·µ»Ø״̬ÂëºÍÈÕÖ¾¼Í¼¼¶±ð¡£
ÐèҪעÖصÄÊÇ£¬ÒÔÉϵÄÉèÖÃÖ»ÊǶԵ¥¸ö½Ó¿Ú¾ÙÐÐÁË»á¼ûƵÂÊÏÞÖÆ¡£ÈôÊÇÎÒÃÇÏëÒª¶ÔÕû¸öÍøÕ¾¾ÙÐÐÏÞÖÆ£¬ÎÒÃÇ¿ÉÒÔÔÚserver½ÚµãÖоÙÐÐÉèÖᣴúÂëÈçÏ£º
server { ... limit_req zone=myzone burst=10 nodelay; ... }
µÇ¼ºó¸´ÖÆ
ͨ¹ýÒÔÉϵÄÉèÖã¬ÎÒÃÇ¿ÉÒÔÓÐÓõØÏÞÖƶñÒâ¹¥»÷¶ÔÍøÕ¾µÄÓ°Ïì¡£¿ÉÊÇÐèҪעÖصÄÊÇ£¬ÆµÂÊÏÞÖƵÄÁ£¶ÈÓ¦¸ÃÓÉÏêϸӪҵÐèÇóÀ´¾öÒ飬²»¿É¹ýÓÚÑϿᣬ²»È»»áÓ°ÏìÕý³£Óû§µÄ»á¼ûÌåÑé¡£
×ܽáһϣ¬NginxµÄlimit_req_moduleÄ£¿é¿ÉÒÔ×ÊÖúÎÒÃÇÏÞÖÆ»á¼ûƵÂÊ£¬´Ó¶ø±ÜÃâ¶ñÒâ¹¥»÷¡£Í¨¹ýºÏÀíµÄÉèÖ㬿ÉÒÔ±£»¤ÍøÕ¾µÄÇå¾²£¬ÌáÉýÓû§µÄ»á¼ûÌåÑ顣ϣÍû±¾ÎĹØÓÚ¸÷ÈËÓÐËù×ÊÖú£¡
ÒÔÉϾÍÊÇNginxÏÞÖÆ»á¼ûƵÂÊÉèÖ㬱ÜÃâ¶ñÒâ¹¥»÷µÄÏêϸÄÚÈÝ£¬¸ü¶àÇë¹Ø×¢±¾ÍøÄÚÆäËüÏà¹ØÎÄÕ£¡