Sebelum memulai praktik, pastikan Anda telah memahami konsep dasar pada materi kelas Server & DevOps di infokoding.

BAB 3

Panduan Instalasi Web Server Nginx untuk Belajar DevOps

Cara memasang pelayan restoran tercepat di dunia digital: Nginx, untuk melayani jutaan permintaan HTTP dari browser pengguna.

Nginx (dibaca "engine-x") adalah web server berperforma tinggi, reverse proxy, dan load balancer yang dirancang untuk menangani ribuan koneksi konkuren secara efisien. Cara instalasi web server Nginx di Ubuntu sangatlah mudah, cukup gunakan perintah sudo apt update && sudo apt install nginx pada terminal, lalu izinkan akses firewall untuk port 80/443, dan server Anda sudah siap melayani permintaan HTTP dari seluruh dunia.

TL;DR (Ringkasan Eksekutif)

  • Nginx adalah web server dan reverse proxy andalan ekosistem Belajar DevOps untuk menangani ribuan koneksi konkuren.
  • Instalasi sangat instan: sudo apt install nginx, lalu amankan dengan UFW sudo ufw allow "Nginx Full".
  • Optimasi krusial Belajar DevOps: Selalu aktifkan Gzip compression dan Caching Headers untuk skor PageSpeed maksimal.
  • Fungsi utama tingkat lanjut: Nginx bertindak sebagai tameng (Reverse Proxy) di depan aplikasi lokal Anda (misal Node.js).

Apa itu Nginx?

Nginx adalah perangkat lunak open-source yang paling sering difungsikan sebagai:

  • Web Server: Melayani dokumen web (HTML/CSS/Gambar) kepada pengunjung.
  • Reverse Proxy: Tameng pelindung yang merutekan trafik jaringan ke aplikasi internal.
  • Load Balancer: Membagi beban trafik secara adil ke banyak mesin server.
  • HTTP Cache: Menyimpan memori respons agar situs memuat lebih instan.

Web Server adalah instrumen Server dan DevOps fundamental yang bertugas menerima *Request* (permintaan) dari peramban (browser) dan membalasnya dengan *Response* (seperti HTML/JSON/Image).

Mengapa Nginx? (Apache vs Nginx Benchmark)

Dalam paradigma Server dan DevOps modern, Nginx (dibaca: Engine-X) dibangun dengan arsitektur event-driven asinkron yang sangat tangguh dalam menangani puluhan ribu koneksi konkuren (high concurrency). Sebagai bukti empiris (*benchmark*):

Metrik Server dan DevOps Apache HTTPD Nginx
Arsitektur Dasar Process/Thread-based (1 koneksi = 1 thread) Event-driven Asinkron (Ribuan koneksi = 1 thread)
Performa 10.000 Koneksi Rendah (Drop tajam dan berpotensi Crash) Tinggi (>30.000 Requests Per Second)
Konsumsi RAM Spesifik Membengkak seiring traffik (Gigabytes) Sangat Stabil (~2-3 MB per proses worker)

1. Proses Instalasi Nginx (Diuji pada Ubuntu 22.04 LTS)

  • Perintah Dasar: sudo apt install nginx -y
  • Sistem Operasi: Ubuntu 22.04 LTS (Jammy Jellyfish)
  • Waktu Pengerjaan: ~2 Menit

Panduan ini didemonstrasikan menggunakan spesifikasi OS server standar industri saat ini, yaitu Ubuntu 22.04 LTS (Jammy Jellyfish).

# Perbarui daftar paket dan instal Nginx
sudo apt update
sudo apt install nginx -y

# Verifikasi status layanan Nginx
sudo systemctl status nginx
# (Pastikan output menampilkan "active (running)")

# Aktifkan Nginx agar otomatis menyala saat server reboot
sudo systemctl enable nginx
Screenshot terminal Linux saat menjalankan perintah sudo apt install nginx untuk menginstal web server Nginx
Proses instalasi paket Nginx berjalan sukses di sistem operasi Ubuntu Server.

2. Konfigurasi Firewall (UFW)

  • Tujuan: Mengizinkan trafik eksternal masuk ke web server.
  • Port Terbuka: 80 (HTTP) dan 443 (HTTPS)
  • Profil UFW: "Nginx Full"

Secara default, Nginx membutuhkan akses ke port 80 (HTTP) dan 443 (HTTPS). Kita harus mengizinkan lalu lintas ini di dalam Uncomplicated Firewall (UFW):

# Menampilkan profil aplikasi yang tersedia di UFW
sudo ufw app list

# Mengizinkan akses HTTP dan HTTPS secara bersamaan (Nginx Full)
sudo ufw allow "Nginx Full"

# Cek status Firewall
sudo ufw status
Screenshot terminal Linux menunjukkan output Rule added setelah menjalankan sudo ufw allow Nginx Full
Konfigurasi UFW berhasil ditambahkan untuk mengizinkan trafik HTTP (80) dan HTTPS (443).

3. Menguji Instalasi Nginx (Curl dan Browser)

  • Pengujian Lokal: Memanggil CLI curl -I localhost.
  • Pengujian Publik: Membuka IP Publik Server di peramban web.
  • Indikator Sukses: Munculnya halaman pendaratan "Welcome to nginx!".

Setelah Nginx dan firewall siap, lakukan pengujian untuk memastikan web server merespons permintaan dengan benar:

# Uji secara lokal melalui terminal (CLI)
curl -I http://localhost
# Output yang sukses akan menampilkan: "HTTP/1.1 200 OK"

Anda juga dapat membuka browser dan mengetikkan alamat IP Publik server Anda (contoh: http://198.51.100.10). Jika berhasil, halaman selamat datang "Welcome to nginx!" akan muncul.

4. Anatomi Server Block dan Reverse Proxy

  • Lokasi File Aktif: /etc/nginx/sites-available/
  • Fungsi Utama: Memetakan nama domain ke aplikasi jaringan internal.
  • Sintaks Penting: Memanfaatkan blok lokasi proxy_pass.

sites-available vs sites-enabled

sites-available: Folder repositori tempat Anda menyimpan seluruh file konfigurasi virtual host, terlepas dari apakah situs tersebut sedang aktif atau mati.
sites-enabled: Folder operasional yang dibaca langsung oleh Nginx saat berjalan. Untuk mengaktifkan sebuah situs, Anda membuat Symlink (pintasan) dari sites-available ke sites-enabled menggunakan perintah ln -s.

Diagram arsitektur sistem Nginx Reverse Proxy yang merutekan lalu lintas internet publik secara aman ke aplikasi internal server (Node.js/Python)

Nginx mengatur routing banyak website dalam satu server menggunakan Server Block (mirip Virtual Host di Apache). Berikut adalah fondasi kode siap pakai (ready-to-use snippet) untuk konfigurasi Reverse Proxy yang meneruskan trafik web publik ke aplikasi internal (seperti Node.js di port 3000):

# Lokasi file: /etc/nginx/sites-available/aplikasiku.com
server {
    listen 80;
    server_name aplikasiku.com www.aplikasiku.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Konfigurasi di atas menjadikan Nginx sebagai pos satpam yang canggih (Reverse Proxy). Nginx memblokir eksposur langsung terhadap aplikasi lokal Anda sembari menyajikan respon yang sangat gegas kepada miliaran peramban pengunjung di internet.

5. Mengamankan Nginx dengan SSL Gratis (Let's Encrypt)

  • Penyedia Enkripsi: Let's Encrypt (Sertifikat 100% Gratis)
  • Aplikasi Eksekutor: Certbot (python3-certbot-nginx)
  • Tujuan Keamanan: Menghidupkan gembok hijau HTTPS (Port 443).

Untuk menghindari cap peringatan merah "Not Secure" dari Chrome atau peramban modern lainnya, Anda diwajibkan memasang sertifikat SSL/TLS. Berkat Certbot dan penerbit sertifikat Let's Encrypt, sebuah secure Nginx setup kini 100% gratis dan terotomatisasi:

# 1. Instal utilitas Certbot beserta plugin khusus Nginx
sudo apt install certbot python3-certbot-nginx -y

# 2. Jalankan asisten otomatis (sertifikat akan dipasang dan Nginx direstart)
sudo certbot --nginx -d aplikasiku.com -d www.aplikasiku.com

Tips Pro: Optimasi Protokol HTTP/2
Setelah SSL terpasang, buka file konfigurasi Server Block Anda dan tambahkan parameter http2 di sebelah arahan port 443 (contoh: listen 443 ssl http2;). Protokol HTTP/2 memungkinkan pengiriman banyak aset statis sekaligus (multiplexing) dalam satu saluran koneksi TCP, yang sanggup melesatkan kecepatan loading halaman secara signifikan!

Cukup dengan baris perintah di atas, Nginx secara otomatis akan merutekan ulang (redirect) semua trafik HTTP yang masuk menjadi sambungan gembok hijau HTTPS yang terenkripsi aman.

6. Optimasi Performa Nginx Tingkat Lanjut

  • Kompresi Gzip: Merampingkan ukuran payload teks (HTML/CSS/JS).
  • Caching Headers: Menyimpan tembolok file gambar/statis di memori peramban klien.
  • Protokol HTTP/2: Melesatkan kecepatan transmisi aset melalui metode multiplexing.

Untuk memastikan performa situs web Anda sempurna, tambahkan dua optimasi krusial ini ke dalam file konfigurasi nginx.conf atau Server Block Anda:

# 1. Aktifkan Kompresi Gzip untuk menghemat Bandwidth
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1000;

# 2. Tambahkan Caching Headers untuk file statis (Gambar/CSS/JS)
location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp)$ {
    expires 365d;
    add_header Cache-Control "public, no-transform";
}

Kompresi Gzip mengecilkan ukuran muatan teks (HTML/CSS/JS) hingga 70%, sementara Caching Headers memerintahkan peramban pengguna untuk menyimpan file gambar di memori lokal perangkat keras mereka, mempercepat pemuatan halaman kedua dan seterusnya secara dramatis.

7. Panduan Menghapus Instalasi (Uninstall) Nginx

  • Perintah Evakuasi: sudo apt purge nginx nginx-common -y
  • Pembersihan Dependensi: sudo apt autoremove -y
  • Skenario Kasus: Konfigurasi kusut yang tak terselamatkan atau saat ingin melakukan migrasi *server*.

Jika Anda melakukan kesalahan konfigurasi parah atau memutuskan untuk bermigrasi ke web server lain, berikut adalah prosedur aman untuk membersihkan (purge) instalasi Nginx secara total dari ekosistem Ubuntu Anda:

# 1. Hentikan lalu lintas layanan Nginx
sudo systemctl stop nginx

# 2. Hapus Nginx beserta seluruh akar file konfigurasinya
sudo apt purge nginx nginx-common -y

# 3. Sapu bersih sisa-sisa paket dependensi yang yatim-piatu
sudo apt autoremove -y

8. Pemantauan dan Manajemen Log (Access/Error)

  • Log Akses: /var/log/nginx/access.log (Mencatat semua trafik masuk)
  • Log Error: /var/log/nginx/error.log (Mencatat masalah/crash sistem)
  • Pemantauan Real-time: Gunakan perintah tail -f

Dalam operasional DevOps sehari-hari, Anda dituntut untuk memiliki visibilitas atas apa yang terjadi di dalam server. Nginx secara otomatis merekam setiap interaksi di dua file krusial:

# Memantau trafik pengunjung secara real-time (Live)
sudo tail -f /var/log/nginx/access.log

# Melacak akar masalah saat terjadi error 502/500
sudo tail -f /var/log/nginx/error.log

Pemeriksaan rutin pada file error.log adalah langkah investigasi pertama (first responder) yang wajib dilakukan oleh System Administrator setiap kali situs web mengalami kendala teknis.

9. Troubleshooting Error Umum Nginx

Dalam praktik belajar DevOps, berikut adalah panduan langkah demi langkah untuk mengatasi error umum Nginx (format listicle):

  1. Cara mengatasi error 502 Bad Gateway

    Ini berarti Nginx (sebagai Reverse Proxy) gagal terhubung ke backend. Solusi:

    • Pastikan layanan backend (seperti Node.js/PHP-FPM) sedang berjalan (running).
    • Periksa konfigurasi proxy_pass dan pastikan port-nya sama dengan port aplikasi Anda.
  2. Cara mengatasi Address already in use (Port 80/443)

    Artinya ada aplikasi lain (seperti Apache) yang menahan port default web. Solusi:

    • Lacak aplikasi penyebab menggunakan sudo netstat -tulpn | grep :80.
    • Hentikan aplikasi tersebut secara permanen: sudo systemctl stop apache2 && sudo systemctl disable apache2.
    • Jalankan kembali Nginx: sudo systemctl start nginx.
  3. Bagaimana cara mengatasi error 403 Forbidden pada Nginx?

    Error ini terjadi saat web server kekurangan hak akses (permission) untuk membaca folder root dokumen. Solusi:

    • Pastikan direktori root (contoh: /var/www/html) memiliki ownership yang benar: sudo chown -R www-data:www-data /var/www/html.
    • Ubah permission folder menjadi 755: sudo find /var/www/html -type d -exec chmod 755 {} ;.
    • Ubah permission file menjadi 644: sudo find /var/www/html -type f -exec chmod 644 {} ;.
    • Pastikan tidak ada deny all; yang salah tempat pada konfigurasi server block Anda.
  4. Bagaimana cara mengatasi error 504 Gateway Timeout secara spesifik?

    Error ini muncul saat Nginx tidak menerima respons dari server backend (seperti PHP-FPM/Node.js) dalam batas waktu yang ditentukan. Solusi spesifik:

    • Buka file konfigurasi Nginx Anda (contoh: /etc/nginx/nginx.conf atau server block).
    • Tambahkan parameter konfigurasi pada blok location atau server Anda secara spesifik seperti contoh berikut:
    location / {
        proxy_pass http://backend_server;
        proxy_read_timeout 300s;
        proxy_connect_timeout 75s;
        proxy_send_timeout 300s;
    }
    
    # Jika menggunakan PHP-FPM:
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_read_timeout 300s;
    }
    • Restart Nginx: sudo systemctl restart nginx. (Pastikan juga script backend Anda tidak mengalami infinite loop atau terlalu lambat diproses).

Daftar Pustaka Belajar DevOps Nginx

Materi teknis dalam bab ini disusun menggunakan fondasi dokumentasi otoritatif berikut. Kami menyarankan pembaca untuk mengakses tautan referensi resmi (outbound links) di bawah ini untuk pendalaman arsitektur lebih lanjut:

10. Catatan Kaki: Konfigurasi Nginx untuk PHP-FPM (LEMP Stack)

Jika Anda membangun ekosistem LEMP (Linux, Nginx, MySQL, PHP), Nginx secara default tidak memproses bahasa pemrograman PHP. Anda wajib menghubungkannya dengan PHP-FPM.

Diagram Alur Kerja Nginx dan PHP-FPM

sequenceDiagram participant Browser participant Nginx participant PHPFPM as PHP-FPM participant MySQL Browser->>Nginx: Request HTTP (index.php) Nginx->>PHPFPM: Meneruskan script via FastCGI PHPFPM->>MySQL: Query Database (opsional) MySQL-->>PHPFPM: Kembalikan Data PHPFPM-->>Nginx: Hasil Eksekusi HTML Nginx-->>Browser: Response HTTP (Halaman Web)
# Sisipkan blok location ini di dalam konfigurasi server block Nginx
location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    # Ganti versi php8.1 sesuai dengan instalasi OS Ubuntu Anda
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}

FAQ: Instalasi Nginx Ubuntu dan Konfigurasi

Q Bagaimana cara restart Nginx setelah mengubah konfigurasi?
A

Gunakan perintah sudo systemctl restart nginx. Sangat disarankan untuk menguji sintaks terlebih dahulu dengan sudo nginx -t untuk mencegah server mati akibat typo.

Q Mengapa Nginx lebih cepat dari Apache?
A

Nginx menggunakan arsitektur event-driven asinkron yang mampu menangani ribuan koneksi konkuren dalam satu proses pekerja (worker process), sangat menghemat memori (RAM) dibandingkan pendekatan thread-per-connection klasik milik Apache.

Q Cara mengonfigurasi Nginx untuk Node.js clustering?
A

Gunakan blok upstream untuk mendefinisikan beberapa instans Node.js Anda. Kemudian arahkan proxy_pass ke nama blok upstream tersebut. Nginx secara otomatis akan mendistribusikan beban trafik (Load Balancing) menggunakan algoritma round-robin ke seluruh port backend yang tersedia.

Q Bagaimana cara melakukan load balancing dasar menggunakan Nginx?
A

Nginx secara native mendukung load balancing. Anda cukup menggunakan blok upstream di luar server block, dan daftarkan IP atau nama domain target server (misal: server 10.0.0.1; server 10.0.0.2;). Kemudian pada location /, gunakan proxy_pass http://nama_upstream;. Nginx akan otomatis membagi trafik ke server-server target tersebut (round-robin).

Q Bagaimana cara mengonfigurasi Nginx untuk aplikasi berbasis Docker?
A

Gunakan Nginx sebagai Reverse Proxy yang menunjuk ke port kontainer Docker Anda. Pada proxy_pass, arahkan ke http://localhost:PORT_DOCKER atau gunakan alamat IP jaringan Docker internal jika Nginx juga berjalan di dalam kontainer. Ini menyembunyikan port asli aplikasi dari akses publik.

Q Bagaimana cara membatasi rate limiting untuk mencegah serangan DDoS di Nginx?
A

Gunakan direktif limit_req_zone di dalam blok http untuk mendefinisikan zona memori berdasarkan IP pengunjung ($binary_remote_addr) dan batas ratenya (misal rate=10r/s). Kemudian aktifkan di dalam blok location menggunakan limit_req zone=nama_zona burst=5 nodelay;. Ini mencegah suatu IP membanjiri server dengan banyak permintaan dalam hitungan detik.

Glosarium Singkat Belajar DevOps Nginx

Reverse Proxy
Server perantara yang berdiri di depan server backend (aplikasi lokal) dan meneruskan request dari klien internet kepada mereka secara aman.
Server Block / Virtual Host
Konfigurasi yang memungkinkan satu web server fisik untuk melayani (hosting) banyak nama domain (website) yang berbeda secara bersamaan.
SSL / TLS (Let's Encrypt)
Protokol kriptografi standar yang mengamankan transmisi data antara peramban (browser) klien dan web server menggunakan enkripsi.
High Concurrency
Kemampuan arsitektur perangkat lunak untuk memproses puluhan ribu request koneksi secara bersamaan tanpa mengalami crash atau kelumpuhan sistem.