NGINX (diucapkan “engine x”) adalah perangkat lunak server web open source yang dirancang untuk performa tinggi, yang dapat digunakan sebagai HTTP/HTTPS serverreverse proxy servermail proxy serversoftware load balancerTLS terminatorcaching server

NGINX adalah perangkat lunak yang sangat modular. Bahkan beberapa bagian perangkat lunak yang tampaknya “built-in”, seperti GZIP atau SSL, sebenarnya dibangun sebagai modul yang dapat diaktifkan atau dinonaktifkan selama waktu build.

NGINX memiliki modul core (native) dan modul pihak ketiga (eksternal) yang dibuat oleh komunitas. Saat ini, ada lebih dari seratus modul pihak ketiga yang dapat kita manfaatkan.

Instal NGINX dari source code relatif “mudah” – download versi terbaru dari source code NGINX, konfigurasikan, build, dan instal.

Anda harus memilih apakah akan mengunduh versi mainline atau versi stable, tetapi cara build kedua versi tersebut sama persis.

Dalam tutorial ini, kami akan membangun NGINX dengan semua modul yang tersedia dalam versi open source NGINX dan kami akan menggunakan versi mainline  yang berada di versi 1.15.0 pada saat penulisan artikel ini. Perbarui nomor versi ketika versi yang lebih baru tersedia.

Perbedaan Stable vs. mainline

NGINX Open Source tersedia dalam dua versi:

  • Mainline – Termasuk fitur terbaru dan perbaikan bug dan selalu terbarui. Nginx versi ini sudah dapat diandalkan, tetapi mungkin termasuk beberapa modul eksperimental, dan tidak menutup kemungkinan muncul beberapa bug baru.
  • Stable – Tidak menyertakan semua fitur terbaru, tetapi memiliki perbaikan bug kritis yang selalu di-backport ke versi mainline .

Core modules vs. third-party modules

NGINX memiliki dua jenis modul yang dapat Anda manfaatkan: modul core (Inti) dan modul third-party (pihak ketiga).

  • Modul core dibangun oleh pengembang inti NGINX dan mereka adalah bagian dari perangkat lunak itu sendiri.
  • Modul pihak ketiga dibangun oleh komunitas dan Anda dapat menggunakannya untuk memperluas fungsionalitas NGINX. Ada banyak modul pihak ketiga yang bermanfaat, yang paling terkenal di antaranya adalah: PageSpeed, ModSecurity, RTMP, Lua dll …

Static modules vs. dynamic modules

Static modules ada di NGINX dari versi pertama. Dynamic modules diperkenalkan dengan NGINX 1.9.11+ pada bulan Februari 2016.

Dengan static modules, set modul yang merupakan biner NGINX diperbaiki pada waktu kompilasi oleh skrip ./configure. Static modules menggunakan --with-foo_bar_module atau sintaks --add-module=PATH.

Untuk mengkompilasi modul core (standar) sebagai dynamic, kita perlu tambahkan =dynamic, misalnya --with-http_image_filter_module=dynamic.

Untuk mengkompilasi modul pihak ketiga sebagai dynamic, kita menggunakan sintaks --add-dynamic-module=/path/to/module dan kemudian memuatnya dengan menggunakan direktif load_module dalam konteks global file nginx.conf.

Persyaratan Minimum Build NGINX dari Source

Dibandingkan dengan beberapa perangkat lunak UNIX / Linux lainnya, NGINX cukup ringan dan tidak memiliki banyak ketergantungan pada libraries.

Konfigurasi build default tergantung pada hanya 3 libraries yang akan diinstal:  OpenSSL/LibreSSL/BoringSSLZlib dan PCRE.

Sebelum Mulai

  • Ubuntu 18.04 LTS.
  • User root atau dengan hak akses sudo.

Langkah Awal

Periksa versi Ubuntu:

lsb_release -ds 
# Ubuntu 18.04 LTS

Siapkan zona waktu:

timedatectl list-timezones
sudo timedatectl set-timezone 'Region/City'

Perbarui paket sistem operasi Anda:

sudo apt update && sudo apt upgrade -y

Download Source Nginx dari Repo Resmi

NGINX adalah program yang ditulis dalam Bahasa C, jadi Anda harus menginstal alat compiler terlebih dahulu. Instal paket build-essential, git dan tree:

sudo apt install -y build-essential git tree

Download versi mainline terbaru dari source code NGINX dan extract. Source code NGINX didistribusikan sebagai arsip terkompresi (tarbal gzip), sebagai mana sebagian besar perangkat lunak Unix dan Linux lainnya:

wget https://nginx.org/download/nginx-1.15.0.tar.gz && tar zxvf nginx-1.15.0.tar.gz

Download source code dependensi NGINX dan ekstrak

# PCRE version 8.42
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz && tar xzvf pcre-8.42.tar.gz

# zlib version 1.2.11
wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz

# OpenSSL version 1.1.0h
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz && tar xzvf openssl-1.1.0h.tar.gz

Build Nginx dari Source

Untuk mulai build Nginx dari Source, pertama Instal dependensi opsional NGINX :

sudo add-apt-repository -y ppa:maxmind/ppa
sudo apt update && sudo apt upgrade -y 
sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev

Bersihkan semua file .tar.gz karena kita tidak membutuhkannya lagi:

rm -rf *.tar.gz

Masukkan direktori source NGINX:

cd ~/nginx-1.15.0

Lihat bagaimana direktori dari Nginx yang tersusun dengan perintah  tree :

tree -L 2 .

Copy NGINX manual page ke direktori /usr/share/man/man8/ :

sudo cp ~/nginx-1.15.0/man/nginx.8 /usr/share/man/man8
sudo gzip /usr/share/man/man8/nginx.8
ls /usr/share/man/man8/ | grep nginx.8.gz
# periksa apakah man page untuk nginx telah berfungsi :
man nginx

nginx man page

Untuk halaman help, Anda dapat melihat daftar lengkap opsi waktu compile NGINX dengan menjalankan:

./configure --help
# Untuk melihat apakah modul core dapat dibangun sebagai dynamic, jalankan :
./configure --help | grep -F =dynamic

kemudian kita siap untuk configure, compile dan install NGINX, disini Anda bebas untuk menambah / mengurangi apapun yang Anda inginkan :

./configure --prefix=/etc/nginx \ 
            --sbin-path=/usr/sbin/nginx \ 
            --modules-path=/usr/lib/nginx/modules \ 
            --conf-path=/etc/nginx/nginx.conf \
            --error-log-path=/var/log/nginx/error.log \
            --pid-path=/var/run/nginx.pid \
            --lock-path=/var/run/nginx.lock \
            --user=nginx \
            --group=nginx \
            --build=Ubuntu \
            --builddir=nginx-1.15.0 \
            --with-select_module \
            --with-poll_module \
            --with-threads \
            --with-file-aio \
            --with-http_ssl_module \
            --with-http_v2_module \
            --with-http_realip_module \
            --with-http_addition_module \
            --with-http_xslt_module=dynamic \
            --with-http_image_filter_module=dynamic \
            --with-http_geoip_module=dynamic \
            --with-http_sub_module \
            --with-http_dav_module \
            --with-http_flv_module \
            --with-http_mp4_module \
            --with-http_gunzip_module \
            --with-http_gzip_static_module \
            --with-http_auth_request_module \
            --with-http_random_index_module \
            --with-http_secure_link_module \
            --with-http_degradation_module \
            --with-http_slice_module \
            --with-http_stub_status_module \
            --with-http_perl_module=dynamic \
            --with-perl_modules_path=/usr/share/perl/5.26.1 \
            --with-perl=/usr/bin/perl \
            --http-log-path=/var/log/nginx/access.log \
            --http-client-body-temp-path=/var/cache/nginx/client_temp \
            --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
            --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
            --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
            --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
            --with-mail=dynamic \
            --with-mail_ssl_module \
            --with-stream=dynamic \
            --with-stream_ssl_module \
            --with-stream_realip_module \
            --with-stream_geoip_module=dynamic \
            --with-stream_ssl_preread_module \
            --with-compat \
            --with-pcre=../pcre-8.42 \
            --with-pcre-jit \
            --with-zlib=../zlib-1.2.11 \
            --with-openssl=../openssl-1.1.0h \
            --with-openssl-opt=no-nextprotoneg \
            --with-debug


make
sudo make install

Setelah proses build NGINX, navigasikan ke direktori home (~):

cd ~

Langkah selanjutnya buat Symlink direktori  /usr/lib/nginx/modules ke /etc/nginx/modules . Direktori  etc/nginx/modules adalah tempat standar dimana NGINX menyimpan informasi module :

sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules

Print versi NGINX, versi compiler, dan konfigurasikan parameter script:

sudo nginx -V
# nginx version: nginx/1.15.0 (Ubuntu)
# built by gcc 7.3.0 (Ubuntu 7.3.0-16ubuntu3)
# built with OpenSSL 1.1.0h  27 Mar 2018
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules
# . . .
# . . .

Buat NGINX system group dan user NGINX :

sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx

Buat NGINX syntax dan alihkan error yang terjadi:

sudo nginx -t
# Ini akan membuang Error ke -> nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (2: No such file or directory)
# Buat Direktori untuk NGINX cache dan set permission yang tepat
sudo mkdir -p /var/cache/nginx/client_temp /var/cache/nginx/fastcgi_temp /var/cache/nginx/proxy_temp /var/cache/nginx/scgi_temp /var/cache/nginx/uwsgi_temp
sudo chmod 700 /var/cache/nginx/*
sudo chown nginx:root /var/cache/nginx/*

# cek ulang agar sesuai dengan yang kita inginkan.
sudo nginx -t

Buat NGINX systemd unit file:

sudo vim /etc/systemd/system/nginx.service

Copy/paste konten di bawah ini ke file /etc/systemd/system/nginx.service:

[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

Aktifkan NGINX untuk memulai saat boot dan segera mulai NGINX:

sudo systemctl enable nginx.service
sudo systemctl start nginx.service

Periksa apakah NGINX akan mulai secara otomatis setelah reboot:

sudo systemctl is-enabled nginx.service
# enabled

Periksa apakah NGINX berjalan normal dengan menjalankan salah satu dari perintah berikut:

sudo systemctl status nginx.service
# atau
ps aux | grep nginx
# atau
curl -I 127.0.0.1

Perintah status nginx.service akan menampilkan status nginx di terminal, sedangkan perintah ps kita gabungkan dengan perintah grep untuk menampilkan PID dari nginx (jika berjalan), sedangkan perintah curl akan memeriksa apakah webserver nginx berjalan dengan memeriksa IP localhost.

Anda juga dapat membuka browser Anda dan menavigasi ke domain/alamat IP Anda untuk melihat halaman default NGINX . Itu adalah indikator bahwa NGINX aktif dan berjalan.

Buat Pengaturan Firewall (UFW)

Buat profil aplikasi NGINX di Uncomplicated Firewall (UFW):

sudo vim /etc/ufw/applications.d/nginx

Copy/paste konten di bawah ini ke file /etc/ufw/applications.d/nginx:

[Nginx HTTP]
title=Web Server (Nginx, HTTP)
description=Buka Port 80
ports=80/tcp

[Nginx HTTPS]
title=Web Server (Nginx, HTTPS)
description=Buka Port 443
ports=443/tcp

[Nginx Full]
title=Web Server (Nginx, HTTP + HTTPS)
description=Buka Port 80 dan 443
ports=80,443/tcp

Pastikan profil aplikasi UFW telah dibuat dan dikenali oleh UFW:

sudo ufw app list

# Available applications:
 # Nginx Full
 # Nginx HTTP
 # Nginx HTTPS
 # OpenSSH

NGINX secara default, menghasilkan file .default cadangan di /etc/nginx. Hapus file .default dari directory /etc/nginx:

sudo rm /etc/nginx/*.default

Tempatkan konfigurasi syntax highlighting NGINX untuk editor Vim ke ~/.vim: (pastikan Anda masuk sebagai user sudo)

# Untuk regular user non-root
mkdir ~/.vim/
cp -r ~/nginx-1.15.0/contrib/vim/* ~/.vim/
# Untuk user root
sudo mkdir /root/.vim/
sudo cp -r ~/nginx-1.15.0/contrib/vim/* /root/.vim/

Dengan melakukan langkah di atas, Anda akan mendapatkan syntax highlighting yang bagus saat mengedit file konfigurasi NGINX di Vim editor.

nginx syntax highlighting

Buat direktori conf.d, snippets, sites-available, dan sites-enabled di direktori /etc/nginx:

sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}

Ubah izin dan kepemilikan grup untuk file log NGINX:

sudo chmod 640 /var/log/nginx/*
sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log

buat pengaturan logrotation untuk NGINX.

sudo vim /etc/logrotate.d/nginx

Isi file dengan teks di bawah ini, lalu simpan dan keluar:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 640 nginx adm
    sharedscripts
    postrotate
            if [ -f /var/run/nginx.pid ]; then
                    kill -USR1 `cat /var/run/nginx.pid`
            fi
    endscript
}

hapus semua file yang telah kita download dari home directory karena sudah tidak kita butuhkan lagi:

cd ~
rm -rf nginx-1.15.0/ openssl-1.1.0h/ pcre-8.42/ zlib-1.2.11/

Pada poin ini, Anda memiliki NGINX versi terbaru yang diinstal dengan compile dari source code. Itu dikompilasi secara statis terhadap beberapa libraries penting seperti OpenSSL. Seringkali, versi yang disediakan sistem OpenSSL sudah usang.

Kesimpulan

Dengan menggunakan metode pemasangan ini dengan OpenSSL versi yang lebih baru, Anda dapat memanfaatkan cipher baru seperti CHACHA20_POLY1305 dan protokol seperti TLS 1.3 yang akan tersedia di OpenSSL 1.1.1.

Selain itu, dengan mengkompilasi binary sendiri, Anda dapat menyesuaikan fungsionalitas apa yang akan diberikan NGINX Anda, yang jauh lebih fleksibel daripada menginstal biner yang dibuat sebelumnya.