1. 首页>
  2. 技术文章>
  3. lua限流

lua限流

7/1/24 11:42:54 AM 浏览 1098 评论 0

lua

lua_code_cache on;    
lua_shared_dict my_limit_count_store 10M;
server {  
    listen 81;  
  
    root D:/publish/Mall/Admin;
    location / {  
     ccess_by_lua_block {
                -- ngx.header["Content-Type"] = "application/json"
                local limit_count = require "resty.limit.count"
                local cjson = require "cjson"
                -- 1秒内只能有20个请求
                local lim, err = limit_count.new("my_limit_count_store", 100, 1)
      
                local key = ngx.var.uri
                local delay, err = lim:incoming(key, true)
                        -- ngx.say(delay)
                if not delay then
                    if err == "rejected" then
                        ngx.say(cjson.encode({code=-1}))
                        return ngx.exit(429)
                           end
                end
                        -- ngx.say("success")
                         ngx.status = ngx.HTTP_OK
   
        }  
            try_files $uri $uri/ /index.html;
   
            if ($request_filename ~* ^.*?.(html|htm)$) {
     
            add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy#-revalidate";
   
        }
 
    }  
}

如果超出了就反向代理到其它地方:

server {
        listen	1003;

	 location / {
            
             access_by_lua_block {
				ngx.header["Content-Type"] = "application/json"
				local limit_count = require "resty.limit.count"
                local cjson = require "cjson"
				ngx.var.backend = "127.0.0.1:8060"
                local lim, err = limit_count.new("my_limit_count_store", 2, 1)
       
                local key = ngx.var.uri
                local delay, err = lim:incoming(key, true)
                if not delay then
					if err == "rejected" then
						ngx.var.backend = "11.6.182.42:1001"
					end
					
                end
            }  
	    
			
    	    proxy_pass http://$backend/;
			
			 log_by_lua_block {
                ngx.log(ngx.ERR, "backend_dynamic: ", ngx.var.backend)
            }
			

        }
		
	

 
}


网友讨论