Memcached: installazione e configurazione in Linux CentOS e PHP
Memcached è un database di tipo NoSQL (Not Only SQL), che archivia i dati in maniera completamente differente dai classici database relazionali come ad esempio MySQL.
Oltre a Memcached, tra i NoSQL, possiamo menzionare Apache Cassandra, MongoDB, Redis e Amazon DynamoDB.
I database NoSQL si dividono in quattro differenti tipologie: chiave-valore, orientato ai documenti, a grafo, orientati alle colonne: Memcached utilizza la tipologia "chiave-valore" in cui ogni singolo elemento viene salvato con una chiave assieme al suo valore. Vedremo nel prossimo articolo esempi pratici il suo utilizzo.
Oggi ci occupiamo dell'installazione di Memcached su una distribuzione Centos 8 e PHP 7.
Installazione di Memcached
Utilizziamo yum, o dnf, per installare Memcached, assieme alla libreria libmemcached
# yum install memcached libmemcached
Ultimata l'installazione, per esser certi della sua installazione, e per conoscere la versione installata, digitiamo
# rpm -q memcached
Otteniamo come risposta la versione installata
memcached-1.5.9-3.el8.x86_64
Per avere informazioni aggiuntive sull'installazione effettuata aggiungiamo l'attributo "i"
# rpm -qi memcached
Ecco il risultato
Name : memcached
Epoch : 0
Version : 1.5.9
Release : 3.el8
Architecture: x86_64
Install Date: Wed 23 Sep 2020 09:26:13 AM CEST
Group : System Environment/Daemons
Size : 280586
License : BSD
Signature : RSA/SHA256, Tue 07 Apr 2020 03:18:39 AM CEST, Key ID 05b555b38483c65d
Source RPM : memcached-1.5.9-3.el8.src.rpm
Build Date : Mon 06 Apr 2020 10:41:42 PM CEST
Build Host : x86-01.mbox.centos.org
Relocations : (not relocatable)
Packager : CentOS Buildsys <bugs@centos.org>
Vendor : CentOS
URL : https://www.memcached.org/
Summary : High Performance, Distributed Memory Object Cache
Description :
memcached is a high-performance, distributed memory object caching
system, generic in nature, but intended for use in speeding up dynamic
web applications by alleviating database load.
Configurazione di Memcached
Il file di configurazione è localizzato sotto "/etc/sysconfig" e si chiama "memcached".
Per verificare il suo contenuto utilizziamo il comando "cat" come segue
# cat -n /etc/sysconfig/memcached
Questo il contenuto del file di configurazione
1 PORT="11211"
2 USER="memcached"
3 MAXCONN="1024"
4 CACHESIZE="64"
5 OPTIONS="-l 127.0.0.1,::1"
Queste sono le configurazioni previste di default
- La porta del servizio è la 11211
- L'utente associato a questo servizio è memcached
- Il numero massimo di connessioni previste è 1024
-
La quantità di RAM destinata alla memorizzazione dei dati è 64 MB
- la nostra applicazione (il nostro sito) utilizza Memcached localizzato sulla stessa macchina, per cui l'ip indicato è 127.0.0.1
Questa configurazione è ovviamente modificabile.
Ad esempio per aumetare la sicurezza, essendo il protocollo UDP più sogggetto a queste tipologie di attacchi di tipo DOS (denial of service) possiamo disabilitare la porta UDP, lanciando aperta la sola TPC
Per fare questo aggiungiamo il parametro "-U 0" ad "OPTIONS"
5 OPTIONS="-l 127.0.0.1 -U 0"
Se invece volessimo connetterci ad una macchina diversa, quindi con un IP diverso, sostituiamo o aggiungiamo all'ip 127.0.0.1, l'ip della macchina, ad esempio l'ip 192.168.100.30
5 OPTIONS="-l 127.0.0.1,192.168.100.30,::1 -U 0"
Configurazione del firewall
Se la macchina che si collega a Memcahced è localizzata sulla stessa macchiana su cui è installato Memcached, probabilmente non dovrebe far nulla a livello firewall perchè normalmente le chiamate provenineti da localhost vengono accettate. Ma se, come nel nostro esempio, la chiamata avviene da una macchina diversa, la 192.168.100.30, dobbiamo aggiungere delle regole.
Abbiamo detto che la porta usata dal servizio è la 11211, dobbiamo aprire quindi questa porta sul firewall all'ip 192.168.100.30.
Se utilizziamo IPtables aggiungiamo questa regola
# iptables -A INPUT -p tcp -s 192.168.100.30/32 --dport 11211 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
Se invece utilizziamo Firewalld, aggiungiamo una nuova zona chiamata "memcached", specifichiamo poi la porta tpc 11211 da aprire, e infine abilitiamo l'ip che può accedere.
# firewall-cmd --permanent --new-zone=memcached
# firewall-cmd --permanent --zone=memcached --add-port=11211/tcp
# firewall-cmd --permanent --zone=memcached --add-source=192.168.100.30/32
Ricorda di riavviare il firewall!
Avviamo Memcached
Bene, abbiamo ultimato l'installazione. Procediamo con l'avvio del servizio
# systemctl start memcached
Per abilitare il servizio all'avvio automatico al riavvio del server
# systemctl enable memcached
Per verificare lo stato del servizio
# systemctl status memcached
Verifichiamo, con netstat, che Memcached sia associato all'interfaccia locale e ascolti solo le connessioni TCP
# netstat -plunt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 23499/memcached
tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN 8730/systemd-resolv
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 21452/rpc.mountd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 8029/sshd
tcp 0 0 0.0.0.0:57079 0.0.0.0:* LISTEN 8764/rpc.statd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 8098/master
tcp 0 0 0.0.0.0:40029 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp6 0 0 :::3306 :::* LISTEN 16445/mysqld
tcp6 0 0 ::1:11211 :::* LISTEN 23499/memcached
tcp6 0 0 :::5355 :::* LISTEN 8730/systemd-resolv
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::20048 :::* LISTEN 21452/rpc.mountd
tcp6 0 0 :::80 :::* LISTEN 374/httpd
tcp6 0 0 :::34549 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN 8029/sshd
tcp6 0 0 :::443 :::* LISTEN 374/httpd
tcp6 0 0 :::57339 :::* LISTEN 8764/rpc.statd
tcp6 0 0 :::2049 :::* LISTEN -
udp 0 0 0.0.0.0:20048 0.0.0.0:* 21452/rpc.mountd
udp 0 0 0.0.0.0:37570 0.0.0.0:* 8764/rpc.statd
udp 0 0 0.0.0.0:47310 0.0.0.0:* -
udp 0 0 127.0.0.53:53 0.0.0.0:* 8730/systemd-resolv
udp 0 0 51.195.4.100:68 0.0.0.0:* 7234/NetworkManager
udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
udp 0 0 127.0.0.1:323 0.0.0.0:* 3989/chronyd
udp 0 0 127.0.0.1:884 0.0.0.0:* 8764/rpc.statd
udp 0 0 0.0.0.0:5355 0.0.0.0:* 8730/systemd-resolv
udp6 0 0 :::20048 :::* 21452/rpc.mountd
udp6 0 0 :::36581 :::* -
udp6 0 0 :::42714 :::* 8764/rpc.statd
udp6 0 0 :::111 :::* 1/systemd
udp6 0 0 ::1:323 :::* 3989/chronyd
udp6 0 0 :::5355 :::* 8730/systemd-resolv
PHP e Memcached
Affinchè PHP possa lavorare con Memcached, dobbiamo installare l'estensione php-pecl-memcached
Questa estensione non è disponibile nei repositori di default di CentOS 8, ma dobbiamo abilitare i noti repo "epel" e "remi"
E' importante anche conoscere la versione di PHP installata sul nostro server, e per farlo utilizziamo il comando "php -v". Noi abbiamo la 7.2.11
Bene, possiamo procedere con l'installazione
# yum install epel-release
# yum install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
Conoscendo la versione di PHP installata, nel nostro caso la 7.2, procediamo così
# yum module enable php:remi-7.2
Ed infine
# yum install php-pecl-memcache php-pecl-memcached
Riavviamo il webserver Apache (o Nginx) e verifichiamo che sia l'estensione sia effettivamente installata creando un file php, ad esempio info.php, con dentro questo codice
<?php
phpinfo();
?>
Apriamolo da browser e se individuiamo le sezioni relative a Memached, significherà che l'installazione è andata a buon fine!
Nel prossimo articolo vedremo esempi relativi all'utilizzo di Memached con PHP.
Stay tuned!