Reverse Proxy dalam Perkembangan IT

Reverse proxy pada jaman ini makin banyak digunakan, dipelajari dan dibahas di banyak forum, terutama forum-forum Sysadmin, Devops, hingga forum-forum yang membahas IT Infrastructure. Karena keunggulannya, metode reverse proxy ini juga banyak digunakan untuk melengkapi topologi aplikasi-aplikasi masa kini yang menggunakan micro services. Biasanya si proxy ini akan berlaku sebagai Load Balancer. Dia akan membagi beban ke masing-masing backend node.

Lantas, apa sih reverse proxy itu?

Reverse proxy ini merupakan sebuah fitur/modul di dalam sebuah webserver, yang berfungsi untuk melakukan port forwarding suatu request, dari public request menuju ke dalam sistem. Sebagai proxy, tentu juga memiliki kemampuan content caching, yaitu penyimpanan data sementara, agar saat terjadi request ulang, tidak perlu mengambil dari database. Dengan kemampuan-kemampuan tersebut, sebuah webserver akan mampu mengerjakan pekerjaan-pekerjaan dari sebagai sekedar proxy, hingga sebagai upstream proxy yang kadang banyak difungsikan sebagai pengganti NAT. Dengan kemampuannya pula, reverse proxy akan mampu dimanfaatkan untuk menghemat IP Address. Lho kok bisa?

Sedikit tentang IP Address

Jika kita akan membahas tentang penghematan IP, tentu kita perlu membahas tentang IP Address. IP address yang kita kenal selama ini ada dua versi :

  • IP versi 4
  • IP versi 6

IP versi 4 ini masih dominan digunakan. Masih banyak website-website penting yang belum menyediakan akses via IP versi 6. Saat ini kondisinya persediaan IP versi 4 ini sudah akan habis, atau malah sudah habis, sedangkan IP versi 6 saat ini belum cukup populer untuk digunakan. Sebagian besar server dunia masih banyak yang belum memiliki IP versi 6 untuk solusi networkingnya. Masih mengandalkan IP versi 4.

Begitu pula dengan kampus di Indonesia. Website dan sistem-sistem informasi kampus, masih dominan penggunaan IP Versi 4. Sangat jarang yang sudah menyediakan IP versi 6. Biasanya kampus membeli sewa IP Address dari sebuah provider , atau melalui IDNIC. Pembelian via provider biasanya akan diberikan alokasi subnet kecil, dengan pemilik AS Number tetap dari provider. Pembelian langsung ke IDNIC biasanya akan langsung mendapatkan satu (atau lebih) blok IP atas nama kampus tersebut, dengan AS Number milik kampus.

Pada IP versi 4 secara alokasi cakupan, dikenal dua jenis IP :

  • Private IP : IP ini bisa dibuat sendiri oleh network administrator gedung atau kantor, menurut kaidah yang berlaku, dan penggunaan angka yang diijinkan. ( 192.168.x.x, 172.16.x.x, 10.x.x.x)
  • Public IP  : IP ini harus sewa, beli, atau diberikan alokasi oleh Internet Provider. Biasanya kita bisa beli per-satuan, subnet, atau blok AS Number.

Jika sebuah kampus, memiliki alokasi IP Publik dengan subnet /29, maka si kampus tersebut hanya akan dapat menggunakan 5 buah IP publik. Jika kebutuhan server di dalam kampus tersebut banyak membutuhkan IP Publik, maka kampus tersebut harus membeli alokasi IP address lagi.

Kadang ada network administrator kampus yang melakukan penghematan IP dengan menggunakan mekanisme DNAT. Satu IP, akan digunakan beramai-ramai banyak server di dalam network, untuk melayani keperluan via public connection. Solusi ini tidak efektif, satu port hanya dapat digunakan satu kali. Sehingga jika di belakang router terdapat lebih dari satu server web, maka salah satu harus mengalah untuk tidak menggunakan default port 80. Nah, di sinilah kita bisa memanfaatkan fungsi reverse proxy.

Webserver dan Reverse Proxy

Hampir semua webserver yang memiliki fitur : mod proxy akan memiliki kemampuan melakukan Reverse Proxy. Program aplikasi tersebut antara lain :

  • Apache / HTTPD
  • Nginx ( n-gin-x, baca en-jin-x /engine-x )
  • Haproxy
  • dan lain-lain

Dalam artikel ini akan dibahas penggunaan Nginx Reverse Proxy. Mengapa Nginx?

  • Nginx adalah webserver yang sangat ringan
  • Nginx digadang menggantikan Apache sebagai webserver, dan sudah cukup banyak pengubahan Apache ke Nginx
  • Nginx memang disiapkan sebagai worker webserver, yang siap untuk high concurrency (beban akses berbarengan)
  • Nginx memiliki kemampuan melakukan load balancing dengan banyak method (first, round robin, dll), seperti yang ada pada Haproxy, meski dia tetaplah webserver.
  • Nginx memiliki kemampuan upstream proxy. Dengan fitur ini, nginx dapat menggantikan fungsi DNAT (Destination Network Address Translation), untuk semua port, tidak hanya HTTP saja.
  • Untuk HTTP Proxy, Nginx memiliki kemampuan memproxy banyak server di belakangnya, sehingga dengan fungsi demikian, Nginx akan mampu melakukan penghematan IP Publik. Satu IP digunakan banyak server, dengan tetap menggunakan port yang sama : 80.
  • Testimoni tentang Nginx telah terbukti dengan hampir menggesernya popularitas Nginx terhadap Apache sebagai webserver.

 

Nginx sebagai Webserver dan Reverse Proxy

nginx

Semua webserver akan selalu memiliki fitur : VirtualHost. VirtualHost akan memetakan nama panggil (server name), ke dalam document root dalam sebuah server. Dengan menggunakan VirtualHost, sebuah server dengan satu IP dapat melayani banyak nama panggil, contoh:

  • setiap kali server menerima request pemanggilan abcde.ecampuz.net, akan diarahkan di direktori /var/www/abcde.ecampuz.net/
  • sedangkan setiap kali server menerima request pemanggilan defghi.ecampuz.net, akan diambilkan data dari direktori /var/www/defghi.ecampuz.net

Dalam case di atas abcde.ecampuz.net adalah nama panggil, sedangkan /var/www/abcde.ecampuz.net adalah document root.

Virtual Host Diagram Block
Diagram Blok Virtual Host dalam Webserver

Gambar diatas, adalah diagram blok sebuah skema Virtual Host. Dengan Solusi Virtual Host, akan memungkinkan sebuah server digunakan beramai-ramai oleh banyak aplikasi yang berjalan dalam satu webserver.

Karena sebuah kebutuhan, banyak aplikasi pendukung operasional akademik seperti : mail server, PDDIKTI Feeder under Linux, direkomendasikan menggunakan sebuah dedicated OS, yaitu sebuah aplikasi yang menuntut hanya ada dia sendiri dalam satu Operating System Linux. Dengan demikian mau atau tidak mau, para teknisi dan sysadmin akademik harus memisahkan dengan server lain, salah satu konsekuensinya harus memiliki IP sendiri.

Namun dengan bantuan Reverse Proxy dari sebuah webserver, sebuah IP dapat digunakan bersama-sama untuk lintas server meskipun berjalan pada port yang sama (80 dan 443). Berikut diagram blok untuk beberapa fungsi Nginx sebagai webserver dan juga reverse proxy

Diagram blok Nginx Reverse Proxy
Diagram Blok Nginx Reverse Proxy

Pada diagram di atas, digambarkan beberapa fungsi Nginx Reverse Proxy. Dengan satu webserver saja Nginx dapat melakukan pelayanan:

  • Virtual Host
  • Proxy HTTP ke lintas server
  • Stream Proxy untuk port-port selain HTTP, seperti mail server, ataupun port lainnya.

 

Instalasi Nginx pada Linux

Instalasi Nginx pada CentOS cukup mudah. Yaitu dengan menggunakan package manager :

yum -y install epel-release

yum -y install nginx

systemctl enable nginx

systemctl start nginx

firewall-cmd --permanent --zone=public --add-service=http

firewall-cmd --permanent --zone=public --add-service=https

firewall-cmd --reload

 

Sedangkan instalasi Nginx pada Ubuntu juga cukup mudah, tetap menggunakan package manager :

sudo apt update

sudo apt install nginx

sudo ufw allow "Nginx Full"

 

Operasional Start, Stop dan Restart

Untuk operasional menjalankan, menghentikan dan merestart Nginx, adalah sebagai berikut

systemctl start nginx #untuk menjalankan

systemctl stop nginx #untuk menghentikan

systemctl restart nginx #untuk menghentikan dan menjalankan kembali

systemctl enable nginx #untuk menjadikan nginx sebagai startup

systemctl disable nginx #untuk menghapus nginx dari list startup

 

Baik pada Linux Ubuntu maupun CentOS, memiliki perintah yang sama untuk operasional ini. Hanya saja, pasca instalasi, CentOS tidak langsung menyala dan juga tidak langsung menjadi startup. Jadi harus dinyalakan secara manual. Untuk Ubuntu, setelah proses instalasi, Nginx langsung menyala dan menjadi startup.

 

Konfigurasi Nginx sebagai Reverse Proxy

Letak file konfigurasi utama Nginx pada server Centos biasanya terletak pada : /etc/nginx/nginx.conf. Sedangkan file-file inisialisasi virtualhost akan diletakkan pada /etc/nginx/conf.d/{namaserver}. Strukturn pada CentOS akan seperti berikut:

/etc/nginx/
           ├── conf.d/
                      ├── server1.ecampuz.net.conf
                      ├── server2.ecampuz.net.conf
                      ├── server3.ecampuz.net.conf
                      ├── server4.ecampuz.net.conf
                      ├── server5.ecampuz.net.conf
                      └── default
           ├── default.d/
           ├── fastcgi.conf
           ├── fastcgi_params
           ├── koi-utf
           ├── koi-win
           ├── mime.types
           ├── nginx.conf
           ├── scgi_params
           ├── uwsgi_params
           └── win-utf

 

Sedang pada Linux berdistro Ubuntu biasanya akan seperti berikut:

/etc/nginx/
           ├── conf.d/
           ├── mods-available/
           ├── mods-enabled/
           ├── sites-available/
           ├── sites-enabled/
                      ├── server1.ecampuz.net.conf
                      ├── server2.ecampuz.net.conf
                      ├── server3.ecampuz.net.conf
                      ├── server4.ecampuz.net.conf
                      ├── server5.ecampuz.net.conf
                      └── default
           ├── fastcgi.conf
           ├── fastcgi_params
           ├── koi-utf
           ├── koi-win
           ├── mime.types
           ├── nginx.conf
           ├── scgi_params
           ├── uwsgi_params
           └── win-utf

Konfigurasi Nginx sebagai webserver biasanya adalah seperti berikut :

server {
   listen 80;
   server_name abcde.ecampuz.net www.abcde.ecampuz.net;
   access_log /var/log/nginx/abcde.ecampuz.net_access_log;

   location / {
      root /var/www/abcde.ecampuz.net;
      index index.php index.html index.htm;
   }

}

Pada konfigurasi di atas, artinya adalah : “semua request terhadap nama panggil abcde.ecampuz.net, akan diambilkan source pada data /var/www/abcde.ecampuz.net.

Hampir sama dengan konfigurasi sebagai webserver, konfig utama sebagai reverse proxy kira-kira akan berbunyi seperti berikut :

server {
   listen 80;
   server_name server1.ecampuz.net www.server1.ecampuz.net;
   access_log /var/log/nginx/server1.ecampuz.net_access_log;

   location / {

      proxy_pass http://192.168.100.45:80; 
      proxy_redirect off;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host server1.ecampuz.net;

   }

}

Konfigurasi di atas artinya, semua panggilan atas nama server1.ecampuz.net, akan diforwardkan ke http://192.168.100.45:80. Dalam kasus ini, host 192.168.100.45 berlaku sebagai backend server, atau backend node.

Saat user melakukan pemanggilan domain, proxy akan menampung, kemudian memanggilkan sumber aslinya yaitu server backend. Si server backend sendiri kadang memiliki virtualhost yang cukup banyak, sehingga tidak cukup untuk dipanggil dengan http://192.168.100.45. Untuk itu pemanggilan domain perlu dilempar juga, command yang berfungsi untuk melanjutkan pemanggilan nama domain tersebut adalah :

proxy_set_header Host server1.ecampuz.net;

Bisa juga diisi dengan

proxy_set_header Host $host;

 

Bagian proxy_set_header X-Forwarded-For, juga sangat penting untuk dipasang pada konfigurasi server. Saat seorang user melakukan akses ke server dan diterima server Nginx Reverse Proxy, maka header REMOTE_ADDR (IP Address pengakses), akan tercatat pada log Nginx. Namun saat Nginx memforward ke server backend, status log REMOTE_ADDR pada server backend akan menyatakan berasal dari Nginx. Sehingga pada aplikasi tidak dapat menangkap IP Client, melainkan IP proxy.

Kondisi ini akan sangat tidak baik, untuk aplikasi yang membutuhkan filtering IP Address, misalnya server Host-to-Host dengan Bank, atau server-server webservice yang wajib mengenali IP Client.

Keberadaan baris proxy_set_header X-Forwarded-For, akan sangat penting, untuk melemparkan parameter REMOTE_ADDR sebagai HTTP_X_FORWARDED_FOR ke server backend. Di server backend akan kembali diolah menjadi REMOTE_ADDR.

Contoh konfigurasi di atas ini dapat dilakukan untuk ke lain server. Dengan demikian, satu server Nginx Reverse Proxy, dapat membantu meminimalisir penggunaan IP Address, khususnya IP-IP yang dialokasikan untuk server.

Skema alur akses reverse proxy

Eh ya, tidak terasa pembahasan tentang Reverse Proxy ini cukup panjang ya.. Sementara masih ada dua sub bahasan lagi tentang Reverse Proxy, yaitu tentang Load Balancing dan Upstream Proxy. Kelanjutannya akan dipisah menjadi beda artikel lagi ya..

 

Q: Lho pak dhe, bisa nggak kalau Reverse Proxy pakai Nginx, backendnya pakai Apache?

A: Lho bisa lah.. Biasanya juga begitu

Q: Kalau depannya Nginx, backendnya Nginx

A: Tetep bisa.. Bisa juga lho reverse proxy server ada di provider cloud A, sedangkan backendnya ada di provider B..

Q: Bisa nggak kalau saya mbuka sebuah port backend pakai NodeJS, portnya bukan 80, tapi sama Nginx dibuka sebagai HTTP biasa pada port 80?

A: Bisa dong, nanti confignya kita tuliskan di bawah..

Q: Kalau saya punya SMTP server di backend, apakah port 587 (SMTP TLS) bisa dibuka di depan?

A: Bisa, tapi tidak menggunakan config Reverse Proxy. Menggunakan Upstream Proxy. Catatannya di lain artikel ya..

Q: Janji?

A: Insya Allah, sudah siap didraft 😁

Q: Untuk https pripun?

A: Tidak ada masalah, cuma memang nanti perlu menambahkan Sertifikat SSL. Instalasi SSL yang free ada lho di sini.

 

Contoh konfigurasi Reverse Proxy untuk pengambilan non-default port

server {
   listen 80;
   server_name node1.ecampuz.net www.node1.ecampuz.net;
   access_log /var/log/nginx/node1.ecampuz.net_access_log;

   location / {

      proxy_pass http://192.168.100.244:5775; 
      proxy_redirect off;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host node1.ecampuz.net;

   }

}