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….

Reverse Proxy Apache

Hi…

Kali ini kita akan coba reverse proxy pada apache2. Lab kali ini didasari dari tugas kantor (hahaha… lagi-lagi karena dapet tugas kantor).

Jadi dikantor sudah ada banyak web server, dengan IP berbeda-beda. Dan beberapa akan mempunyai subdomain yang dapat diakses dari internal kantor maupun dari public.

Topologinya kurang lebih seperti ini, masih menggunakan IP private. Nanti silahkan coba sendiri apabila ingin pasang IP PublicDNS server jadi satu dengan Router dimana menggunakan Mikrotik, dan sudah pernah dibahas disini.

Instalasi dan Seting Front Web Server

Update dan upgrade repository

root@ubuntu:/home/ubuntu#apt update && apt upgrade –y

Install apache2 dan build essential

root@ubuntu:/home/ubuntu#apt install build-essential apache2

Enable mod proxy untuk apache2

root@ubuntu:/home/ubuntu#a2enmod proxy proxy_http proxy_html

Set reverse proxy sub domain a.test.konfigurasi

Copy default.conf ke a.conf

root@ubuntu:/home/ubuntu#cd /etc/apache2/sites-available/
root@ubuntu:/etc/apache2/sites-available#cp 000-default.conf cacti.conf

Edit a.conf, sesuaikan dengan nama subdomain dan ip webserver

root@ubuntu:/etc/apache2/sites-available# nano a.conf
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port t$
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
ServerName a.test.konfigurasi

ServerAdmin webmaster@localhost
#DocumentRoot /var/www/html

# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

ProxyPreserveHost On
# Servers to proxy the connection, or
# List of application servers Usage
ProxyPass / http://192.168.192.2:80/
ProxyPassReverse / http://192.168.192.2:80/

# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Ulangi langkah copy dan edit a.conf untuk b.conf dan c.conf, tentunya disesuaikan dengan nama subdomain dan IP masing-masing.

Selanjutnya, enable a.conf, b.conf dan c.conf

root@ubuntu:/etc/apache2/sites-available# a2ensite a.conf
Enabling site a.
To activate the new configuration, you need to run:
service apache2 reload


root@ubuntu:/etc/apache2/sites-available# a2ensite b.conf
Enabling site b.
To activate the new configuration, you need to run:
service apache2 reload


root@ubuntu:/etc/apache2/sites-available# a2ensite c.conf
Enabling site c.
To activate the new configuration, you need to run:
service apache2 reload

Selanjutnya restart service apache

root@ubuntu:/etc/apache2/sites-available# service apache2 reload

Menambahkan subdomain pada Router/DNS Server

Setelah front dan backend web sudah siap, sekarang akan menambahkan atau pointing IP front web server ke masing-masing sub domain di Router MikroTik

 Test ping dulu

C:\Users\konfigurasi.net>ping a.test.konfigurasi

Pinging a.test.konfigurasi [172.30.0.58] with 32 bytes of data:
Reply from 172.30.0.58: bytes=32 time=13ms TTL=64
Reply from 172.30.0.58: bytes=32 time=2ms TTL=64
Reply from 172.30.0.58: bytes=32 time=1ms TTL=64
Reply from 172.30.0.58: bytes=32 time=4ms TTL=64

Ping statistics for 172.30.0.58:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 1ms, Maximum = 13ms, Average = 5ms

C:\Users\konfigurasi.net>ping b.test.konfigurasi

Pinging b.test.konfigurasi [172.30.0.58] with 32 bytes of data:
Reply from 172.30.0.58: bytes=32 time=1ms TTL=64
Reply from 172.30.0.58: bytes=32 time=2ms TTL=64
Reply from 172.30.0.58: bytes=32 time=2ms TTL=64
Reply from 172.30.0.58: bytes=32 time=6ms TTL=64

Ping statistics for 172.30.0.58:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 1ms, Maximum = 6ms, Average = 2ms

C:\Users\konfigurasi.net>ping c.test.konfigurasi

Pinging c.test.konfigurasi [172.30.0.58] with 32 bytes of data:
Reply from 172.30.0.58: bytes=32 time=2ms TTL=64
Reply from 172.30.0.58: bytes=32 time=2ms TTL=64
Reply from 172.30.0.58: bytes=32 time=4ms TTL=64
Reply from 172.30.0.58: bytes=32 time=2ms TTL=64

Ping statistics for 172.30.0.58:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 2ms, Maximum = 4ms, Average = 2ms

Sekarang coba buka di web browser