Cara Konfigurasi Nginx Reverse Proxy + SSL Let’s Encrypt di Docker

Nginx adalah salah satu web server yang paling populer dan banyak digunakan di dunia. Selain sebagai web server, Nginx juga dapat digunakan sebagai reverse proxy server. Apa itu reverse proxy? Reverse proxy adalah sebuah server yang berfungsi untuk menerima permintaan (request) dari klien (browser) dan meneruskannya ke server lain, seperti web server atau aplikasi backend.

Sebagai reverse proxy, Nginx menerima permintaan HTTP dari klien dan mengirimkannya ke server backend yang sesuai. Ini memungkinkan kita untuk memiliki beberapa aplikasi berjalan di server yang berbeda, tetapi dapat diakses melalui satu titik masuk tunggal. Klien tidak perlu tahu di mana aplikasi sebenarnya berjalan, karena mereka berinteraksi melalui Nginx.

Nginx reverse proxy + SSL dengan Docker container
Nginx reverse proxy + SSL dengan Docker container

Dalam tutorial ini, kita akan membahas bagaimana cara deploy website HTML, mengkonfigurasi Nginx reverse proxy, serta menerapkan protokol HTTPS dengan sertifikat SSL dari Let’s Encrypt yang kesemuanya berjalan dengan menggunakan Docker container.

1. Install Docker

Langkah awal yang harus dilakukan yaitu install Docker terlebih dulu jika belum tersedia. Berikut ini langkah-langkah install Docker di Ubuntu.

Memasang key untuk repository Docker.

Memasang repository Docker.

Update repository.

Menginstall Docker.

2. Deploy Website

Langkah berikutnya yaitu kita deploy website HTML sederhana yang akan dijalankan dengan menggunakan Docker container.

Membuat direktori untuk project website, misal nginx-domainxyz.

Masuk ke direktori nginx-domainxyz.

Membuat direktori www untuk penyimpanan semua file website.

Membuat file index.html sederhana di dalam direktori www.

Contoh isi file index.html.

Membuat file docker-compose.yml untuk build dan deploy website HTML di atas Docker container.

Masukkan konfigurasi docker-compose.yml.

Penjelasan baris konfigurasi docker-compose.yml untuk nginx-domainxyz.

  • Membuat container dengan nama nginx-domainxyz yang dibuat berdasarkan Docker image nginx-latest.
  • Website dapat diakses melalui IP 127.0.0.1 dan port 8080 pada host yang diarahkan ke port 80 pada container nginx-domainxyz.
  • Container terhubung ke network app-net yang berada di luar konfigurasi Docker Compose, harus dibuat terlebih dulu.
  • Direktori www di-mount ke direktori /usr/share/nginx/html di dalam container.

Membuat network app-net.

Menjalankan konfigurasi docker-compose.yml.

Pesan yang ditampilkan jika proses docker compose sudah selesai.

Memeriksa container yang berjalan saat ini, apakah sudah ada container dengan nama nginx-domainxyz.

Contoh hasilnya.

Menguji apakah website sudah dapat diakses melalui http://127.0.0.1:8080.

Jika berhasil, akan menampilkan source code index.html.

3. Membuat Reverse Proxy

Selanjutnya membuat container untuk Nginx reverse proxy.

Membuat direktori nginx-proxy terlebih dulu, lalu masuk ke direktori tersebut.

Membuat direktori nginx, conf, dan log.

Membuat file konfigurasi Nginx server block default.conf. Jika mengakses (browsing) IP address server, konfigurasi ini yang akan dijalankan, menampilkan halaman default Nginx.

Masukkan konfigurasinya.

Membuat file konfigurasi Nginx server block untuk website misal dengan nama domain domainxyz.com.

Masukkan konfigurasinya.

Pada file konfigurasi di atas yang berhubungan dengan reverse proxy:

  • Website dengan nama domain domainxyz.com dapat diakses melalui port 80 atau HTTP.
  • Permintaan akses ke website terebut, location / akan diteruskan ke http://nginx-domainxyz yang merupakan Nginx container yang menjalankan website HTML yang sebelumnya telah kita deploy.

Membuat file konfigurasi docker-compose.yml untuk container nginx-proxy.

Masukkan konfigurasinya.

Maksud konfigurasi docker-composer.yml di atas:

  • Membuat container nginx-proxy yang berbasis Docker image nginx:latest.
  • Port 80 pada host dapat diakses dari semua IP address, termasuk Public IP dan diarahkan ke port 80 di container.
  • Terhubung ke network app-net.
  • Mount direktori conf dan log.

Menjalankan konfigurasi docker-compose.yml untuk membuat container dan menjalankannya.

Jika proses docker compose selesai dan berhasil ditampilkan pesan:

Menampilkan container yang sedang berjalan untuk melihat apakah sudah ada container nginx-proxy yang berjalan.

Contoh hasilnya.

Menguji mengakses website dari nama domain http://domainxyz.com dengan curl.

Hasilnya harus menampilkan source code index.html, sama seperti pengujian lewat curl sebelumnya.

Menguji mengakses http://IP-Server, hasilnya halaman Welcome to nginx!.

Browse http://IP-Server
Browse http://IP-Server

Menguji mengakses http://domainxyz.com, hasilnya halaman index.html yang berisi pesan Selamat datang di website XYZ.

Browse website dengan nama domain dan port HTTP (80)
Browse website dengan nama domain dan port HTTP (80)

Sampai di sini, kita sudah berhasil melakukan deploy website dan mengkonfigurasikan Nginx reverse proxy dengan menggunakan Docker container.

4. Memasang SSL (HTTPS)

Deploy website dan konfigurasi Nginx reverse proxy sudah berjalan dengan baik, tetapi masih menggunakan protokol HTTP. Pada langkah terakhir ini, kita akan belajar bagaimana cara menerapkan protokol HTTPS atau memasang sertifikat SSL pada Nginx reverse proxy yang sebelumnya telah berjalan di Docker.

Membuat direktori certbot untuk penyimpanan konfigurasi dan sertifikat SSL Let’s Encrypt. Posisi direktori saat ini masih di dalam direktori nginx-proxy.

Membuat file dhparam.pem yang merupakan protokol kriptografi untuk proses pertukaran key antara server dan client pada TLS/SSL.

Membuka kembali file docker-compose.yml.

Mengubah konfigurasi docker-compose.yml seperti berikut ini:

Beberapa tambahan yang berhubungan dengan kebutuhan install SSL:

  • Membuka port 443 (HTTPS).
  • Mount direktori untuk certbot.
  • Membuat container untuk certbot, mount direktori certbot, dan menghubungkannya ke network app-net.

Membuka kembali file Nginx server block domainxyz.com.conf.

Mengubah konfigurasinya dengan menambahkan blok konfigurasi location /.well-known/acme-challenge/ untuk kebutuhan install SSL Let’s Encrypt. Hasilnya menjadi seperti di bawah ini:

Karena sudah mengubah konfigurasi docker-compose, kita perlu menghentikan container dan menjalankan kembali konfigurasinya untuk membuat ulang service nginx-proxy.

Menguji kembali mengakses http://domainxyz.com untuk memastikan website masih bisa diakses setelah mengubah konfigurasi.

Menjalankan simulasi permintaan SSL dengan menambahkan opsi --dry-run pada bagian akhir perintah untuk domainxyz.com yang dilakukan oleh container certbot. Hal ini dilakukan untuk menguji semua konfigurasi yang berhubungan dengan permintaan SSL Let’s Encrypt apakah tidak ada lagi kekurangan atau kesalahan.

Jika simulasi berhasil ditampilkan pesan seperti berikut ini:

Selanjutnya menjalankan ulang perintah certbot di atas tanpa opsi perintah --dry-run.

Jika permintaan SSL Let’s Encrypt berhasil ditampilkan pesan seperti berikut ini:

Menampilkan isi direktori ‘certbot/etc/’ untuk memastikan sertifikat SSL sudah tersedia di direktori tersebut.

Contoh hasilnya.

Membuka kembali file Nginx server block domainxyz.com.conf.

Menambahkan blok konfigurasi untuk port 443 dan redirect port 80 (HTTP) ke https://domainxyz.com. Hasil akhirnya seperti di bawah ini:

Setelah itu, restart container nginx-proxy, karena telah melakukan perubahan pada konfigurasi Nginx perlu untuk reload konfigurasi.

Menguji hasil pemasangan SSL pada Nginx reverse proxy dengan mengakses http://domainxyz.com akan secara otomatis redirect ke https://domainxyz.com.

Browse website dengan nama domain dan port HTTPS (443)
Browse website dengan nama domain dan port HTTPS (443)

Kita telah berhasil deploy website, konfigurasi Nginx reverse proxy, dan memasang sertifikat SSL untuk menerapkan protokol HTTPS.

5. Menambah Website Baru

Jika ingin menambah website atau domain baru langkah yang perlu dilakukan yaitu:

  1. Deploy website seperti pada Langkah 2.
  2. Membuat file konfigurasi Nginx reverse proxy, lalu restart container nginx-proxy.
  3. Melakukan permintaan SSL.
  4. Memperbarui konfigurasi Nginx untuk menambahkan konfigurasi SSL, lalu restart container nginx-proxy.

6. Memperbarui Sertifikat SSL

Sertifikat SSL dari Let’s Encrypt hanya berlaku selama 90 hari. Oleh karena itu perlu dilakukan perpanjangan atau permintaan sertifikat SSL yang baru jika mendekati masa habis berlakunya.

Perintahnya cukup mudah, cukup menjalankan certbot renew dari container certbot.

Penutup

Dengan mengikuti langkah-langkah di atas, kita dapat mengkonfigurasi Nginx reverse proxy dengan sertifikat SSL dari Let’s Encrypt yang kesemuanya dijalankan di atas Docker container. Kunci utamanya ada pada pemahaman tentang konfigurasi docker-compose.yml yang mendefinisikan service dan container yang dibangun. Sementara untuk konfigurasi Nginx reverse proxy dan SSL sama saja seperti konfigurasi tanpa menggunakan Docker.

Semoga tutorial ini bermanfaat bagi teman-teman semua.
Selamat mencoba 🙂

4 Comments

  1. mas saya pas try SSLnya ada error

    Certbot failed to authenticate some domains (authenticator: webroot)

    ini knp ya ?
    mungkin ada pencerahan

    Terima kasih

Leave a Reply

Your email address will not be published. Required fields are marked *