Membuat Website WordPress dengan LoadBalance

Assalamualaikum Wr. Wb.

Perkenalkan nama saya Imron Rosyadi, pada kesempatan kali ini saya akan membagikan informasi tentang bagaimana cara membuat website dengan CMS WordPress menggunakan konsep loadbalance. Namun sebelumnya, perlu diketahui terlebih dahulu pengertian dari loadbalance.

Secara singkat loadbalance merupakan sebuah proses yang dapat berbagi task pada masing-masing server sehingga beban kerja tidak hanya pada satu server saja. Hal ini dapat menghemat resource server dan proses task dapat dikerjakan secara lebih efektif dan efisien. Untuk detailnya bisa melihat pada tautan berikut ini.

Adapun topologi yang saya gunakan seperti pada gambar 1 :

Gambar 1 : Topologi Jaringan Loadbalancer

Pada topologi tersebut saya menggunakan dua node backend sebagai web server (Nginx), dimana kedua web server tersebut saling terkoneksi menggunakan lsynd. Adapun node database server secara terpisah, begitu juga pada node loadbalancer. Untuk koneksi antara node web server, database server, dan load balance menggunakan IP Private. Sedangkan untuk koneksi ke luar menggunakan IP Public dari node Haproxy.

A. Persiapan Bahan :

1 VM sebagai database server

2 VM sebagai web server (backend)

1 VM sebagai loadbalancer (frontend)

Sistem operasi CentOs 7

Software : MariaDB, Nginx, Haproxy, lsyncd

B. Instalasi dan Konfigurasi

1. Instalasi dan konfigurasi Node Web Server

  • Langkah pertama, update paket ke versi yang paling terbaru pada masing-masing node (web server, database server, dan loadbalance) menggunakan perintah : yum update -y
  • Setelah itu, install paket epel pada node web server dan database server menggunakan perintah : yum install epel-release htop yum-utils -y
  • Kemudian install nginx dan aktifkan service tersebut pada node web server : yum install nginx , systemctl enable && systemctl start nginx
  • Install php versi 7.2 dan modul-modul php tersebut beserta aktifkan service php-fpm dengan perintah sebagai berikut : yum-config-manager --enable remi-php72 , lalu jalankan perintah :

yum -y install php php-intl php-common php-opcache php-mcrypt php-cli php-gd php-curl php-mysqlnd php-dom php-curl php-zip php-mbstring php-xml php-xmlreader php-simplexml php-bcmath php-soap php-amqplib php-fpm;

systemctl enable php-fpm && systemctl start php-fpm

  • Selanjutnya, tambahkan server block berikut pada node webserver 1 : vim /etc/nginx/conf.d/wordpress.conf
server {
    listen       80;
    server_name haproxy.imron.my.id;

    # note that these lines are originally from the "location /" block
    root   /usr/share/nginx/html/wordpress;
    index index.php index.html index.htm;
    # log files
    access_log /var/log/nginx/haproxy.imron.my.id-access.log;
    error_log /var/log/nginx/haproxy.imron.my.id-error.log;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass   127.0.0.1:9072;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Keterangan :

server_name : Isikan dengan nama domain atau sub domain Anda
root : Letak direktori file website
access_log : Letak akses log website
error_log : Letak error log website
fastcgi_pass : Port php-fpm yang digunakan
  • Simpan hasil konfigurasi server block dan restart service nginx dengan perintah : systemctl restart nginx
  • Setelah itu, melakukan konfigurasi php-fpm dan ubah user/group menjadi nginx serta port php-fpm menjadi 9072 sesuai dengan konfigurasi server-block sebelumnya.
  • Restart service php-fpm dengan perintah : systemctl restart php-fpm
  • Langkah selanjutnya, download file wordpress pada node web server 1 dengan perintah : wget -c "http://wordpress.org/latest.tar.gz";
  • Lalu, esktrak file wordpress dan masukan ke folder website Anda serta berikan hak akses user dan grup pada folder wordpress dengan nginx: chown -R nginx:nginx /usr/share/nginx/html/wordpress

2. Mengatur koneksi database website

  • Masuk ke direktori wordpress, cd /usr/share/nginx/html/wordpress
  • Copy file wp-config-sample.php menjadi file wp-config.php dan edit file tersebut vim wp-config.php . Masukkan nama, user, password, dan host yang akan digunakan nantinya, kurang lebih sebagai berikut :
define( 'DB_NAME', 'wp_lb' );
define( 'DB_USER', 'wp_user' );
define( 'DB_PASSWORD', 'isikan password' );
define( 'DB_HOST', '10.10.12.4' );
  • Definisikan site_url dan home_url pada WordPress, agar website tidak hanya menggunakan satu hostname saja,vim wp-config.php
define( 'WP_HOME',    'http://' . $_SERVER['HTTP_HOST'] );
define( 'WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] );

3. Install & konfigurasi lsynd pada node web server 1

Service lsynd berguna agar data yang terdapat pada node 1 dan yang lainnya sinkron secara otomatis, apabila terdapat perubahan data pada node 1 maka pada node yang lainnya akan menyesuaikan secara otomatis. Dalam hal ini node 1 dan node 2 (web server). Adapun direktori yang disesuaikan juga bisa dicustom, disini saya mengsinkronkan file konfigurasi server block dan dokumen root website wordpress.

  • Install lsyncd terlebih dahulu dengan perintah : yum install lsyncd -y
  • Kemudian, aktifkan service lsyncd dengan perintah : systemctl enable lsyncd && systemctl start lsyncd
  • Setelah itu, pastikan node web server 1 bisa ssh ke node web server 2 tanpa menggunakan password. Lalu masukkan konfigurasi berikut pada file /etc/lsyncd.conf. Sesuaikan ip yang Anda gunakan pada node web server 2.
 -- User configuration file for lsyncd.
 -- Simple example for default rsync.
 settings {
     logfile = "/var/log/lsyncd.log",
         statusFile = "/var/log/lsyncd.stat",
     statusInterval = 2,
 }
 sync{
     default.rsync,
     source="/usr/share/nginx/html/wordpress",
     target="10.10.12.3:/usr/share/nginx/html/wordpress",
 rsync={
     update  = true,
         perms   = true,
         owner   = true,
         group   = true, 
     rsh ="/usr/bin/ssh -l root -i /root/.ssh/id_rsa",}
 }
 sync{
         default.rsync,
         source="/etc/nginx/conf.d/",
         target="10.10.12.3:/etc/nginx/conf.d/",
 rsync={
         update  = true,
         perms   = true,
         owner   = true,
         group   = true,
         rsh ="/usr/bin/ssh -l root -i /root/.ssh/id_rsa",}
 }
  • Selanjutnya, restart service lsyncd pada node web server 1 : systemctl restart lsyncd dan restart nginx serta php-fpm pada node web server 2 : systemctl restart nginx && systemctl restart php-fpm
  • Selanjutnya lihat status log dari lsyncd pada node web server 1, apabila finished seperti pada gambar 2 maka sinkronisasi berhasil dilakukan .
Gambar 2 : Status Log Lsyncd

4. Instalasi dan Konfigurasi Node Database Server

  • Install mariaDB pada node database server, sebelumnya tambahkan repo mariaDB terlebih dahulu, vi /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
  • Lalu, jalankan perintah : yum install -y mariadb-server, dan aktifkan service mariadb dengan perintah : systemctl start mariadb, systemctl enable mariadb, selanjutnya improve security mariadb dengan menjalankan perintah :mysql_secure_installation
  • Login ke mysql dan buat database dengan nama wp_lb, dengan perintah : mysql -u root -p dan jalankan juga perintah : create database wp_lb;
  • Berikan akses database wp_lb ke user wp_user dengan perintah :

    GRANT ALL PRIVILEGES on wp_lb.* to 'wp_user'@'%' IDENTIFIED BY 'isikan_password';

flush privileges;

5. Instalasi dan konfigurasi node loadbalancer

  • Langkah berikutnya, install haproxy pada node loadbalance dan aktifkan servicenya : yum install haproxy -y , systemctl start haproxy, systemctl enable haproxy
  • Backup terlebih dahulu file haproxy.conf, lalu masukkan data konfigurasi berikut pada file /etc/haproxy/haproxy.cfg.
---------------------------------------------------------------------
 Example configuration for a possible web application.  See the
 full configuration options online.
 #
 http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
 #
 ---------------------------------------------------------------------
 ---------------------------------------------------------------------
 Global settings
 ---------------------------------------------------------------------
 global
     # to have these messages end up in /var/log/haproxy.log you will
     # need to:
     #
     # 1) configure syslog to accept network log events.  This is done
     #    by adding the '-r' option to the SYSLOGD_OPTIONS in
     #    /etc/sysconfig/syslog
     #
     # 2) configure local2 events to go to the /var/log/haproxy.log
     #   file. A line like the following can be added to
     #   /etc/sysconfig/syslog
     #
     #    local2.*                       /var/log/haproxy.log
     #
     log         127.0.0.1 local2
     chroot      /var/lib/haproxy
     pidfile     /var/run/haproxy.pid
     maxconn     4000
     user        haproxy
     group       haproxy
     daemon
 # turn on stats unix socket stats socket /var/lib/haproxy/stats
 ---------------------------------------------------------------------
 common defaults that all the 'listen' and 'backend' sections will
 use if not designated in their block
 ---------------------------------------------------------------------
 defaults
     mode                    http
     log                     global
     option                  httplog
     option                  dontlognull
     option http-server-close
     option forwardfor       except 127.0.0.0/8
     option                  redispatch
     retries                 3
     timeout http-request    10s
     timeout queue           1m
     timeout connect         10s
     timeout client          1m
     timeout server          1m
     timeout http-keep-alive 10s
     timeout check           10s
     maxconn                 3000
 ---------------------------------------------------------------------
 HAProxy Monitoring Config
 ---------------------------------------------------------------------
 listen haproxy3-monitoring *:8080                #Haproxy Monitoring run on port 8080
     mode http
     option forwardfor
     option httpclose
     stats enable
     stats show-legends
     stats refresh 5s
     stats uri /stats                             #URL for HAProxy monitoring
     stats realm Haproxy\ Statistics
     stats auth <username>:<passwd>            #User and Password for login to the monitoring dashboard
     stats admin if TRUE
     default_backend app-main                    #This is optionally for monitoring backend
 ---------------------------------------------------------------------
---------------------------------------------------------------------
 FrontEnd Configuration
 ---------------------------------------------------------------------
 frontend main
     bind *:80
     option http-server-close
     option forwardfor
     reqadd X-Forwarded-Proto:\ http
     default_backend app-main
     mode http
 acl url_admin  path_beg  -i  /wp-admin /wp-login.php
 acl url_admin hdr(Cookie) core-backend
 use_backend core-backend if url_admin
 http-response set-header X-Server-Node %s
 default_backend dual-backend
 ---------------------------------------------------------------------
 round robin balancing between the various backends
 ---------------------------------------------------------------------
 backend app-main
     balance     roundrobin
     #option httpchk HEAD / HTTP/1.1\r\nHost:\ localhost
     server  app1 10.10.12.2:80 check
     server  app2 10.10.12.3:80 check

Keterangan :

Sesuaikan dengan IP node web server 1 dan node web server 2.
  • Restart service haproxy dan pastikan status haproxy running : systemctl restart haproxy, systemctl status haproxy;

C. Pengujian :

  • Akses website WordPress Anda menggunakan IP Address Public dari node Haproxy atau domain yang sudah Anda pointing ke node Haproxy, jika berhasil maka akan muncul tampilan instalasi wordpress seperti biasa. Lakukan instalasi wordpress.
  • Jika sudah selesai, maka akan tampil kurang lebih seperti pada gambar 3.
Gambar 3 : Website WordPress dengan LoadBalance
  • Untuk memastikan apakah server backend (node web server 1 dan web server 2 berjalan dengan baik, Anda dapat mencoba membuka halaman yang lain pada website tersebut.
  • Nantinya pada bagian X-Server-Node akan berganti node seperti pada gambar 4 dan gambar 5 :
Gambar 4 : Posisi pada Server Node 1
Gambar 5 : Posisi pada Server Node 2
  • Selain itu, Anda juga dapat melakukan monitoring pada status node haproxy menggunakan URL yang sudah dideklarasikan sebelumnya pada file konfigurasi haproxy, kurang lebih seperti pada gambar 6.
Gambar 6 : Monitoring Node LoadBalancer

Referensi : WordPress-Load-Balance-Layer-7

Sekian dan terima kasih, semoga bermanfaat 🙂

Wassalamualaikum Wr. Wb.

Leave a Reply

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