Load balancer website wordpress ( Apache Nginx )


Dalam hal ini penulis ingin sharing tutorial untuk menambah wawasan dan logika mengenai infrastruktur load balancing dan high availability sebuah website atau aplikasi. Beberapa hal yang perlu dipersiapkan dalam hal ini adalah :

  1. Sebuah appliance / VM load balancer 
    Anda bisa menggunakan appliance load balancer yang banyak dijual di internet. Penulis disini menggunakan VM Load balancer Kemp. Disamping mudah implementasinya, Kemp ini juga sudah memiliki VM yang ready to deploy untuk infrastructure Windows Hyper V. Sehingga implementasi dalam instalasi tidak menyulitkan penulis.

  2. 2 Unit webserver wordpress dengan operating system Ubuntu 14.04 ( Apache Nginx )
    Kebutuhan 2 server diatas adalah digunakan untuk instalasi CMS Wordpress diatasnya.

  3. 1 Unit server database operating system Ubuntu 14.04
    Remote database akan dijalankan untuk sinkronisasi system wordpress sendiri pada 2 webserver diatas.

Untuk memudahkan gambaran kebutuhannya berikut saya lampirkan design infrastruktur load balancing wordpress website.

 

 

Langkah selanjutnya kita harus menentukan domain, ip address dan Rsync untuk folder upload wordpress dari tiap server.

 

  1. Nama Domain : http://website_anda.com ( arahkah ip public ip_public_server_loadbalancer ke domain  http://website_anda.com ) * ip forwarding

  2. IP Load Balancer (NIC1:  ip_public_server_loadbalancer ) & ( NIC2:  ip_private_server_loadbalancer)

    Penulis disini menggunakan ip public dan ip lokal pada load balancer dikarenakan dari sisi public, user akan mengakses domain yang diforward dengan ip public load balancer.
    Selain itu dibutuhkan juga ip lokal pada load balancer untuk menghubungkan webserver dan database server sehingga sistem load balancer dapat terbangun dengan baik.

  3. Setup wordpress pada wordpress server 1 (  ip_private_server_1 )

    Dibutuhkan blok subnet yang sama dengan load balancer ( 192.168.1.0/24 ) agar komunikasi dapat dengan baik terhubung.

  4. setup wordpress pada wordpress server 2 ( ip_private_server_2)

    Penggunaan blok subnet yang sama dengan load balancer dan juga webserver 1 ( 192.168.1.0 /24 ) agar antara load balancer-webserver1-webserver2 dapat berkomunikasi dengan baik.

  5. setup remote database Server ( ip_private_server_database )

    Pada database juga diperlukan ip yang sama dengan load balancer, webserver1, webserver2.

  6. Setup Rsync untuk folder upload wordpress

Berikut adalah contoh skema yang sudah penulis buat :



Langkah pertama siapkan database server agar webserver dapat melakukan remote database untuk instalasi wordpress.


  1. Updating your package cache and installing the MySQL server:

    sudo apt-get update
    sudo apt-get install mysql-server

  2. Anda perlu menjalankan database instalation command untuk melakukan konfigurasi keamanan  

    sudo mysql_install_db
    sudo mysql_secure_installation

    Anda perlu memasukkan administrator password pada saat melakukan instalasi sebelumnya  dan jika ada pertanyaan mengenai pengubahan password silahkan pilih "N" jika tidak ingin adanya perubahaan password. Kemudian Klik "Enter" pada pertanyaan - pertanyaan selanjutnya.

  3. Konfigur MySQL agar dapat diakses secara remote.

    sudo nano /etc/mysql/my.cnf 

    Tekan Ctrl-W untuk mencari bind-address.

    Kemudian rubah seperti di bawah ini :

    bind-address        = your_database_IP

    Simpan Ctrl-O dan Ctrl-X untuk tutup file.

    Restart MySQL Service

    sudo service mysql restart


  4. Setup remote wordpress credential dan database

    mysql -u root -p

    Membuat database wordpress.

    CREATE DATABASE wordpress;

    Create 2 user dan 2 password untuk localhost. ( isi wordpressuser dan password sesuai dengan yang anda inginkan )

    Localhost user dan password untuk wordpress server 1

    CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'password';

    Localhost user dan password untuk wordpress server 2

    CREATE USER 'wordpressuser2'@'localhost' IDENTIFIED BY 'password';


    Buat user dan password untuk 2 webserver agar database dapat diakses dari 2 webserver tersebut  ( ip dari wordpress server 1 : 192.168.4.134 ; wordpress server 2 : 192.168.4.149 )

    Buat user dan password untuk akun wordpress server 1

    CREATE USER 'wordpressuser'@'ip_private_server_1' IDENTIFIED BY 'password';

    Buat user dan password untuk akun wordpress server 2

    CREATE USER 'wordpressuser2'@'ip_private_server_2' IDENTIFIED BY 'password';

    Beri akses untuk 2 user tersebut dapat melakukan modifikasi pada database.

    Grant user untuk wordpress server 1

    GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'ip_private_server_1';

    Grant user untuk wordpress server 2

    GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser2'@'ip_private_server_2';

    Anda juga bisa menambahkan command di bawah ini untuk 2 akun webserver

    GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'ip_private_server_1';

    GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser2'@'ip_private_server_2';


    Kemudian flush privilage

    FLUSH PRIVILEGES;

    EXIT;

  5. Test Remote ke database server dari wordpress webserver 1

    Update ubuntu anda

    sudo apt-get update

    Install mysql client pada server

    sudo apt-get install mysql-client

    Remote Database Server ( IP database ip_private_server_database )

    mysql -u wordpressuser -h ip_private_server_database -p

    Jika berhasil terhubung maka akan muncul verifikasi ke database server

 

 

 

Langkah kedua lakukan setup dan instalasi wordpress webserver 1.

  1. Update package 

    apt-get update && apt-get upgrade

  2. Install NginX

    NginX merupakan web server ringan yang memiliki performa tinggi. Di desain sesuai dengan kebutuhan pengiriman static content dalam jumlah besar dengan konsumsi sistem resource yang efisien. 

    sudo apt-get install python-software-properties
    add-apt-repository -y ppa:rtcamp/nginx
    sudo apt-get update
    sudo apt-get install nginx
    service nginx start

  3. Sekarang, coba test untuk menjalankan server yang sudah terinstall nginx

    http://ip_private_server_1

    Jika sudah benar, maka akan muncul landing page nginx

  4. Install PHP 5.5

    PHP adalah open source yang paling banyak digunakan untuk scripting dan sangat cocok untuk web development. PHP juga dapat di embed dengan HTML.

    sudo add-apt-repository ppa:ondrej/php5
    sudo apt-get update
    sudo apt-get install php5-common php5-mysqlnd php5-xmlrpc php5-curl php5-gd php5-cli php5-fpm php-pear php5-dev php5-imap php5-mcrypt

  5. Jika anda ingin mengecek versi Php

    php -v

  6. Sekarang kita akan buat sedikit perubahan konfigurasi agar webserver lebih aman. Buka php5-fpm configuration dengan privilage root :

    sudo nano /etc/php5/fpm/php.ini

  7. Tekan Ctrl+W dan cari cgi.fix_pathinfo=. rubah dari nilai 1 ke 0. setelah perubahan akan jadi seperti di bawah ini :

    cgi.fix_pathinfo=0

    Save (Ctrl+O) dan tutup file (Ctrl+X).

    Kemudian restart PHP Processore

    sudo service php5-fpm restart

  8. Langkah selanjutnya konfigurasi nginx untuk wordpress.

    Dimulai dengan membuat server block nginx untuk website

    sudo nano /etc/nginx/sites-available/wordpress

    Paste kode di bawah ini :

    server {
    listen 80;

    root /var/www/wordpress;
    index index.php index.html index.htm;

    server_name domain.com;

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /usr/share/nginx/html;
    }
    location / {
    # try_files $uri $uri/ =404;
    try_files $uri $uri/ /index.php?q=$uri&$args;
    }


    location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }

    location = /favicon.ico {
    access_log off;
    log_not_found off;
    expires max;
    }
    location = /robots.txt {
    access_log off;
    log_not_found off;
    }

    # Cache Static Files For As Long As Possible
    location ~*
    \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$
    {
    access_log off;
    log_not_found off;
    expires max;
    }
    # Security Settings For Better Privacy Deny Hidden Files
    location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
    }
    # Return 403 Forbidden For readme.(txt|html) or license.(txt|html)
    if ($request_uri ~* "^.+(readme|license)\.(txt|html)$") {
    return 403;
    }
    # Disallow PHP In Upload Folder
    location /wp-content/uploads/ {
    location ~ \.php$ {
    deny all;
    }
    }
    }

  9.  

    Konfigurasi ini agar Wordpress support permalinks . Save (Ctrl+O) and tutup file (Ctrl+X). cara enable :

    sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress


    Selanjutnya kita hapus NginX default server block

    sudo rm /etc/nginx/sites-enabled/default

    Selanjutnya kita konfigure Nginx main file

    sudo nano /etc/nginx/nginx.conf

    Pastikan jumlah worker processore sama dengan jumlah core pada VM / Webserver anda.

    user www-data;
    worker_processes 1;
    pid /run/nginx.pid;

    tambahkan use epoll; , ke dalam event {

    events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
    }

    tambahkan client_max_body_size and server_tokens off,. Set keepalive_timeout ke 30 seconds.

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 30;
    types_hash_max_size 2048;
    server_tokens off;
    client_max_body_size 100m;


    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    Pastikan gzip setting block seperti di bawah ini : 

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;


    Simpan (Ctrl+O) and tutup file (Ctrl+X). restart server:

    sudo service nginx restart


  10. Configure PHP.

    Jika anda ingin dapat upload file lebih dari 2Mb ke wordpress site anda perlu melakukan konfigurasi upload size di php.ini :


    sudo nano /etc/php5/fpm/php.ini

    Tekan Ctrl+W and cari "upload_max_filesize" dan ubah ke 100m. 

    upload_max_filesize=100M

    Lakukan hal yang sama pada post_max_size. 

    post_max_size=100M


    Restart PHP

    sudo service php5-fpm restart

  11. Install file wordpress

    Navigasi ke directory root :

    mkdir /var/www/
    cd /var/www/

    Download wordpress terbaru :

    wget http://wordpress.org/latest.tar.gz

    Extract :

    tar -xzvf latest.tar.gz

    Beri permission  /var/www/wordpress ke www-data user. Ini akan membantu update otomatis pada wordpress dan file editing dengan SFTP.

    mkdir wordpress
    sudo chown -R www-data:www-data wordpress/
    sudo usermod -a -G www-data www-data



  12. Setup wordpress anda melalui webbrowser. Buka url http://ip_private_server_1 pada browser anda untuk melakukan setup wordpress.




  13. Masukkan nama domain untuk website pada wordpress tersebut.





Langkah selanjutnya adalah melakukan konfigurasi yang sama pada wordpress server 2

  1. Update package 

    apt-get update && apt-get upgrade

  2. Install NginX

    NginX merupakan web server ringan yang memiliki performa tinggi. Di desain sesuai dengan kebutuhan pengiriman static content dalam jumlah besar dengan konsumsi sistem resource yang efisien. 

    sudo apt-get install python-software-properties
    add-apt-repository -y ppa:rtcamp/nginx
    sudo apt-get update 
    sudo apt-get install nginx
    service nginx start

  3. Sekarang, coba test untuk menjalankan server yang sudah terinstall nginx

    http://ip_private_server_2

    Jika sudah benar, maka akan muncul landing page nginx

  4. Install PHP 5.5

    PHP adalah open source yang paling banyak digunakan untuk scripting dan sangat cocok untuk web development. PHP juga dapat di embed dengan HTML.

    sudo add-apt-repository ppa:ondrej/php5
    sudo apt-get update
    sudo apt-get install php5-common php5-mysqlnd php5-xmlrpc php5-curl php5-gd php5-cli php5-fpm php-pear php5-dev php5-imap php5-mcrypt

  5. Jika anda ingin mengecek versi Php

    php -v

  6. Sekarang kita akan buat sedikit perubahan konfigurasi agar webserver lebih aman. Buka php5-fpm configuration dengan privilage root :

    sudo nano /etc/php5/fpm/php.ini

  7. Tekan Ctrl+W dan cari cgi.fix_pathinfo=. rubah dari nilai 1 ke 0. setelah perubahan akan jadi seperti di bawah ini :

    cgi.fix_pathinfo=0

    Save (Ctrl+O) dan tutup file (Ctrl+X).

    Kemudian restart PHP Processore

    sudo service php5-fpm restart

  8. Langkah selanjutnya konfigurasi nginx untuk wordpress.

    Dimulai dengan membuat server block nginx untuk website

    sudo nano /etc/nginx/sites-available/wordpress

    Paste kode di bawah ini :

    server {
    listen 80;

    root /var/www/wordpress;
    index index.php index.html index.htm;

    server_name domain.com;

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /usr/share/nginx/html;

    location / {
    # try_files $uri $uri/ =404;
    try_files $uri $uri/ /index.php?q=$uri&$args;
    }


    location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }

    location = /favicon.ico {
    access_log off;
    log_not_found off;
    expires max;
    }
    location = /robots.txt {
    access_log off;
    log_not_found off;
    }

    # Cache Static Files For As Long As Possible
    location ~*
    \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$
    {
    access_log off;
    log_not_found off;
    expires max;
    }
    # Security Settings For Better Privacy Deny Hidden Files
    location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
    }
    # Return 403 Forbidden For readme.(txt|html) or license.(txt|html)
    if ($request_uri ~* "^.+(readme|license)\.(txt|html)$") {
    return 403;
    }
    # Disallow PHP In Upload Folder
    location /wp-content/uploads/ {
    location ~ \.php$ {
    deny all;
    }
    }
    }

  9.  

    Konfigurasi ini agar Wordpress support permalinks . Save (Ctrl+O) and tutup file (Ctrl+X). cara enable :

    sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress


    Selanjutnya kita hapus NginX default server block

    sudo rm /etc/nginx/sites-enabled/default

    Selanjutnya kita konfigure Nginx main file

    sudo nano /etc/nginx/nginx.conf

    Pastikan jumlah worker processore sama dengan jumlah core pada VM / Webserver anda.

    user www-data;
    worker_processes 1;
    pid /run/nginx.pid;

    tambahkan use epoll; , ke dalam event {

    events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
    }

    tambahkan client_max_body_size and server_tokens off,. Set keepalive_timeout ke 30 seconds.

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 30;
    types_hash_max_size 2048;
    server_tokens off;
    client_max_body_size 100m;


    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    Pastikan gzip setting block seperti di bawah ini : 

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;


    Simpan (Ctrl+O) and tutup file (Ctrl+X). restart server:

    sudo service nginx restart


  10. Configure PHP.

    Jika anda ingin dapat upload file lebih dari 2Mb ke wordpress site anda perlu melakukan konfigurasi upload size di php.ini :


    sudo nano /etc/php5/fpm/php.ini

    Tekan Ctrl+W and cari "upload_max_filesize" dan ubah ke 100m. 

    upload_max_filesize=100M

    Lakukan hal yang sama pada post_max_size. 

    post_max_size=100M


    Restart PHP

    sudo service php5-fpm restart

  11. Install file wordpress

    Navigasi ke directory root :

    mkdir /var/www/
    cd /var/www/

    Download wordpress terbaru :

    wget http://wordpress.org/latest.tar.gz

    Extract :

    tar -xzvf latest.tar.gz

    Beri permission  /var/www/wordpress ke www-data user. Ini akan membantu update otomatis pada wordpress dan file editing dengan SFTP.



  12. Setup wordpress anda melalui webbrowser. Buka url http://ip_private_server_2 pada browser anda untuk melakukan setup wordpress.




  13. Setelah melakukan input dan terhubung dengan database, anda akan bisa langsung melakukan login ke CMS wordpress tanpa membuat user ulang. Karena database sudah terinstall wordpress sebelumnya di sisi wordpress server 1.

Setup Rsync untuk menyamakan folder upload antara wordpress server 1 dan wordpress server 2

Jika anda menjalankan website yang critical langkah terbaik adalah melakukan mirroring files pada server ke 2. Jika sewaktu waktu server utama mengalami masalah network atau hardware. Mirror file memudahkan anda untuk memindahkan dari satu server ke server lain.

  1. Install rsync di kedua server ( wordpress server 1 dan wordpress server 2 )

    apt-get install rsync

  2. Generate SSH key di wordpress server 2

    ssh-keygen

    Tekan Enter untuk skip semua input

  3. Copy the content generated in /root/.ssh/id_rsa.pub

  4. Masukkan SSH Public Key ke wordpress server 1

    Login ke wordpress server 1 dan copy konten sebelumnya ke /root/.ssh/authorized_keys .

    Wordpress server 2 dapat login ke wordpress server 1 melalui SSH

  5. Kembali ke wordpress server 2 dan mulai rsync pertama kalinya. Jalankan command di bawah ini dan sesuaikan dengan path pada lokasi upload wordpress website anda. 

    rsync -avrt --delete --rsh='ssh -p 22' [email protected]_private_server_1:/var/www/html/wp-content/uploads/2017/06 /var/www/html/wp-content/uploads/2017/

    path pada setiap website wordpress mungkin akan berbeda beda sesuai dengan konfigurasi.


  6. Setting Cron 

    edit /etc/crontab

    */3 * * * * root rsync -avrt --delete --rsh='ssh -p 22' [email protected]_private_server_1:/var/www/html/wp-content/uploads/2017/06 /var/www/html/wp-content/uploads/2017/>/dev/null 2>&1

    

Configurasi Kemp Load Balancer

  1.  Install Kemp dengan menyiapkan 2 NIC. IP Public sebagai NIC1 ( nantinya ini adalah IP website yang akan kita develop ) dan IP Private sebagai NIC2 ( tentu dengan subnet yang sama dengan IP wordpress server 1 dan wordpress server 2 )

    Berikut Video untuk konfigurasi dan install kemp di hyper-v



  2. Setelah berhasil pelajari tutorial ini untuk konfigurasi web interface high availability di KEMP




  3. Untuk template-template lainnya bisa berkunjung ke link ini : https://kemptechnologies.com/loAdmaster-documentation/

 

Penulis : Riskianto Agung Prayogi | Juli 2017
Sumber :
https://www.vultr.com/docs/how-to-install-wordpress-on-a-lemp-configuration

https://www.vultr.com/docs/setup-file-mirroring-using-rsync-in-debian-ubuntu

https://kemptechnologies.com/videos/how-setup-virtual-loadmaster-hyper-v/

https://www.digitalocean.com/community/tutorials/how-to-set-up-a-remote-database-to-optimize-site-performance-with-mysql

https://kemptechnologies.com/videos/how-configure-load-balancer/

 

 

Term and Condition

Network Tools

What People Say

Our Partners

open-e

We Accept

        
 
        

 

  

 

Live Help