Cómo integrar Nginx y Memcached

nginxNginx 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

5 comentarios en “Cómo integrar Nginx y Memcached

Comments are closed.