Memilih Web Server dan Instalasinya (Nginx)


Pengertian

Web server adalah sebuah software (perangkat lunak) yang melayani permintaan data dari klien, yang kita kenal dengan web browser (Chrome, Firefox, Safari, Opera, Brave, dan lain-lain), melalui protocol HTTP maupun HTTPS. Selanjutnya ia akan mengirimkan respon atas permintaan tersebut kepada client dalam bentuk dokumen web maupun format data lainnya. Web server juga menjadi rumah (proxy) bagi aplikasi berbasis web yang ditulis oleh beragam bahasa pemrograman.

Jenis-jenis Web Server

Web server yang populer saat ini

  • Apache
  • Engine X (Nginx)
  • IIS
  • Lighttpd

Rekomendasi

Web server yang di rekomendasikan untuk Program Digital Amoeba adalah Nginx. Mengapa Nginx? Nginx merupakan salah satu web browser paling populer di dunia, dan salah satu yang paling kuat melayani pengguna yang sangat besar. Nginx sangat ringan, baik menjadi web server, maupun reverse proxy. Pada dokumentasi ini kita akan membahas bagaimana melakukan instalasi Nginx pada Ubuntu Server 20.04 LTS, melakukan konfigurasi firewall, mengontrol proses Nginx, dan set up lebih dari satu domain web dalam satu server.


Instalasi dan Maintenance

Prerequisites

Sebelum memulai, pastikan menggunakan akun selain root dengan akses sudo, untuk melakukan instalasi pada server. Bagimana cara membuat akun baru dengan akses sudo pada Ubuntu Server, dapat kita lihat kembali pada dokumentasi sebelumnya disini.

Atau dapat menggunakan perintah berikut ini:

sudo adduser <NEWUSER>
sudo adduser <NEWUSER> sudo
sudo su - <NEWUSER>

Kita juga mungkin membutuhkan nama domain terdaftar sebelum menyelesaikan langkah terakhir pada dokumen ini. Pada contoh dalam dokumentasi ini, kita akan men-setup domain domain.com (yang tentunya tidak ada) sebagai contoh, dan harus diganti dengan domain sebenarnya ketika men-setup server production. Domain sebenarnya dapat dibeli pada registrar-registrar yang tersedia di Indonesia maupun luar negeri, petunjuk singkat mengelola domain menggunakan Cloudflare bisa ditemukan disini.


Langkah 1 – Install Nginx

Karena Nginx sudah tersedia pada standar repositori Ubuntu, kita dapat melakukan instalasi Nginx menggunakan perintah apt, tanpa harus meng-compile source code nya terlebih dahulu.

Masuk ke command line interface server melalui ssh dengan user root, menggunakan Terminal, atau Putty untuk pengguna Windows. Perintah login ssh via Terminal:

ssh user@ip_server

Untuk Putty, silahkan mengisi parameter server sesuai form yang disediakan oleh putty, lalu masukan password ketika diminta, atau dapat menggunakan private key (biasanya berupa ppk).

Sebelum melakukan perintah install, lakukan update pada index paket lokal repositori, dengan perintah:

sudo apt update

Lanjutkan dengan perintah install:

sudo apt install nginx

Ketik huruf Y jika diminta konfirmasi instalasi, setelah itu sistem akan melakukan instalasi Nginx beserta seluruh library dependencies nya.


Langkah 2 – Mengatur Firewall

Sebelum digunakan, ada baiknya mengatur firewall yang berupa software (ufw, dokumentasi lengkap disini) pada level OS, agar keamanan server lebih terjaga, secara default, firewall dalam keadaan mati. Sebelum dihidupkan, buka dulu beberapa port yang penting, yaitu port ssh (akses remote server), dan Nginx (agar service Nginx dapat diakses dari browser klien).

Buka port ssh dengan perintah:

sudo ufw allow ssh

Nginx mendaftarkan paket port pada firewall saat instalasi, sebagai alias, sehingga kita tidak perlu menyebutkan secara spesifik port berupa angka.

Untuk melihat paket port apa saja yang terdaftar, bisa dilihat dengan menjalankan perintah:

sudo ufw app list

Perintah diatas akan mengeluarkan output:

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Penjelasan paket-paket port diatas adalah:

  • Nginx Full: membuka dua port sekaligus, yaitu port 80 (HTTP) dan port 443 (HTTPS)
  • Nginx HTTP: membuka port 80 saja
  • Nginx HTTPS: membuka port 443 saja

Pakai sesuai kebutuhan, namun penulis menyarankan membuka kedua port 80 dan 443, dengan perintah:

sudo ufw allow 'Nginx Full'

Kemudian, aktifkan firewall dengan perintah:

sudo ufw enable

Cek apakah port yang dibuka diatas sudah benar-benar terbuka dengan menggunakan perintah:

sudo ufw status

Jika tidak ada masalah, output dari perintah diatas adalah

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Jika kita ingin menghapus port yang telah di allow, dapat menggunakan perintah delete, contoh kita ingin menghapus paket port Nginx Full, maka perintah nya adalah:

sudo ufw delete 'Nginx Full'

Langkah 3 – Cek Web Server

Ketika selesai melakukan instalasi Nginx, secara otomatis service Nginx langsung dijalankan. Guna memeriksa apakah Nginx sudah berjalan pada server, gunakan perintah:

systemctl status nginx

Jika service Nginx sudah jalan, contoh output-nya:

● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-04-20 16:08:19 UTC; 3 days ago
     Docs: man:nginx(8)
 Main PID: 2369 (nginx)
    Tasks: 2 (limit: 1153)
   Memory: 3.5M
   CGroup: /system.slice/nginx.service
           ├─2369 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           └─2380 nginx: worker process

Selanjutnya cek pada browser dengan memasukan alamat IP server, contoh:

http://your_server_ip

Jika lupa IP server, gunakan perintah berikut untuk mendapatkannya:

curl -4 icanhazip.com

Jika tidak ada masalah, pada browser akan tampil:


Langkah 4 – Memahami Perintah Untuk Mengontrol Nginx

Setelah memastikan Nginx berhasil diinstall dan service-nya berjalan. Mari kita pahami beberapa perintah untuk mengontrol Nginx:

Untuk menghentikan service:

sudo systemctl stop nginx

Untuk menjalankan service:

sudo systemctl start nginx

Untuk menghentikan, lalu menjalankan service, secara berurutan:

sudo systemctl restart nginx

Jika melakukan perubahan pada konfigurasi Nginx, perintah yang digunakan agar konfigurasi yang baru berlaku tanpa menghentikan service, dapat menggunakan perintah berikut, :

sudo systemctl reload nginx

Secara default, service Nginx akan otomatis berjalan ketika server reboot, untuk menghentikan otomasi tersebut, dapat menjalankan perintah:

sudo systemctl disable nginx

Untuk mengaktifkan Nginx secara otomatis, ketika server di reboot:

sudo systemctl enable nginx


Langkah 5 – Setting Domain Dengan Kemampuan Multiple Domain

Ketika menggunakan Nginx sebagai web server, server blocks (mirip virtual host pada Apache) dapat digunakan untuk meng-enkapsulasi konfigurasi per domain, sehingga dapat melayani banyak domain (website) dalam satu web server. Pada contoh dalam dokumentasi ini, kita akan men-setup domain domain.com (yang tentunya tidak ada) sebagai contoh, dan harus diganti dengan domain sebenarnya ketika men-setup server production.

Nginx pada Ubuntu 20.04 memiliki default direktori yang digunakan sebagai root lokasi website, yaitu /var/www/html. Ini hanya berlaku untuk satu website saja, sehingga penggunaannya terbatas jika kita ingin mengelola lebih dari satu website. Nah mari membuat server block per domain, sehingga kita dapat menggunakan satu web server untuk banyak domain.

Pertama, buat direktori domain baru yang akan berfungsi sebagai root dokumen website, yaitu direktori domain.com, misalnya kita ingin meletakan direktori tersebut pada /var/www, gunakan perintah (-p flag akan membuat direktori parent jika dibutuhkan):

sudo mkdir -p /var/www/domain.com

Selanjutnya, ubah ownership direktori tersebut dengan $USER environment variable:

sudo chown -R $USER:$USER /var/www/domain.com

Ubah permissions ke 777 agar aplikasi kita dapat melakukan perubahan pada direktori kerjanya:

sudo chmod -R 755 /var/www/domain.com

Buat halaman html sebagai contoh, yaitu index.html. Dengan editor nano (atau kita bisa memilih editor lain yang disukai, namun pada contoh ini kita gunakan nano saja ya):

nano /var/www/domain.com/index.html

Lalu, isi file index.html dengan tag html berikut

<html>
    <head>
        <title>Selamat datang di domain.com!</title>
    </head>
    <body>
        <h1>Berhasil! Konfigurasi domain berhasil!</h1>
    </body>
</html>

Simpan dan tutup file dengan perintah Ctrl+X , akan muncul konfirmasi untuk menyimpan, pilih Y and dan Enter.

Kemudian buat konfigurasi domain-nya pada Nginx, yang akan diletakan di direktori khusus konfigurasi domain Nginx, yaitu: /etc/nginx/sites-available/ dengan menjalankan perintah:

sudo nano /etc/nginx/sites-available/domain.com

Paste konfigurasi blok dibawah ini, mungkin mirip dengan default, namun kita mendefinisikan direktori baru yang diarahkan khusus ke website domain.com:

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

    root /var/www/domain.com;
    index index.html index.htm index.nginx-debian.html;

    server_name domain.com www.domain.com;

    location / {
        try_files $uri $uri/ =404;
    }
}

Pada file konfigurasi tersebut, perhatikan root yang diarahkan ke direktori yang kita siapkan sebelumnya, dan server_name yang diarahkan ke domain kita.

Selanjutnya, aktifkan konfigurasi diatas dengan membuat symbolic link (symlink) ke direktori sites-enabled dengan perintah:

sudo ln -s /etc/nginx/sites-available/domain.com /etc/nginx/sites-enabled/

Catatan: Nginx menggunakan common practice yang disebut symbolic links, atau symlinks, untuk mengetahui server blocks domain mana saja yang aktif dan tidak aktif. Mengapa tidak langsung saja diaktifkan di direktori sites-available? Supaya kita dapat membuat draft konfigurasi yang tidak langsung aktif, serta dapat menonaktifkan konfigurasi tanpa menghapus file asli nya, cukup menghapus linking yang ada di sites-enabled.

Sekarang akan ada dua server blocks yang aktif, yakni default dan domain.com:

  • domain.com: akan bekerja ketika ada request ke domain.com.
  • default: akan bekerja ketika ada request ke domain manapun (selain server blocks domain yang telah dibuat) atau IP Address pada port 80.

Untuk menghindari kemungkinan masalah hash bucket memory, yang muncul karena menambahkan server blocks yang berisi server_name, kita mungkin perlu merubah konfigurasi utama, dengan perintah:

sudo nano /etc/nginx/nginx.conf

Cari server_names_hash_bucket_size lalu hilangkan symbol #, untuk mengaktifkan perintah konfigurasi tersebut.

Catatan: Menjadikan baris kode sebagai comment – biasanya dengan menambahkan # pada awal perintah – adalah cara untuk menonaktifkan baris code tersebut, tanpa harus menghapusnya. Banyak kode program yang menggunakan cara ini, seluruh opsi dan konfigurasi ditulis semua, namun yang diaktifkan hanya baris kode yang dibutuhkan.

Contoh:

...
http {
    ...
    server_names_hash_bucket_size 64;
    ...
}
...

Lalu, tes seluruh konfigurasi sudah benar atau belum, dengan perintah:

sudo nginx -t

Kalau tidak ada masalah, restart Nginx untuk mengaktifkan perubahan yang telah dilakukan:

sudo systemctl restart nginx

Sampai disini, Nginx seharusnya sudah melayani domain.com, sesuai konfigurasi yang telah kita lakukan diatas. Validasi hasilnya dengan membuka http://domain.com, dan jika berhasil, akan keluar tampilan seperti ini pada browser:


Langkah 7 – Memahami File-file dan Direktori Nginx

Setelah belajar bagaimana mengelola Nginx, mari meluangkan waktu kembali untuk mengenal lebih dekat file-file dan direktori penting di Nginx.

Konten
  • /var/www/html: Adalah direktori default untuk meletakan file-file website yang kita bangun. Namun lokasi direktori ini bisa kita pindahkan ke lokasi tertentu lewat file konfigurasi Nginx, seperti yang telah dicontohkan diatas.
File Konfigurasi
  • /etc/nginx: Direktori seluruh file konfigurasi Nginx.
  • /etc/nginx/nginx.conf: File konfigurasi utama yang bersifat global.
  • /etc/nginx/sites-available/: Direktori penyimpanan konfigurasi untuk website tertentu. Setiap file konfigurasi yang dibuat pada direktori ini tidak langsung aktif. Untuk mengaktifkan, harus membuat symlink ke direktori /etc/nginx/site-enabled/ (contoh telah diberikan sebelumnya)
  • /etc/nginx/sites-enabled/: Direktori ini merupakan penyimpanan link dari file konfigurasi yang ada di /etc/nginx/sites-available/.
  • /etc/nginx/snippets: Direktori ini memuat konfigurasi fragments, yang dapat di masukan di konfigurasi manapun. Kegunaannya agar kita tidak perlu menuliskan konfigurasi yang sama berkali-kali, cukup memanggil konfigurasi yang sudah kita buat di direktori ini.
Log Server
  • /var/log/nginx/access.log: Setiap request ke web server, direkam di file ini. Kecuali diatur ditempat yang berbeda pada konfigurasi Nginx.
  • /var/log/nginx/error.log: Setiap error yang terjadi pada web server, akan direkam pada file ini. Kecuali diatur ditempat yang berbeda pada konfigurasi Nginx.

Kesimpulan

Sekarang kita telah memiliki web server yang melayani request dari browser client. Langkah selanjutnya adalah mengembangkan aplikasi yang dapat memproses semua permintaan yang telah ditampung web server. Kita dapat mengembangkan aplikasi tersebut dengan berbagai macam bahasa pemrograman seperti PHP, Javascript (NodeJS), Python, Golang, Ruby, dan lain-lain. Serta dengan database apapun yang di support oleh bahasa pemrograman yang kita gunakan, baik SQL dan keluarganya, maupun NoSQL dan keluarganya.

Nantikan dokumentasi selanjutnya, yang akan membahas, bagaimana men-setup HTTPS untuk domain dengan free SSL certificate menggunakan Let’s Encrypt. Serta dokumentasi yang akan membahas bagaimana menggunakan Nginx sebagai web servernya, dan bahasa program yang kita pilih sebagai aplikasinya.