我实际上有点惊讶,在search几个小时后我找不到任何东西,但是问题如下:
我想要nginx作为我的API的油门。
我的configuration文件包含一个引用limit_req_zone
示例:
limit_req_zone $binary_remote_addr zone=limit:2m rate=10r/m;
以及我的location
指令包含预期的limit_req zone=limit nodelay;
我希望nginx附加标题到X-RateLimit-Remaining
和X-RateLimit-Reset
属性的响应消息中。 基本上有nginx使用rate=10r/m
的活动计数来填充X-RateLimit-Remaining
和同一rate=10r/m
时间范围值来填充X-RateLimit-Reset
,刷新前剩余多less秒。
http { limit_req_zone $binary_remote_addr zone=login:10m rate=2r/s; limit_req_status 429; limit_conn_status 429; server { listen 80; server_name [removed]; location / { limit_req zone=limit nodelay; proxy_pass http://reverse-proxy-example; add_header X-RateLimit-Remaining [nginx variable?]; add_header X-RateLimit-Reset [nginx variable?] } }
思考? 可能? 想避免碰到应用程序来获得这些数字。
来自Packet的 Packngo有一个功能,可能很适合你需要做的事情。
来自packngo的示例:
func (r *Response) populateRate() { // parse the rate limit headers and populate Response.Rate if limit := r.Header.Get(headerRateLimit); limit != "" { r.Rate.RequestLimit, _ = strconv.Atoi(limit) } if remaining := r.Header.Get(headerRateRemaining); remaining != "" { r.Rate.RequestsRemaining, _ = strconv.Atoi(remaining) } if reset := r.Header.Get(headerRateReset); reset != "" { if v, _ := strconv.ParseInt(reset, 10, 64); v != 0 { r.Rate.Reset = Timestamp{time.Unix(v, 0)} } } }