Konfigurasi nginx sebagai reverse proxy

Pindah ke direktory /etc/nginx/conf.d dan buat dua file, oprek.conf dan oprek-www.conf

cd /etc/nginx/conf.d/

touch oprek.conf oprek-www.conf

file oprek.conf akan kita gunakan sebagai konfigurasi reverse proxy untuk domain oprek.karedok.net sedangkan file oprek-www.conf untuk redirect request domain dengan www ke domain tanpa www.

edit file oprek.conf

nano oprek.conf

isi dengan konfigurasi berikut:

upstream oprek8080 {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    listen [::]:80;

    server_name oprek.karedok.net;

    location / {
        proxy_pass http://oprek8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Catatan:

  • nama yang digunakan di line 1 harus sama dengan nama yang ditulis di proxy_pass
  • isian di line 2 merupakan ip server Apache beserta port nya. Dalam tulisan ini karena satu server digunakan 127.0.0.1
  • bagian server_name merupakan nama domain yang kita pasang reverse proxy.

selanjutnya konfigurasi redirect akses domain dengan www ke non-www.

nano oprek-www.conf

isikan dengan

server {
    server_name www.oprek.karedok.net;
    return 301 $scheme://oprek.karedok.net$request_uri;
}

cek konfigurasi kita dengan perintah

nginx -t

kalau hasilnya

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

artinya konfigurasi kita sudah benar. Karena kita merubah konfigurasi nginx dan apache, maka kita perlu merestart kedua service tersebut

systemctl restart nginx httpd

Jika tidak ada masalah, seharusnya sekarang kita sudah bisa akses domain oprek.karedok.net yang sudah melalui reverse proxy nginx. Untuk memastikan apakah benar request dari klien di handle oleh nginx, maka kita coba untuk mematikan service nginx.

systemctl stop nginx

coba buka kembali domain oprek.karedok.net .  Seharusnya sekarang halaman websitenya tidak akan muncul. Yang artinya konfigurasi reverse proxy kita sudah benar. Sekarang jalankan kembali service nginx.

systemctl start nginx

Check log Apache dan Update untuk merekam IP sumber request

Sekarang mari kita lihat file log akses milik apache.

tail -f /var/log/httpd/access_log

kita akan melihat catatan seperti berikut:

oprek.karedok.net 127.0.0.1 - - [09/Mar/2018:22:15:36 +0700] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0"

Jika kita perhatikan, IP yang dicatat oleh Apache adalah 127.0.0.1 dimana itu adalah IP dimana service reverse proxy berada. Kita akan perbaiki ini agar Apache merekam IP klien, bukan IP server reverse proxy.

Buka kembali fle /etc/httpd/conf/httpd.conf

nano /etc/httpd/conf/httpd.conf

Seperti yang sudah kita lakukan sebelumnya, cari bagian LogFormat dan kita akan menambahkan parameter %a menggantikan %h. Adapun sebelumnya seperti ini:

LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

kita akan rubah menjadi:

LogFormat "%v %a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Parameter a% akan memerintahkan Apache untuk merekam IP klien dan bukannya IP server reverse proxy. IP klien ini sebelumnya sudah di forward oleh nginx dalam data header request.

Agar Apache bisa menangkap parameter %a dan mencatat dalam log, kita perlu merubah konfigurasi virtualhost oprek.karedok.net kita akan menambahkan dua baris berikut:

RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1/8

Tempatkan dua baris tersebut diluar bagian <Directory> atau selengkapnya konfigurasi kita akan menjadi seperti ini:

<VirtualHost 127.0.0.1:80>
  ServerName oprek.karedok.net
  DocumentRoot /var/www/karedok

  RemoteIPHeader X-Forwarded-For
  RemoteIPInternalProxy 127.0.0.1/8

  <Directory /var/www/karedok>
    Require all granted
  </Directory>
</VirtualHost>

Restart kedua service, buka oprek.karedok.net melalui web browser dan lihat file log

systemctl restart nginx httpd

tail -f /var/log/httpd/access_log

seharusnya sekarang yang dicatat oleh apache di file log adalah seperti ini:

oprek.karedok.net 112.215.238.45 - - [09/Mar/2018:22:18:21 +0700] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0"

Selamat… Sampai disini, setup yang kita lakukan sudah berhasil.

Konfigurasi yang dijabarkan di tulisan ini hanya dasar dari konfigurasi sebuah reverse proxy dengan service apache di belakangnya. Karenanya masih sangat bisa dikembangkan lagi misalnya konfigurasi mengatur cache, atau setup dengan server yang terpisah antara server apache dan nginx, atau satu server nginx dengan banyak server apache di belakangnya. Semua tergantung kebutuhan…

Btw, akhirnya saya punya catatn bagaimana melakukan konfigurasi reverse proxy… Hehehe… Semoga tulisan ini bisa membantu kawan-kawan semua…

Kalau ada yang keliru dari tulisan ini atau ada saran untuk kami, silakan gunakan kolom komentar dibawah untuk kita diskusi…

Teirma kasih sudah membaca sampai selesai, dan selamat mencoba… 😀

Google Docs: https://go.karedok.net/2FKjZjd
SlideShare: https://www.slideshare.net/karedoknet/nginx-sebagai-reverse-proxy-apache-di-centos-7

Mari diskusi

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.