NGINX (diucapkan “engine x”) adalah perangkat lunak server web open source yang dirancang untuk performa tinggi, yang dapat digunakan sebagai HTTP/HTTPS server, reverse proxy server, mail proxy server, software load balancer, TLS terminator, caching 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/BoringSSL, Zlib dan PCRE.
- Persyaratan wajib:
- Persyaratan Optional:
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
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.
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.