2010-12-29 13 views
11

Estoy usando nginx para pasar solicitudes a una aplicación de nodo. La aplicación básicamente actúa como un caché remoto para html (comprueba si lo que el usuario está solicitando está en el redis db, si solo lo muestra, si no lo toma y lo almacena en el caché redis y lo sirve).Uso de nginx para servir contenido directamente desde un caché redis

Tenía curiosidad si había alguna forma de eludir golpear la aplicación Nodo haciendo que nginx sirviera el contenido directamente desde redis? He estado jugando con el módulo http_redis pero realmente no puedo hacer que funcione.

Un ejemplo simple sería: http://mywebsite.com/a donde nginx mostraría el contenido en la tecla 'a' o lo pasaría a la aplicación del nodo si la clave no existiera. ¿Esto es posible?

Respuesta

1

Debería poder obtener algo configurando Nginx como un proxy inverso para Webdis.

La forma de usar Webdis es que pone todo el comando en la URL, por lo que a GET la clave a solicita /GET/a. Esto significa que si todo lo que quiere servir está disponible utilizando GET que puede hacer algo como esto en Nginx:

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

(estoy escribiendo la configuración de la parte superior de mi cabeza aquí, la sintaxis podría estar ligeramente desviado)

Sin embargo, el proyecto Webdis es muy joven, por lo que no hay forma de saber qué tan bien funcionará, y las respuestas son documentos JSON con algo extra que probablemente no desee devolver.

+0

hmmm, lo comprobaré. No sé mucho sobre nginx, así que ni siquiera sabía si lo que estaba preguntando era posible. Supongo que para su método solo tendría que ver si servirlo desde Node o desde Webdis sería más rápido. Parece que nginx puede server directamente desde Memcache y el módulo http_redis parece modelado después de él. –

+0

Si también está utilizando esto con pub/subs, querrá desactivar proxy_buffering y el proxy_read_timeout a un valor apropiadamente largo. – rrauenza

9

Tal vez algo más difícil de configurar que Webdis, pero puede hacerlo directamente en el daemon nginx con algunos módulos adicionales como redis2-nginx-module. Deberá recompilar nginx.

Hay algunos buenos ejemplos de configuración en la página de inicio.

Por ejemplo:

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

Por supuesto, con un poco más de configuración de nginx, se puede conseguir otro patrón de URL.

Tenga en cuenta que para este ejemplo, también deberá compilar el módulo ngx_set_misc.

3

Sé que este es un hilo antiguo, pero aún así, esto puede ser útil para algunos. Probé el mismo método que si tuviera servicio de nginx desde Redis directamente sin tocar usando HttpRedis2Module en nginx. Me alegré cuando lo conseguí porque era un poco complicado, pero cuando hice algunas pruebas de estrés me temo que dieron resultados realmente malos.

De hecho, fue un poco más rápido y mucho más estable para servir usando nginx->php->mongodb que simplemente usando nginx->redis con el módulo.

+1

¿Ha configurado un keepalive para su redis pool en nginx?La última vez que probé este keepalive fue una diferencia entre slover que php -> redis y mucho más rápido ... –

+0

No me sorprende que PHP + MongoDb sea más rápido que Redis en benchmarks porque Redis es un proceso único sin multi-threading lo que significa que maneja todas las solicitudes en serie con un proceso sin importar cuántos núcleos de CPU tenga. Entonces, si bien es muy rápido, es bastante posible que PHP + MongoDb sea más rápido con alta concurrencia ya que tienen la capacidad de utilizar completamente todos los núcleos de la CPU al abordar muchas solicitudes en paralelo. Además, MongoDb es increíblemente rápido. – ColinM

Cuestiones relacionadas