Nginx cuenta con un módulo de terceros para integrar Memcached. Estos módulos no son módulos con soporte oficial y no se asegura su correcto funcionamiento en todas las versiones del producto, pero aun así merece la pena tenerlos en cuenta para ampliar las funcionalidades de Nginx.
El módulo para integrar Nginx con Memcached es Memc (ngx_http_memcached_module). Es una versión extendida del módulo estándar de Memcached que permite interactuar con él a través de una serie de comandos: set, add, delete,… esto lo que nos permite trabajar con memcached directamente desde la configuración de Nginx, indicando como se añaden objetos a la caché, como se obtienens para servir contenido, como eliminarlos, etc.
Instalar Nginx con el módulo de Memcached
En el artículo de instalación de Nginx ya publiqué una guía con las distintas formas de instalarlo, echadle un vistazo si queréis información detallada. Aquí únicamente lo que vamos a hacer es descargar el código fuente de Nginx y el módulo Memc y compilarlo:
# wget http://nginx.org/download/nginx-1.7.7.tar.gz # wget https://github.com/openresty/memc-nginx-module/archive/v0.15.tar.gz # tar -xzvf nginx-1.7.7.tar.gz # tar -xzvf v0.15.tar.gz # cd nginx-1.7.7 # ./configure --prefix=/opt/nginx \ --with-http_ssl_module \ --with-http_gzip_static_module \ --add-module=/root/tmp/memc-nginx-module-0.15/
A la hora de hacer el «configure», debemos asegurarnos de tener instalados los compiladores. Una vez finalizado el configure veremos como ha cargado el módulo de Memcached, que lo hemos especificado como módulo adicional apuntando al path donde está el código fuente descargado (–add-module=/root/tmp/memc-nginx-module-0.15/)
[...] checking for struct dirent.d_type ... found checking for sysconf(_SC_NPROCESSORS_ONLN) ... found checking for openat(), fstatat() ... found checking for getaddrinfo() ... found configuring additional modules adding module in /root/tmp/memc-nginx-module-0.15/ + ngx_http_memc_module was configured checking for PCRE library ... found checking for PCRE JIT support ... found checking for OpenSSL library ... found checking for zlib library ... found creating objs/Makefile Configuration summary + using system PCRE library + using system OpenSSL library + md5: using OpenSSL library + sha1: using OpenSSL library + using system zlib library nginx path prefix: "/opt/nginx" nginx binary file: "/opt/nginx/sbin/nginx" nginx configuration prefix: "/opt/nginx/conf" nginx configuration file: "/opt/nginx/conf/nginx.conf" nginx pid file: "/opt/nginx/logs/nginx.pid" nginx error log file: "/opt/nginx/logs/error.log" nginx http access log file: "/opt/nginx/logs/access.log" nginx http client request body temporary files: "client_body_temp" nginx http proxy temporary files: "proxy_temp" nginx http fastcgi temporary files: "fastcgi_temp" nginx http uwsgi temporary files: "uwsgi_temp" nginx http scgi temporary files: "scgi_temp"
Terminamos compilando e instalando:
# make # make install # /opt/nginx/sbin/nginx
Configuración del módulo Memcached
Os voy a indicar un ejemplo de configuración básica del módulo a través del fichero de configuración nginx.conf. Hay que tener en cuenta que hay muchas formas de añadir contenido a memcached y de posteriormente servirlo a través de nginx.
Como no soy ningún experto sino más bien un noob y todavía estoy comenzando a hacer pruebas, os insto a revisar la documentación oficial del módulo. Lo más básicopara verificar que el módulo funciona y está bien instalado es lo siguiente:
Especificar en la etiqueta «server {}» la IP/Hostname y puerto del servidor de Memcached, que actua como backend para servir contenido al servidor web:
http { upstream backend { server 127.0.0.1:11211; keepalive 1024; }
Posteriormente ya se pueden especificar paths (location) para definir donde y como se trabajará con memcached. En el sitio web del módulo que os he pasado anteriormente hay ejemplos bastante interesantes y con su correspondiente explicación. Para que veáis un poco el funcionamiento más básico os dejo un ejemplo.
El siguiente location especifica que al acceder a «/test» se añada a memcached una entrada con la key «foo» y el valor «bar»:
location ~ /bar { set $memc_cmd set; set $memc_key foo; set $memc_value bar; memc_pass 127.0.0.1:11211; }
O permitiendo especificar en la URL los parámetros:
location /bar { set $memc_cmd $arg_cmd; set $memc_key $arg_key; set $memc_value $arg_val; memc_cmds_allowed get set add delete flush_all; memc_pass 127.0.0.1:11211; }
Si lo hacemos, vemos como el valor queda almacenado en memcached:
# telnet localhost 80 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /bar STORED Connection closed by foreign host.
# /usr/bin/memcached-tool localhost:11211 dump Dumping memcache contents Number of buckets: 1 Number of items : 1 Dumping bucket 1 - 1 total items add foo 0 1415891462 3 bar
Ese ejemplo es para añadir datos a memcached, para recogerlos utilizaríamos «$memc_cmd get;» en lugar de «$memc_cmd set;»:
location ~ /foo { set $memc_cmd get; set $memc_key $arg_key; memc_pass 127.0.0.1:11211; }
Y si intentamos recuperar los datos que hemos almacenado en la caché antes, vemos que efectivamente memcached lo devuelve bien a través de Nginx:
# telnet localhost 80 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /foo?key=foo bar Connection closed by foreign host.
También se pueden visualizar las estadísticas del módulo:
location /stats { set $memc_cmd stats; memc_pass 127.0.0.1:11211; }
# telnet localhost 80 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /stats STAT pid 16268 STAT uptime 2285 STAT time 1415893747 STAT version 1.4.15 STAT libevent 2.0.21-stable STAT pointer_size 64 STAT rusage_user 0.040862 STAT rusage_system 0.051077 STAT curr_connections 10 STAT total_connections 36 STAT connection_structures 11 STAT reserved_fds 20 STAT cmd_get 12 STAT cmd_set 3 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 4 STAT get_misses 8 STAT delete_misses 0 STAT delete_hits 0 STAT incr_misses 0 STAT incr_hits 0 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 397 STAT bytes_written 3218 STAT limit_maxbytes 67108864 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT hash_power_level 16 STAT hash_bytes 524288 STAT hash_is_expanding 0 STAT bytes 71 STAT curr_items 1 STAT total_items 3 STAT expired_unfetched 0 STAT evicted_unfetched 0 STAT evictions 0 STAT reclaimed 0 END Connection closed by foreign host.
Con estos ejemplos simplemente comprobamos que efectivamente, funciona. A partir de aquí empieza la tarea de configurar toda la integración de memcached con el sitio web, las bases de datos, etc.
Por cierto, no os he indicado como instalar Memcached. Podéis hacerlo a través de los repositorios. Por ejemplo, en RHEL y CentOS:
# yum install memcached
Yo lo vengo usando hace rato para un sitio de noticias con bastantes noticias y el rendimiento es increíble.
Yo tengo un biblioteca para manejar cache en PHP[1], y la implementé con esto y vuela[2]
1: https://github.com/exos/HybridCache
2: http://redmine.gentisoft.com/projects/hybridcache/wiki/Implementaci%C3%B3n_con_HttpMemcachedModule
Interesante. Le echaré un vistazo, gracias.
Buenas,
echadle un ojo a xCache. Yo estoy haciendo pruebas a ver qué tal rinde.
http://xcache.lighttpd.net/
Un saludo.
Mola, me lo apunto.
Gracias Sidious y feliz año.
¡Igualmente! Feliz año a todos.