Nginx selain berfungsi sebagai webserver juga menawarkan fitur reverse proxy. Reverse proxy merupakan sebuah server yang berdiri di depan web-server dan bertugas untuk meneruskan request dari client ke web-server yang ada di belakang reverse proxy tersebut. Untuk melakukan konfigurasi reverse proxy pada Nginx mungkin akan sedikit membingungkan dan rawan kesalahan.

Untuk solusi tersebut, kita bisa menggunakan Nginx Proxy Manager (NPM). Nginx Proxy Manager merupakan reverse proxy yang berbasis Nginx-server dan juga Docker-based. Karena merupakan Docker-based, jadi tidak masalah ingin dijalankan di distro linux apa saja. Pada artikel ini, penulis akan menginstal NPM di Debian 11.

Langkah 1 : Instal Docker

Jalankan perintah berikut untuk menginstal docker.

$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Jalankan perintah berikut untuk menambahkan user saat ini ke dalam group docker.

$ sudo usermod -aG docker $USER

Langkah 2 : Instal docker-compose

Jalankan perintah berikut untuk mendownload file binary docker-compose.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Jalankan perintah berikut untuk membuat file binary docker compose menjadi file executable.

$ sudo chmod +x /usr/local/bin/docker-compose

Langkah 3 : Membuat File docker-compose

Buat direkori untuk menyimpan konfigurasi nginx proxy manager, dengan nama nginx-proxy

$ mkdir nginx-proxy && cd nginx-proxy

Buat sebuah file dengan nama docker-compose.yml

$ vim docker-compose.yml

Buat 2 direkori yang masing-masing untuk menyimpan user data and sertifikat SSL.

$ mkdir {data,letsencrypt}

Salin baris kode berikut ke dalam file docker-compose.yml

version: "3"
services:
  npm-app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm-app
    restart: unless-stopped
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      DB_MYSQL_HOST: "npm-db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
      # Uncomment the line below if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - npm-db
    networks:
      - npm-nw
      - npm-internal

  npm-db:
    image: 'mariadb:latest'
    container_name: npm-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql
    networks:
      - npm-internal

networks:
  npm-internal:
  npm-nw:
    external: true

Langkah 4 : Membuat docker-network untuk Nginx Proxy Manager

Jalankan perintah berikut untuk membuat internal network nginx proxy manager.

$ docker network create npm-nw

Langkah 5 : Menjalankan Nginx Proxy Manager

Masih di dalam direktori nginx-proxy jalankan perintah berikut.

$ docker-compose up -d

Setelah selesai ter-build, cek containernya dengan perintah berikut.

$ docker ps

Pada bagian status, cek dan pastikan container nya dalam state Up.

Kemudian kita bisa akses control panel Nginx Proxy Manager via web browser menggunakan Ip address server dan port 81.

http://IP_Address:81

Jika berhasil akan muncul tampilan login seperti gambar berikut.

Silahkan login dengan kredensial default :
Email address: admin@example.com Password: changeme

Selanjutnya akan diminta untuk mengatur nama dan email.

Kemudian akan diminta untuk mengisi password login. Untuk current password diisi dengan password default seperti saat pertama kali login.

Selain itu jika membuka URL http://IP_Address/, akan muncul halaman default yang disediakan oleh nginx proxy manager.

Langkah 6 : Setting Domain dan SSL untuk Control Panel Nginx Proxy Manager

Ketimbang mengakses control panel NPMnya dengan IP address kita bisa menggunakan domain agar lebih mudah untuk mengaksesnya dengan memanfaat fitur proxy host. Dengan catatan domain tersebut dipointing ke IP Address server yang digunakan untuk menginstall nginx proxy manager.

Dari menu Host pilih Proxy Host kemudian klik Add Proxy Host. Pada bagian Domain Names silahkan tambahkan domain yang sesuai dengan FQDN kemudian enter. Isi bagian Forward Hostname dengan IP Address server nginx proxy manager. Tambahkan Forward Port dengan nilai 81, dan enable Block Common Exploits.

Kemudian pindah ke tab SSL. Pada bagian SSL Certificate pilih Request a new SSL Certificate. Aktifkan pilihan Force SSL dan HTTP/2 Support .Isi email dengan email Anda dan centang Term of Service.

Jika sudah selesai, domain yang sudah ditambahkan sudah bisa digunakan untuk mengakses control panel nginx proxy manager dan tentunya sudah memiliki sertifikat SSL.

Studi Kasus : Membuat Reverse Proxy untuk Web Server

Untuk real-casenya, kita akan coba mendemokan bagaimana Nginx Proxy digunakan untuk memforward request dari client/user menuju web server.

Pastikan sudah menyediakan satu subdomain yang dipointing ke VPS nginx proxy manager.

Caranya mirip dengan Langkah 6. Perbedaanya hanya pada IP tujuan web servernya dan juga port yang digunakan, begitu juga untuk retrieve sertifikat sslnya juga sama dengan langkah sebelumnya.

Silahkan save kemudian tunggu hingga proses pembuatan proxy-nya selesai.

Jika sudah selesai silahkan tes akses ke subdomain tersebut, dan cek url-nya apakah sudah memiliki ssl.

Demikian penjelasan singkat mengenai reverse proxy dan juga cara instal nginx proxy manager. Semoga bermanfaat.