2015-09-15 53 views
7

X-RateLimit-Rimanendo In realtà sono un po 'sorpreso che non ho trovato nulla dopo un paio d'ore di googling, ma il problema è il seguente:nginx set conteggio rimanente per limit_req nell'intestazione

voglio nginx per fungere da acceleratore per la mia API.

mio file di configurazione contiene un esempio ben citato-of limit_req_zone:

limit_req_zone $binary_remote_addr zone=limit:2m rate=10r/m;

insieme con la mia direttiva location contenente l'atteso limit_req zone=limit nodelay;

Mi piacerebbe avere nginx allegare intestazioni per il messaggio di risposta per entrambi gli attributi X-RateLimit-Remaining e X-RateLimit-Reset. Fondamentalmente, nginx utilizza il conteggio attivo del rate=10r/m per popolare X-RateLimit-Remaining e il tempo dello stesso valore rate=10r/m per popolare X-RateLimit-Reset con quanti secondi rimangono prima di un aggiornamento.

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?] 
     } 
} 

Pensieri? Possibile? Mi piacerebbe evitare di colpire l'applicazione per ottenere questi numeri.

risposta

-1

Packngo da Packet ha una funzione che potrebbe essere una buona misura per quello che devi fare.

d'esempio della 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)} 
     } 
    } 
}