Natan Felles


Creative Webmaster


Memcached: Instalar, configurar, proteger, analisar

Blog · desenvolvimento

Memcached: Instalar, configurar, proteger, analisar

Memcached é um serviço desenvolvido para aliviar o carregamento de bancos de dados em aplicações web dinâmicas armazenando objetos na memória.

Fazer repetitivas solicitações no banco de dados através do comando SELECT pode sobrecarregar o sistema, tornando-o lento demais.

Então o memcached chegou para resolver esse problema, ao invés de fazer repetidos comandos no banco de dados você pode salvar as informações obtidas através do SELECT diretamente na memória RAM. O que torna a resposta da sua aplicação muito mais rápida e desafoga o banco de dados.

Neste exemplo foi utilizado uma VM rodando Debian 8 com 512 MB de RAM e IP estático 192.168.1.21.

Instalar

Em distribuições Debian podemos instalar o memcached através do apt:

sudo apt install memcached

Configurar

Por padrão, o memcached vem configurado para rodar na porta 11211, listando em todas as interfaces de rede e capacidade de cachear 64 MB na RAM.

Como esse servidor será exclusivo para cache, irei aumentar a capacidade de armazenamento de dados para 450 MB e modificar a interface padrão (127.0.0.1) para o IP estático dessa máquina (192.168.1.21).

O arquivo de configuração do memcached fica em /etc/memcached.conf e podemos abri-lo com o Vi:

sudo vi /etc/memcached.conf

O arquivo é bem documentado e sugiro que você comente as linhas que for alterar e adicione seus valores personalizados logo abaixo:

/etc/memcached.conf
# memcached default config file
# 2003 - Jay Bonci <jaybonci@debian.org>
# This configuration file is read by the start-memcached script provided as
# part of the Debian GNU/Linux distribution.

# Run memcached as a daemon. This command is implied, and is not needed for the
# daemon to run. See the README.Debian that comes with this package for more
# information.
-d

# Log memcached's output to /var/log/memcached
logfile /var/log/memcached.log

# Be verbose
# -v

# Be even more verbose (print client commands as well)
# -vv

# Start with a cap of 64 megs of memory. It's reasonable, and the daemon default
# Note that the daemon will grow to this size, but does not start out holding this much
# memory
#-m 64
-m 450 # Quantidade personalizada de memória em MegaBytes

# Default connection port is 11211
-p 11211

# Run the daemon as root. The start-memcached will default to running as root if no
# -u command is present in this config file
-u memcache

# Specify which IP address to listen on. The default is to listen on all IP addresses
# This parameter is one of the only security measures that memcached has, so make sure
# it's listening on a firewalled interface.
#-l 127.0.0.1
-l 192.168.1.21 # Único endereço IP em que o memcached irá atender

# Limit the number of simultaneous incoming connections. The daemon default is 1024
# -c 1024

# Lock down all paged memory. Consult with the README and homepage before you do this
# -k

# Return error when memory is exhausted (rather than removing items)
# -M

# Maximize core file limit
# -r

Realizadas as alterações, podemos reiniciar o serviço:

sudo service memcached restart

Proteger

O memcached atenderá apenas no IP 192.168.1.21, na porta 11211. Porém qualquer máquina que possa se comunicar com esse servidor irá poder executar comandos, setar novas informações no cache e também pegar informações salvas e isso pode ser um grave risco a segurança da aplicação.

Uma solução prática é proteger o memcached através de um firewall. Então, vamos instalar o UFW:

sudo apt install ufw

A primeira coisa a ser feita depois da instalação é definir a regra padrão do nosso firewall.

O UFW irá permitir todas as requisições de saída e bloquer todas as requisições de entrada:

sudo ufw default allow outgoing
sudo ufw default deny incoming

Se você deseja que o memcached atenda somente para um endereço IP, pode setar uma regra assim como essa:

sudo ufw allow from 192.168.1.2 to any port 11211 proto tcp

Mas se deseja que o memcached fique disponível em qualquer máquina da sua rede, pode definir desta maneira:

sudo ufw allow from 192.168.1.0/24 to any port 11211 proto tcp

Confira se as regras estão ativas:

sudo ufw status numbered

O UFW possui um manual bem explicativo e com exemplos. Veja a sua manpage sempre que necessário.

Analisar

Uma das maneiras mais práticas de monitorar o uso do seu servidor de cache, ou até mesmo de clusters, é a utilização do PHPMemcachedAdmin.

Supondo que você já possua um servidor web instalado em uma das máquinas da sua rede, você pode entrar no diretório desejado e instalar o PHPMemcachedAdmin desta forma:

wget https://github.com/elijaa/phpmemcachedadmin/archive/master.zip
unzip master.zip
mv phpmemcacheadmin-master phpmemcacheadmin
cd phpmemcacheadmin
chmod +rx *
chmod 777 Config/Memcache.php
chmod 777 Temp/

Depois de fazer o download, descompactar, renomear, entrar e setar as permissões corretas nos arquivos do sistema, você poderá acessar a interface web em seu navegador.

O PHPMemcachedAdmin permite que você adicione quantos servidores desejar, tanto pela interface web como pelo arquivo de configuração em phpmemcacheadmin/Config/Memcache.php. Dessa vez, já irei deixar o servidor recém configurado disponível no cluster Default:

vi phpmemcacheadmin/Config/Memcache.php
phpmemcacheadmin/Config/Memcache.php
<?php
return array(
    'stats_api'          => 'Server',
    'slabs_api'          => 'Server',
    'items_api'          => 'Server',
    'get_api'            => 'Server',
    'set_api'            => 'Server',
    'delete_api'         => 'Server',
    'flush_all_api'      => 'Server',
    'connection_timeout' => '1',
    'max_item_dump'      => '100',
    'refresh_rate'       => 2,
    'memory_alert'       => '80',
    'hit_rate_alert'     => '90',
    'eviction_alert'     => '0',
    'file_path'          => 'Temp/',
    'servers'            => array(
        'Default' => array(
            '192.168.1.21:11211' => array(
                'hostname' => '192.168.1.21',
                'port'     => '11211',
            ),
        ),
    ),
);

À partir de agora podemos analisar em tempo real o uso do nosso servidor memcached.

Fontes