Nginx Reverse Proxy dan Apache mod_remoteip untuk Menampilkan IP Asli Client
Pengantar
Menggunakan Nginx sebagai reverse proxy di depan Apache adalah konfigurasi yang umum di server VPS, terutama untuk WordPress. Nginx biasanya menangani SSL, trafik besar, dan keamanan dasar, sementara Apache fokus menjalankan PHP dan aplikasi.
Masalah yang sering muncul: Apache tidak mengetahui IP asli pengunjung. Semua request terlihat berasal dari 127.0.0.1 (IP lokal Nginx), sehingga log Apache tidak akurat dan fitur keamanan WordPress bisa salah membaca aktivitas user.
Artikel ini membahas cara menampilkan IP asli client dengan aman menggunakan mod_remoteip di Apache.
Apa Itu Nginx Reverse Proxy?
Nginx reverse proxy adalah arsitektur di mana Nginx menerima request dari client, lalu meneruskannya ke server backend seperti Apache.
Secara sederhana, alurnya seperti ini:
Client → Nginx → Apache → PHP
Keuntungan:
- Nginx lebih cepat menangani static file.
- Apache fokus pada PHP dan aplikasi.
- SSL terminasi lebih mudah dikelola di Nginx.
Kenapa IP Client Asli Bisa Hilang?
Apache hanya mengetahui IP dari koneksi langsung ke server. Karena request datang dari Nginx, REMOTE_ADDR akan menjadi IP Nginx (127.0.0.1) atau IP internal.
Dampaknya:
- Log Apache tidak valid.
- $_SERVER['REMOTE_ADDR'] selalu IP Nginx.
- Rate limit berbasis IP gagal.
- Plugin keamanan WordPress salah membaca aktivitas user.
Header X-Forwarded-For dan X-Real-IP
Untuk mengatasi masalah ini, reverse proxy menggunakan HTTP header tambahan.
Dua header paling penting adalah:
- X-Forwarded-For
Berisi IP client asli, bisa berisi banyak IP jika melewati banyak proxy. - X-Real-IP
Biasanya berisi satu IP client utama.
Pada konfigurasi nginx reverse proxy, header ini dikirim ke backend Apache agar informasi IP tetap ikut terbawa. Tanpa header ini, Apache tidak punya cara mengetahui IP client sebenarnya.
Mengenal Apache mod_remoteip
Apache mod_remoteip adalah modul resmi Apache untuk menangani IP client di balik proxy.
Fungsi utamanya:
- Membaca header X-Forwarded-For
- Mengganti nilai REMOTE_ADDR
- Mengubah IP yang muncul di access log
- Menyediakan IP asli ke PHP dan WordPress
Dengan mod_remoteip, Apache akan mempercayai Nginx sebagai proxy dan menggunakan IP client yang dikirimkan lewat header.
Konfigurasi Nginx Reverse Proxy
Berikut contoh konfigurasi Nginx sebagai reverse proxy ke Apache backend:
Penjelasan singkat:
-
- proxy_pass meneruskan request ke Apache
- X-Forwarded-For membawa IP client
- X-Forwarded-Proto memastikan WordPress mengenali HTTPS
Mengaktifkan mod_remoteip di Apache
-
- Mengaktifkan Modul mod_remoteip
Apache menyediakan modul resmi bernama mod_remoteip untuk menangani kasus reverse proxy.
- Aktifkan modul
Jalankan perintah berikut di server:
a2enmod remoteip -
Setelah itu, restart Apache agar modul aktif:
systemctl reload apache2 - Pastikan Modul Active
Output :apachectl -M | grep remoteip
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message remoteip_module (shared)Catatan : Jika muncul remoteip_module, berarti modul sudah aktif
- Aktifkan modul
- Membuat Konfigurasi mod_remoteip
- Konfigurasi ini diletakkan di file
nano /etc/apache2/conf-available/remoteip.conf - Isi konfigurasi
RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 127.0.0.1Penjelasan:
- RemoteIPHeader → header yang membawa IP client
- RemoteIPTrustedProxy → IP proxy yang dipercaya (Apache)
- Reload Apache
systemctl reload apache2
- Konfigurasi ini diletakkan di file
- Mengaktifkan Modul mod_remoteip
Mengubah Format Log Apache
Agar log Apache menampilkan IP asli, gunakan format %a.
Contoh konfigurasi VirtualHost Apache backend:
Cara Mengecek IP Asli Client
- Cek melalui log Apache
tail -f /var/log/apache2/wordpress-access.logOutput :
203.0.113.25 - - [08/Jan/2026:07:24:41 +0000] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 47 "https://example-site.com/wp-admin/edit.php?post_type=post" "Mozilla/5.0 ..." 198.51.100.42 - - [08/Jan/2026:07:24:48 +0000] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 47 "https://example-site.com/wp-admin/plugins.php" "Mozilla/5.0 ..." 192.0.2.10 - - [08/Jan/2026:07:25:44 +0000] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 98 "https://example-site.com/wp-admin/post.php?post=ID&action=edit" "Mozilla/5.0 ..." 203.0.113.99 - - [08/Jan/2026:07:26:49 +0000] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 47 "https://example-site.com/wp-admin/plugins.php" "Mozilla/5.0 ..."Catatan : Jika konfigurasi benar, IP yang muncul adalah IP publik pengunjung, bukan 127.0.0.1.
Kesimpulan
Menggunakan Nginx sebagai reverse proxy di depan Apache memang memberikan performa dan keamanan yang lebih baik, namun tanpa konfigurasi tambahan IP client asli tidak akan terbaca dengan benar. Dengan meneruskan header IP dari Nginx dan mengaktifkan Apache mod_remoteip, IP asli pengunjung dapat ditampilkan secara akurat di log Apache, PHP, dan WordPress. Konfigurasi ini membuat sistem keamanan, rate limit, dan audit log bekerja normal kembali tanpa perlu pengaturan rumit di Nginx, asalkan proxy yang dipercaya dibatasi dengan benar dan Apache tidak diekspos langsung ke publik.


