Saat mengelola satu server untuk beberapa aplikasi web, sering muncul kebutuhan agar semua layanan dapat diakses dari satu pintu yang sama. Misalnya, Anda memiliki aplikasi blog di port 3000, panel administrasi di port 8080, dan API internal di port 5000. Tanpa alat bantu, setiap layanan harus diakses dengan mengetik alamat IP dan port masing-masing. Ini tidak praktis, menyulitkan pengguna, dan membuka banyak lubang akses yang harus diamankan satu per satu.
Nginx sebagai reverse proxy menjawab masalah tersebut. Reverse proxy bekerja dengan meneruskan permintaan dari luar ke layanan yang berjalan di dalam server. Dengan kata lain, Nginx berdiri di depan layanan-layanan itu, menerima semua permintaan HTTP atau HTTPS, lalu meneruskannya ke proses yang tepat berdasarkan nama domain atau jalur URL. Pendekatan ini membuat konfigurasi lebih rapi, memudahkan pemasangan sertifikat SSL, dan memungkinkan satu alamat publik melayani banyak aplikasi. Artikel ini membahas dasar-dasar Nginx sebagai reverse proxy untuk kebutuhan belajar pada sistem milik sendiri atau lingkungan yang diizinkan. Semua langkah di sini bersifat edukatif dan legal.
Memahami Peran Reverse Proxy
Reverse proxy adalah perantara antara klien di internet dan server aplikasi di belakangnya. Ketika seseorang mengakses alamat seperti https://blog.contoh.id, permintaan tidak langsung ditangani oleh aplikasi blog, melainkan oleh Nginx. Nginx kemudian memeriksa aturan yang sudah ditetapkan, mencari tahu ke mana permintaan harus diteruskan, dan mengirimkannya ke layanan yang sesuai.
Perbedaan mendasar dengan forward proxy adalah arah lalu lintasnya. Forward proxy mewakili klien untuk mengakses banyak server di luar, sedangkan reverse proxy mewakili server untuk melayani banyak klien. Dalam konteks server pribadi, reverse proxy menjadi lapisan tunggal yang mengelola routing, logging, kompresi, hingga pembatasan akses.
Manfaat utama penggunaan reverse proxy pada satu server antara lain menghemat alamat IP publik, memusatkan pengaturan keamanan, dan memungkinkan beberapa aplikasi berjalan di port internal yang tidak terpapar langsung ke internet. Aplikasi di belakang proxy bisa menggunakan port tinggi seperti 3000 atau 8080, sementara Nginx hanya perlu membuka port standar 80 dan 443. Ini mengurangi permukaan serangan dan membuat pengelolaan lebih sederhana.
Persiapan: Nginx dan Layanan di Belakang
Sebelum menulis konfigurasi reverse proxy, pastikan Nginx sudah terpasang di server. Pada distribusi Debian atau Ubuntu, instalasi dapat dilakukan dengan perintah sudo apt install nginx. Setelah terpasang, layanan Nginx dapat dijalankan dengan sudo systemctl start nginx dan diaktifkan agar menyala saat boot menggunakan sudo systemctl enable nginx. Untuk memastikan statusnya, gunakan sudo systemctl status nginx.
Layanan di belakang proxy harus sudah berjalan dan dapat diakses secara lokal. Contoh paling sederhana adalah aplikasi Node.js yang mendengarkan di 127.0.0.1:3000 atau aplikasi Python yang berjalan di 127.0.0.1:8000. Pastikan layanan tersebut tidak diikat ke alamat publik 0.0.0.0, karena Nginx-lah yang akan menjadi satu-satunya pintu masuk dari luar. Dengan mengikat layanan hanya ke 127.0.0.1, akses langsung dari luar ke port aplikasi menjadi tertutup.
Sebagai latihan, Anda dapat membuat dua layanan kecil di port berbeda. Misalnya, satu aplikasi menampilkan teks “Layanan A” di port 3001 dan satu lagi menampilkan “Layanan B” di port 3002. Keduanya cukup berjalan di localhost. Tujuannya adalah membuktikan bahwa Nginx dapat membedakan keduanya berdasarkan nama domain atau path, meskipun keduanya hidup di mesin yang sama.
Konfigurasi Dasar Server Block
Nginx menggunakan server block untuk menentukan bagaimana permintaan ke sebuah domain atau alamat IP ditangani. Pada distribusi berbasis Debian, file konfigurasi server block biasanya diletakkan di direktori /etc/nginx/sites-available/ dan diaktifkan dengan symlink ke /etc/nginx/sites-enabled/. Anda dapat membuat file baru, misalnya /etc/nginx/sites-available/reverse-proxy.
Contoh dasar server block untuk meneruskan permintaan ke layanan lokal adalah sebagai berikut.
server {
listen 80;
server_name blog.contoh.id;
location / {
proxy_pass http://127.0.0.1:3001;
}
}
Baris listen 80 membuat Nginx mendengarkan permintaan HTTP standar. server_name blog.contoh.id menentukan nama domain yang cocok untuk blok ini. Jika permintaan masuk dengan header Host yang sesuai, Nginx akan mengeksekusi aturan di dalam blok tersebut. location / menangkap semua path, lalu proxy_pass meneruskan permintaan ke http://127.0.0.1:3001.
Untuk melayani dua layanan dengan domain berbeda, tambahkan server block kedua. Atau, jika ingin membedakan lewat path, gunakan beberapa blok location.
server {
listen 80;
server_name contoh.id;
location /blog {
proxy_pass http://127.0.0.1:3001;
}
location /panel {
proxy_pass http://127.0.0.1:3002;
}
}
Perlu diingat bahwa cara ini memiliki penyesuaian pada aplikasi, terutama jika aplikasi menghasilkan tautan absolut. Untuk latihan awal, penggunaan domain terpisah lebih mudah dipahami.
Meneruskan Informasi Klien dengan Header
Salah satu efek samping penggunaan reverse proxy adalah layanan di belakang tidak lagi melihat alamat IP asli pengunjung. Karena permintaan melewati Nginx, aplikasi hanya melihat koneksi datang dari 127.0.0.1. Informasi ini penting untuk pencatatan log, analisis pengunjung, atau pembatasan akses berbasis IP. Untuk mengatasi hal ini, Nginx dapat menambahkan header khusus.
Header seperti X-Forwarded-For dipakai meneruskan alamat asli pengunjung. Header ini berisi daftar alamat IP yang dilewati permintaan, dengan alamat klien sebagai nilai paling awal. Selain X-Forwarded-For, header X-Forwarded-Proto juga sering ditambahkan untuk memberi tahu aplikasi apakah permintaan awal menggunakan HTTP atau HTTPS.
Berikut contoh penambahan header di dalam blok location atau server.
location / {
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;
proxy_pass http://127.0.0.1:3001;
}
X-Real-IP berisi alamat IP klien yang terhubung langsung ke Nginx, sedangkan X-Forwarded-For menggunakan variabel $proxy_add_x_forwarded_for untuk menambahkan alamat klien ke daftar yang sudah ada. Hal ini berguna ketika ada beberapa lapisan proxy. Aplikasi di belakang perlu dikonfigurasi untuk mempercayai header ini, karena header dapat dipalsukan jika tidak ada validasi dari proxy.
Validasi dan Reload Tanpa Downtime
Setiap perubahan konfigurasi Nginx berisiko membuat layanan gagal dimuat jika terjadi kesalahan sintaks. Kesalahan kecil seperti kurung kurawal yang tidak tertutup dapat membuat Nginx menolak memulai ulang, sehingga seluruh layanan di belakangnya ikut tidak dapat diakses. Karena itu, langkah pengujian sebelum menerapkan perubahan menjadi sangat penting.
Konfigurasi diuji dengan nginx -t sebelum dimuat ulang agar layanan tidak tumbang. Perintah ini memeriksa seluruh file konfigurasi, termasuk file yang disertakan lewat direktif include, dan melaporkan apakah ada kesalahan sintaks atau masalah izin. Jika semua konfigurasi valid, output akan menampilkan pesan seperti syntax is ok dan test is successful.
Setelah pengujian berhasil, muat ulang konfigurasi tanpa menghentikan layanan menggunakan sudo systemctl reload nginx atau sudo nginx -s reload. Reload tidak memutus koneksi yang sedang berlangsung, sehingga pengguna yang sedang aktif tidak merasakan gangguan. Berbeda dengan restart yang menghentikan dan memulai ulang proses, reload hanya meminta Nginx membaca ulang konfigurasi. Ini jauh lebih aman untuk produksi.
Jika terjadi kegagalan setelah reload, segera periksa log Nginx di /var/log/nginx/error.log. Biasanya kesalahan konfigurasi sudah tertangkap oleh nginx -t, tetapi masalah lain seperti port tujuan tidak aktif atau izin file bisa muncul setelah perubahan diterapkan. Dengan rutin menguji sebelum reload, Anda meminimalkan risiko downtime.
Memahami dasar reverse proxy membuka jalan untuk mempelajari topik lanjutan seperti load balancing, caching, WebSocket, dan keamanan header. Untuk pendalaman lebih jauh tentang pengamanan server dan pengujian penetrasi secara etis pada infrastruktur milik sendiri, Anda dapat menjadikan sumber belajar seperti kalilinux.net atau kalilinux.info sebagai referensi tambahan. Selalu pastikan setiap praktik dilakukan pada sistem yang Anda miliki atau yang secara tertulis telah diizinkan.
