Replikasi Session Untuk PHP antar Host

High Availability HTTP Server

Dalam artikel lalu ( https://blogit.bimosaurus.com/2018/05/16/setting-dasar-haproxy-sebagai-https-load-balancer/ ), telah kita pelajari bagaimana sebuah request HTTP, akan dibagikan bebannya ke beberapa server, dengan mekanisme HTTP Load Balancing. Metode LB nya dapat bermacam-macam, seperti Round Robin, First, Least Conn, Source. Metode itu dipilih untuk dapat membagikan beban akses HTTP secara merata.

haproxy-req-scheme

Dalam implementasi LB HTTP dengan backend app menggunakan PHP, adalah masalah session (pada umumnya session handlernya menggunakan FILE). Saat user session terbentuk di Node 1, belum tentu terbuat juga pada Node 2. Maka session akan menjadi tidak stabil, saat akses data harus terpisah dari session utama.

Oleh karena itu, PHP telah menyediakan cara sendiri untuk mengatasinya. PHP telah menyediakan session replication over host (replikasi session PHP antar host). Dengan cara ini, maka setiap session yang terbentuk pada satu node, akan segera terbentuk pada node yang lain.

 

Remote Session Replication dengan Memcached

Pada setting konfigurasi PHP ( php.ini ), terdapat beberapa listing konfigurasi terkait lokasi session, antara lain :

session.save_handler =
session.save_path =

Session.save_handler menentukan pemegang sessionnya akan berupa : file, database, atau method lain. Sedangkan session.save_path menentukan path penyimpanan file session.

Pada tulisan ini diasumsikan bahwa server akan menggunakan memcached-server sebagai session handlernya. Memcached adalah sebuah program yang digunakan untuk menyimpan cache program, agar proses-proses yang biasa dijalankan dapat disimpan dan dapat digunakan ulang (reuse). Memcached bersifat sebagai network service (server) yang berjalan pada port default 11211.

Langkah instalasi memcached:

#Centos 6
yum -y install memcached
chkconfig memcached on
service memcached start
#Centos 7
yum -y install memcached
systemctl enable memcached
systemctl start memcached
#Ubuntu sebelum 14 / Debian 7
apt-get install memcached
update-rc.d memcached enable
service memcached start
#Ubuntu 16 / Debian 8
apt-get install memcached
systemctl enable memcached
service memcached start

 

Testing service Memcached

Cara testing memcached cukup mudah, yaitu

  1. Check Processlist
    ps ax | grep memcached

    Contoh:

    [root@wedhus ~]# ps ax | grep memcached
    10189 pts/0    S+     0:00 grep memcached
    19870 ?        Ssl    3:25 memcached -d -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached.pid -l 0.0.0.0
  2. Check Network Service (mode root)
    netstat -plunt | grep memcached 

    [root@wedhus ~]# netstat -plunt | grep memcached
    tcp        0      0 0.0.0.0:11211             0.0.0.0:*                   LISTEN      19870/memcached     
    udp        0      0 0.0.0.0:11211             0.0.0.0:*                               19870/memcached

 

Setting Konfigurasi PHP untuk replikasi via memcached

 

session.save_handler = memcache
session.save_path = 'tcp://host.node1:11211,tcp://host.node2:11211,tcp://host.node3:11211'

Konfigurasi di atas maksudnya adalah, bahwa segala session yang dibentuk oleh PHP akan disimpan secara otomatis pada tiga tempat : Node1, Node2, Node3.

 

Bisakah Konfigurasi tersebut Disetting Pada Aplikasi?

Setting session.save_path pada aplikasi dapat dilakukan, karena bahasa PHP sendiri dapat melakukan setting session secara mandiri (terlepas dari php.ini).

.
.
ini_set('session.save_handler','memcache');
ini_set('session.save_path','tcp://host.node1:11211,tcp://host.node2:11211,tcp://host.node3:11211');
.
.

 

Amankah Memcached?
Memcached memiliki masalah keamanan yang tercatat sebagai CVE 2018-1000115, yang ternyata CVE dapat digunakan untuk melakukan aksi DDOS oleh seseorang intruder. Hingga saat ini kondisi sebagian besar server Linux belum terpatch untuk masalah kerentanan terhadap Memcached ini. Biasanya, jika penggunaan memcached ini tidak untuk keluar host, kita hanya perlu memastikan bahwa listen ( -l ) pada file /etc/memcached.conf , hanya terset untuk 127.0.0.1.

-p 11211
-u memcache
-l 127.0.0.1

Namun jika kita akan menggunakannya untuk keperluan lain selain di localhost (seperti session replication), maka Listen address dapat tetap pada 0.0.0.0, namun port dapat diganti untuk mengurangi efek risiko. Kemudian memcached difilter dengan firewall :

-p 22122
-u memcache
-l 0.0.0.0
iptables -A INPUT -p tcp --dport 11211 -j DROP
iptables -A INPUT -p udp --dport 11211 -j DROP
iptables -I INPUT -p tcp -s network.host.node/29 --dport 11211 -j ACCEPT
iptables -I INPUT -p udp -s network.host.node/29 --dport 11211 -j ACCEPT

Pada sintaks IPTABLES di atas, kita melakukan aksi white list untuk network.host.node/29 untuk tcp dan udp, selain host tersebut, akan didrop paketnya.

Alternatif Memcached?

Selain Memcached dapat juga digunakan software lain yang lebih secure, misalnya adalah penggunaan redis server. Redis server lebih secure terhadap aksi DDOS, karena secara default, redis memerlukan otentikasi password untuk proses aksesnya. Untuk bagian ini, akan dibahas pada tulisan lainnya.

 

Semoga bermanfaat..

Leave a Reply

Your email address will not be published. Required fields are marked *