2010-12-29 7 views
11

Sto utilizzando nginx per passare richieste a un'app Node. L'app funziona fondamentalmente come cache remota per html (controlla se l'utente che sta richiedendo si trova nel redis db, se è solo mostrato che, se non lo prendi e lo memorizza nella cache redis e lo serve).Uso di nginx per pubblicare il contenuto direttamente da una cache redis

Ero curioso di sapere se ci fosse comunque la possibilità di bypassare l'app Node facendo pubblicare nginx il contenuto direttamente da redis? Ho fatto scherzi con il modulo http_redis ma non riesco davvero a farlo funzionare.

Un semplice esempio potrebbe essere: http://mywebsite.com/a dove nginx servirà il contenuto nella chiave 'a' o lo passerà all'app del nodo se la chiave non esiste. È possibile?

risposta

1

Si dovrebbe essere in grado di ottenere qualcosa impostando Nginx come proxy inverso per Webdis.

Il modo in cui si utilizza Webdis è che si inserisce l'intero comando nell'URL, quindi su GET la chiave a si richiede /GET/a. Questo significa che se tutto ciò che si vuole servire è disponibile utilizzando GET si può fare qualcosa di simile in Nginx:

location/{ 
    rewrite ^(.*)$ /GET/$1 break; 
    proxy_pass http://127.0.0.1:7379/; 
} 

(sto scrivendo la configurazione fuori dalla parte superiore della mia testa qui, la sintassi potrebbe essere un po 'fuori).

Tuttavia, il progetto Webdis è molto giovane, quindi non c'è modo di capire come funzionerà, e le risposte sono documenti JSON con un po 'di peluria extra che probabilmente non vorrai più restituire.

+0

hmmm, lo controllerò. Non so molto di nginx quindi non sapevo nemmeno se ciò che stavo chiedendo fosse possibile. Immagino per il tuo metodo che dovrei solo vedere se servirlo dal Nodo o da Webdis sarebbe più veloce. Sembra che nginx sia in grado di eseguire il server direttamente da memcache e il modulo http_redis sembra modellato dopo di esso. –

+0

Se si utilizza anche questo con pub/subs, si consiglia di disattivare proxy_buffering e il proxy_read_timeout su un valore appropriatamente lungo. – rrauenza

9

Forse qualcosa di più difficile da configurare rispetto a Webdis, ma è possibile farlo direttamente nel demone nginx con alcuni moduli aggiuntivi come redis2-nginx-module. Dovrai ricompilare nginx.

Ci sono alcuni buoni esempi di configurazione sulla home page.

Per esempio:

# GET /get?key=some_key 
location /get { 
    set_unescape_uri $key $arg_key; # this requires ngx_set_misc 
    redis2_query get $key; 
    redis2_pass foo.com:6379; 
} 

Naturalmente, con un po 'di configurazione più nginx, è possibile ottenere un altro modello URL.

Si noti che per questo esempio, sarà necessario compilare anche il modulo ngx_set_misc.

3

So che questo è un thread vecchio ma ancora, questo può essere utile per alcuni. Ho provato lo stesso approccio con Nginx che serviva da Redis direttamente senza colpire usando HttpRedis2Module in nginx. Ero felice quando l'ho fatto funzionare perché era una seccatura, ma quando ho fatto dei test di stress temo che abbia dato risultati davvero negativi.

In realtà era un po 'più veloce e molto più stabile da servire utilizzando nginx->php->mongodb rispetto all'utilizzo di nginx->redis con il modulo.

+1

Hai configurato un keepalive per il tuo pool redis in nginx?L'ultima volta che stavo testando questo keepalive c'era differenza tra php -> redis e molto più veloce ... –

+0

Non mi sorprende che PHP + MongoDb sia più veloce dei soli Redis nei benchmark perché Redis è un processo singolo senza multi-threading il che significa che gestisce tutte le richieste in serie con un processo, indipendentemente dal numero di core della CPU che hai. Quindi mentre è molto veloce, è abbastanza probabile che PHP + MongoDb sia più veloce con una concorrenza elevata poiché hanno la capacità di utilizzare completamente tutti i core della CPU affrontando molte richieste in parallelo. Anche MongoDb è velocissimo. – ColinM

Problemi correlati