2010-12-29 4 views
11

Ich benutze nginx, um Anfragen an eine Node App zu übergeben. Die App fungiert im Grunde als Remote-Cache für html (prüft, ob der Benutzer in der redis-db recherchiert, ob dies nur angezeigt wird, wenn nicht, und speichert es im Redis-Cache und bietet es an.)Verwenden von nginx, um Inhalte direkt aus einem Redis-Cache zu liefern

Ich war neugierig, ob es sowieso darum ging, die Node App zu umgehen, indem ich nginx den Inhalt direkt von redis bereitstellen ließ? Ich habe mit dem http_redis-Modul herumgespielt, aber ich kann es nicht wirklich zum Laufen bringen.

Ein einfaches Beispiel wäre: http://mywebsite.com/a wo Nginx würde den Inhalt in der 'a' Taste oder geben Sie es an die Knoten-App, wenn der Schlüssel nicht vorhanden war. Ist das überhaupt möglich?

Antwort

1

Sie sollten in der Lage sein, etwas zu erhalten, indem Sie Nginx als Reverse-Proxy für Webdis einrichten.

Die Art, wie Sie Webdis verwenden, besteht darin, dass Sie den gesamten Befehl in die URL eingeben, also GET den Schlüssel a, den Sie anfordern /GET/a. Das bedeutet, dass, wenn alles, was Sie zur Verfügung dienen wollen, ist GET verwenden Sie so etwas wie dies in Nginx tun können:

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

(ich die Config aus der Spitze von meinem Kopf Ich schreibe hier könnte die Syntax etwas weg sein).

Allerdings ist das Webdis-Projekt sehr jung, also kann man nicht sagen, wie gut es funktionieren wird, und die Antworten sind JSON-Dokumente mit etwas mehr Flusen, die Sie wahrscheinlich nicht zurückgeben wollen.

+0

hmmm, ich werde es überprüfen. Ich weiß nicht viel über Nginx, also wusste ich nicht einmal, ob das, was ich fragte, möglich war. Ich denke, für Ihre Methode würde ich nur sehen müssen, ob es von Knoten oder Webdis schneller wäre. Es scheint, dass nginx in der Lage ist, direkt von Memcache Server und das http_redis-Modul scheint danach modelliert. –

+0

Wenn Sie dies auch mit Pub/Subs verwenden, sollten Sie proxy_buffering ausschalten und proxy_read_timeout auf einen entsprechend langen Wert setzen. – rrauenza

9

Vielleicht etwas schwieriger einzurichten als Webdis, aber Sie können dies direkt im Nginx-Daemon mit einigen zusätzlichen Modulen wie redis2-nginx-module tun. Sie müssen nginx neu kompilieren.

Es gibt einige gute Beispiele für die Konfiguration auf der Homepage.

Zum Beispiel:

# 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; 
} 

Natürlich mit etwas mehr nginx Konfiguration können Sie eine weitere URL-Muster erhalten.

Beachten Sie, dass Sie für dieses Beispiel auch das Modul ngx_set_misc kompilieren müssen.

3

Ich weiß, das ist ein alter Thread, aber immer noch, das kann für einige nützlich sein. Ich habe den gleichen Ansatz versucht, da Sie nginx direkt von Redis aus bedienen, ohne HttpRedis2Module in nginx zu benutzen. Ich war glücklich, als ich es funktionierte, denn es war ein bisschen mühsam, aber als ich einige Stresstests gemacht habe, fürchte ich, dass es wirklich schlechte Ergebnisse gebracht hat.

Es war tatsächlich ein bisschen schneller und viel stabiler zu bedienen mit nginx->php->mongodb als nur mit nginx->redis mit dem Modul.

+1

Haben Sie ein Keepalive für Ihren Redis-Pool in nginx eingerichtet?Das letzte Mal, als ich dieses Keepalive getestet habe, war ein Unterschied zwischen slover und - viel schneller. –

+0

Ich bin nicht überrascht, dass PHP + MongoDb ist schneller als nur Redis in Benchmarks, weil Redis ein einziger Prozess ohne Multi-Threading ist Das bedeutet, dass alle Anfragen seriell mit einem Prozess bearbeitet werden, egal wie viele CPU-Kerne Sie haben. Obwohl es sehr schnell ist, ist es durchaus möglich, dass PHP + MongoDb mit hoher Parallelität schneller ist, da sie alle CPU-Kerne ausnutzen können, indem sie viele Anfragen parallel bearbeiten. Auch MongoDb ist einfach unglaublich schnell. – ColinM

Verwandte Themen