Reverse proxy adalah sebuah layanan yang mengambil permintaan klien, kemudian mengirimkan permintaan ke satu atau lebih proxy server, mengambil respons, dan memberikan respons server kepada klien.

Karena kinerja dan skalabilitasnya, NGINX sering digunakan sebagai proxy terbalik untuk server HTTP dan non-HTTP. Konfigurasi Reverse proxy yang umum dan paling sering di implementasikan adalah menempatkan Nginx di depan aplikasi Node.js, Python atau Java.

Baca juga : Perbandingan web server populer nginx vs Apache

Menggunakan Nginx sebagai reverse proxy, memberi Anda beberapa manfaat tambahan:

  • Load Balancing – Nginx dapat melakukan load balancing untuk mendistribusikan permintaan klien di server terproxy untuk  meningkatkan kinerja, skalabilitas, dan keandalan.
  • Caching – Nginx dapat cache konten yang diterima dari respons server proxy dan menggunakannya untuk menanggapi klien tanpa harus menghubungi server utama untuk konten yang sama setiap kali ada permintaan.
  • Terminasi SSL – Nginx dapat bertindak sebagai titik akhir SSL untuk koneksi dengan klien. Nginx akan menangani dan mendekripsi koneksi SSL yang masuk dan mengenkripsi respons server proxy dengan cepat.
  • Kompresi – Jika server proxy tidak mengirim respons terkompresi, Anda dapat mengonfigurasi Nginx untuk mengkompres respons sebelum mengirimnya ke klien. Tentunya akan menghemat bandwidth dan mempercepat loading website.

Tutorial ini menguraikan langkah-langkah tentang cara mengkonfigurasi Nginx sebagai reverse proxy.

Prasyarat

Kami berasumsi bahwa Anda telah menginstal Nginx di server Ubuntu, CentOS atau Debian Anda.

Menggunakan Nginx sebagai Reverse Proxy

Untuk mengonfigurasi Nginx sebagai reverse proxy ke server HTTP, buka file konfigurasi server block domain dan tentukan lokasi dan server proxy di dalamnya:

server {
    listen 80;
    server_name www.example.com example.com;

    location /app {
       proxy_pass http://127.0.0.1:8080;
    }
}

URL server proxy ditentukan menggunakan direktif proxy_pass dan dapat menggunakan HTTP atau HTTPS sebagai protokol, dan nama domain atau alamat IP, port opsional dan URI sebagai alamat.

Konfigurasi di atas memberi tahu Nginx untuk meneruskan semua permintaan ke lokasi /app ke server proxy di http://127.0.0.1:8080.

File server block Nginx pada distribusi Ubuntu dan Debian disimpan di direktori /etc/nginx/sites-available, sedangkan pada CentOS di direktori /etc/nginx/conf.d.
Untuk menggambarkan lebih baik bagaimana cara directives location dan proxy_pass bekerja, mari kita ambil contoh berikut:

server {
    listen 80;
    server_name www.example.com example.com;

    location /blog {
       proxy_pass http://dedi1.com:8000/wordpress/;
    }
}

Jika pengunjung mengakses http://example.com/blog/my-post, Nginx akan mem-proxy permintaan ini ke server lain dengan alamat http://dedi1.com:8000/wordpress/my-post. Meski begitu, tetap server utama yang menerima dan melayani koneksi. Singkatnya hanya sebagai perantara.

Ketika alamat server proxy berisi URI, /wordpress/, permintaan URI yang diteruskan ke server proxy digantikan oleh URI yang ditentukan dalam directive. Jika alamat server proxy ditentukan tanpa URI, maka permintaan koneksi ke URI diteruskan ke server proxy.

Pengaturan Request Headers Nginx

Ketika Nginx mem-proxy permintaan, ia secara otomatis mendefinisikan dua bidang header dalam permintaan yang diproxy dari klien, Host dan Connection dan menghapus header kosong. Host diatur ke variabel $proxy_host, dan Connection diatur untuk menutup.

Untuk menyesuaikan atau mengatur tajuk untuk koneksi yang diproxy, gunakan direktif proxy_set_header diikuti dengan header value. Anda dapat menemukan daftar semua Request Headers yang tersedia dan nilai yang diizinkan di sini. Jika Anda ingin mencegah agar header tidak diteruskan ke server proxy, setel ke string kosong "".

Dalam contoh berikut, kami mengubah nilai bidang header Host ke $host dan menghapus bidang header Accept-Encoding dengan mengatur nilainya ke string kosong.

location / {
    proxy_set_header Host $host;
    proxy_set_header Accept-Encoding "";
    proxy_pass http://localhost:3000;
}

Konfigurasi Nginx sebagai Reverse Proxy ke server proxy non-HTTP

Untuk mengonfigurasi Nginx sebagai reverse proxy ke server proxy non-HTTP, Anda dapat menggunakan directives berikut

  • fastcgi_pass – reverse proxy ke server FastCGI.
  • uwsgi_pass – reverse proxy ke server uwsgi.
  • scgi_pass – reverse proxy ke server SCGI.
  • memcached_pass – reverse proxy ke server memcached.

Salah satu contoh paling umum adalah dengan menggunakan Nginx sebagai reverse proxy ke PHP-FPM (Menggunakan FastCGI):

server {

    # ... other directives

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }
}

Opsi Umum Reverse Proxy Nginx

Melayani konten melalui HTTPS telah menjadi standar saat ini. Pada bagian ini, kami akan memberi Anda contoh konfigurasi reverse proxy HTTPS Nginx termasuk parameter dan header proxy Nginx yang disarankan.

  location/ {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version  1.1;
    proxy_cache_bypass  $http_upgrade;

    proxy_set_header Upgrade           $http_upgrade;
    proxy_set_header Connection        "upgrade";
    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_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Port  $server_port;
  }
  • proxy_http_version 1.1 – Menentukan versi protokol HTTP untuk proxy, secara default ditetapkan ke 1.0. Untuk Websockets dan koneksi keepalive Anda perlu menggunakan versi 1.1.
  • proxy_cache_bypass $http_upgrade – Menetapkan kondisi di mana respons tidak akan diambil dari cache.
  • Upgrade $http_upgrade and Connection "upgrade" – Field header ini diperlukan jika aplikasi Anda menggunakan Websockets.
  • Host $host – Variabel $host dalam urutan prioritas berikut ini berisi: host name dari baris permintaan, atau host name dari bidang Host request header, atau nama server yang cocok dengan permintaan.
  • X-Real-IP $remote_addr – Meneruskan alamat IP jarak jauh pengunjung asli ke server yang diproxy.
  • X-Forwarded-For $proxy_add_x_forwarded_for – Daftar yang berisi alamat IP dari setiap server yang akan di proxy sebelum di kirim ke klien.
  • X-Forwarded-Proto $scheme – Ketika digunakan di dalam server block HTTPS, akan memblokir setiap respons dari HTTP dan akan merutekan ulang menjadi HTTPS.
  • X-Forwarded-Host $host – Menentukan host asli yang diminta oleh klien.
  • X-Forwarded-Port $server_port – Menentukan port asli yang diminta oleh klien.

Jika Anda tidak memiliki sertifikat SSL / TLS yang ada, Anda dapat menggunakan certbot untuk memperoleh sertifikat SSL gratis Let’s Encrypt di Ubuntu 18.04, CentOS 7, atau server Debian Anda.

Kesimpulan

Anda telah belajar cara menggunakan Nginx sebagai Reverse Proxy. Kami juga telah menunjukkan kepada Anda cara meneruskan parameter tambahan ke server dan untuk memodifikasi dan mengatur bidang tajuk yang berbeda dalam permintaan yang diproksi.