Cluster WEB menggunakan Nginx

Hi…

Kali ini kita akan mecoba membuat cluster web sederhana menggunakan nginx sebagai loadbalancing nya, dan juga sync nya agar server web pertama dan web kedua sama isinya. Topologinya kurang lebih seperti berikut

Dalam lab ini membutuhkan 3 buah server (menggunakan Centos 7), yaitu 1 server sebagai gateway (yg diakses oleh user) dan 2 buah server untuk backend web server.

Detail IP nya sebagai berikut : 192.168.192.34 sebagai gateway server, 192.168.192.37 sebagai web1, dan 192.168.192.38 sebagai web2.

Untuk mempermudah, tambahkan di /etc/hosts pada semua server

vi /etc/hosts


192.168.192.34 gateway
192.168.192.37 web1
192.168.192.38 web2

Seperti biasa, update dan install epel-release pada semua server Centos

yum update -y
yum install epel-release -y

Setelah itu, install nginx disemua server, kemudian enable dan start service nginx

yum install nginx -y
systemctl enable nginx
systemctl start nginx

Edit index.html masing2 server, untuk pengecekan apakah service nginx sudah bekerja dengan baik.

vi /usr/share/nginx/html/index.html

Pada lab ini, index.html saya tambahkan nama masing2 server, sehingga menjadi seperti berikut tampilan webnya

gateway
web1
web2

Sekarang edit nginx.conf pada gateway server, ubah dan tambahkan konfigurasi sehingga menjadi seperti berikut :

[root@gateway centos]# vi /etc/nginx/nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

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

upstream 192.168.192.34 {
least_conn;
server 192.168.192.37:80;
server 192.168.192.38:80;
}

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name 192.168.192.34;
#root /usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
proxy_pass http://192.168.192.34;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
index index.html index.htm;
}


error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }

}

Kemudian restart service nginx

systemctl restart nginx

Sekarang coba di web browser, akan mengarah ke web1 dan web2, setiap di refresh akan ganti-gantian

Sampai disini kita sudah bisa membuat loadbalancing di cluster. Dan untuk membuat sama isi dari web1 dan web2, menggunakan metode rsync untuk sinkronisasinya dan crontab untuk menjadwalkan waktu sikronisasinya.

Di lab kali ini, master data web akan saya letakkan di gateway, dimana doc root dari web tidak akan diakses oleh user web langsung.

Untuk mempermudah rsync, pastikan gateway server bisa akses web1 dan web2 tanpa menggunakan password. Untuk amannya, kita akan menggunakan ssh key. Jadi generate dulu ssh key di gateway server, menggunakan perintah :

ssh-keygen -t rsa

Sehingga akan digenerate public key (id_rsa.pub) dan private ke (id_rsa). Lokasi filenya ada di ~/.ssh/

Copykan isi id_rsa.pub ke authorized_keys pada web1 dan web2. Setelah itu restart service ssh pada semua service untuk memastikan service ssh berjalan dengan baik.

Sekarang apakah sudah bisa ssh akses web1 dan web2 dari gateway.

ssh root@web1
ssh root@web2

Sekarang coba rsync dari gateway ke web1 dan web2

[root@gateway centos]# rsync -avzhe ssh /usr/share/nginx/html/ root@web1:/usr/share/nginx/html/
sending incremental file list
./
index.html
sent 499 bytes received 74 bytes 1.15K bytes/sec
total size is 14.25K speedup is 24.87
[root@gateway centos]# rsync -avzhe ssh /usr/share/nginx/html/ root@web2:/usr/share/nginx/html/
sending incremental file list
./
index.html
sent 499 bytes received 74 bytes 1.15K bytes/sec
total size is 14.25K speedup is 24.87

Tampilan web apabila di refresh berulang kali, akan selalu sama

Sekarang buat crontab untuk rsync otomatis sesuai yg kita set. Di lab ini saya buat tiap 5 menit akan sinkronisasi, tentunya tergantung besaran data juga ya.

[root@test-1 centos]# crontab -e
*/5 * * * * rsync -avzhe ssh /usr/share/nginx/html/ root@web1:/usr/share/nginx/html/
*/5 * * * * rsync -avzhe ssh /usr/share/nginx/html/ root@web2:/usr/share/nginx/html/

Untuk memastikan crontab jalan, isi web saya ubah. Tampilannya menjadi berikut

Selamat mencoba….