Compile Nginx dari Source #
Sebagian besar orang tidak perlu compile Nginx dari source — package manager sudah menyediakan binary yang siap pakai dengan modul-modul yang paling umum dibutuhkan. Tapi ada situasi di mana kompilasi manual menjadi satu-satunya pilihan.
Kapan Perlu Compile dari Source? #
Compile dari source diperlukan ketika:
✓ Butuh modul pihak ketiga yang tidak tersedia di package binary
(misalnya: ModSecurity, ngx_brotli, nginx-auth-ldap)
✓ Butuh mengaktifkan atau menonaktifkan modul bawaan tertentu
✓ Butuh mengkompilasi dengan flag atau library yang berbeda
✓ Butuh versi yang sangat spesifik yang tidak tersedia di repository
✓ Lingkungan tanpa akses internet (air-gapped) yang perlu build sendiri
Tidak perlu compile dari source jika:
✗ Package dari repository distro atau nginx.org sudah cukup
✗ Semua modul yang dibutuhkan sudah tersedia di binary
Jika ragu, cek dulu modul apa yang tersedia di binary package:
nginx -V 2>&1 | tr ' ' '\n' | grep module
Persiapan: Dependency yang Dibutuhkan #
Nginx membutuhkan beberapa library untuk dikompilasi:
# Ubuntu / Debian
sudo apt update
sudo apt install -y \
build-essential \
libpcre3 libpcre3-dev \
zlib1g zlib1g-dev \
libssl-dev \
libgd-dev \
git
# CentOS / RHEL / Rocky
sudo dnf groupinstall -y "Development Tools"
sudo dnf install -y \
pcre pcre-devel \
zlib zlib-devel \
openssl openssl-devel \
gd gd-devel
Library-library ini untuk:
- pcre / pcre-devel: Regular expression di location block dan rewrite rules
- zlib / zlib-devel: Kompresi gzip
- openssl / openssl-devel: SSL/TLS support
- gd / gd-devel: Pemrosesan gambar (opsional, untuk
ngx_http_image_filter_module)
Download Source Code Nginx #
# Cek versi stable terbaru di https://nginx.org/en/download.html
# Kemudian download:
cd /tmp
wget https://nginx.org/download/nginx-1.24.0.tar.gz
# Verifikasi integritas file (opsional tapi disarankan)
wget https://nginx.org/download/nginx-1.24.0.tar.gz.asc
gpg --verify nginx-1.24.0.tar.gz.asc nginx-1.24.0.tar.gz
# Extract
tar -xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0
Memahami Opsi Konfigurasi #
Sebelum mengkompilasi, kamu perlu menentukan modul apa yang ingin diaktifkan. Jalankan ./configure --help untuk melihat semua opsi yang tersedia — outputnya panjang, tapi ada pola yang perlu dipahami:
./configure --help
# Opsi utama yang sering digunakan:
# --prefix=PATH # Direktori instalasi (default: /etc/nginx)
# --sbin-path=PATH # Path binary nginx
# --conf-path=PATH # Path file konfigurasi utama
# --error-log-path=PATH # Path error log default
# --http-log-path=PATH # Path access log default
# --pid-path=PATH # Path file PID
# --user=USER # User untuk worker process
# --group=GROUP # Group untuk worker process
# Modul bawaan yang bisa dinonaktifkan (--without-):
# --without-http_rewrite_module
# --without-http_gzip_module
# Modul opsional yang perlu diaktifkan eksplisit (--with-):
# --with-http_ssl_module # HTTPS
# --with-http_v2_module # HTTP/2
# --with-http_v3_module # HTTP/3 (QUIC)
# --with-http_gzip_static_module # Serve pre-compressed .gz files
# --with-http_stub_status_module # Status page
# --with-http_realip_module # Baca IP asli dari header proxy
# --with-stream # TCP/UDP proxy
# --with-stream_ssl_module # SSL untuk stream
Proses Kompilasi #
Berikut contoh kompilasi dengan opsi yang umum digunakan di production:
# Konfigurasi build
./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-threads \
--with-stream \
--with-stream_ssl_module
# Kompilasi (gunakan -j dengan jumlah CPU untuk mempercepat)
make -j$(nproc)
# Install
sudo make install
Proses kompilasi biasanya memakan waktu 1-3 menit tergantung hardware.
Menambahkan Modul Pihak Ketiga #
Inilah alasan utama compile dari source. Sebagai contoh, kita tambahkan ngx_brotli — modul untuk kompresi Brotli yang lebih efisien dari gzip:
# Download modul ngx_brotli
cd /tmp
git clone --recurse-submodules https://github.com/google/ngx_brotli.git
# Kembali ke direktori source Nginx dan tambahkan --add-module
cd /tmp/nginx-1.24.0
./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--with-http_ssl_module \
--with-http_v2_module \
--add-module=/tmp/ngx_brotli # ← tambahkan modul eksternal
make -j$(nproc)
sudo make install
Untuk dynamic module (tidak dikompilasi langsung ke binary):
# Dynamic module — dikompilasi sebagai .so file yang bisa di-load saat runtime
./configure \
--with-compat \
--add-dynamic-module=/tmp/ngx_brotli
make modules
sudo cp objs/ngx_http_brotli_filter_module.so /etc/nginx/modules/
sudo cp objs/ngx_http_brotli_static_module.so /etc/nginx/modules/
Lalu di nginx.conf:
# Load dynamic module di awal nginx.conf
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;
Setup Setelah Instalasi #
Setelah make install, Nginx belum punya systemd service file — kamu perlu membuatnya secara manual:
# Buat user nginx jika belum ada
sudo useradd --system --no-create-home --shell /sbin/nologin nginx
# Buat direktori yang dibutuhkan
sudo mkdir -p /var/log/nginx
sudo chown nginx:nginx /var/log/nginx
# Buat systemd service file
sudo nano /etc/systemd/system/nginx.service
Isi dengan:
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/
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 -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# Reload systemd dan enable Nginx
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
# Verifikasi
sudo systemctl status nginx
nginx -V
Upgrade Nginx yang Dikompilasi Manual #
Ketika ada versi baru, prosesnya sedikit berbeda dari package manager:
# 1. Download dan kompilasi versi baru (dengan opsi yang sama)
cd /tmp
wget https://nginx.org/download/nginx-1.26.0.tar.gz
tar -xzf nginx-1.26.0.tar.gz
cd nginx-1.26.0
./configure [opsi yang sama seperti sebelumnya]
make -j$(nproc)
# 2. JANGAN langsung make install
# Lakukan hot upgrade tanpa downtime:
# Backup binary lama
sudo cp /usr/sbin/nginx /usr/sbin/nginx.old
# Copy binary baru
sudo cp objs/nginx /usr/sbin/nginx
# Kirim signal USR2 ke master process lama untuk start master baru
# dengan binary baru, sambil master lama tetap melayani
sudo kill -USR2 $(cat /var/run/nginx.pid)
# Master baru sudah berjalan. Kirim WINCH ke master lama untuk
# graceful shutdown worker-worker lamanya
sudo kill -WINCH $(cat /var/run/nginx.pid.oldbin)
# Setelah semua request di worker lama selesai, matikan master lama
sudo kill -QUIT $(cat /var/run/nginx.pid.oldbin)
Ini adalah hot upgrade — tidak ada request yang terputus selama proses upgrade.
Ringkasan #
- Compile dari source hanya diperlukan untuk modul pihak ketiga atau opsi compile yang tidak tersedia di binary package.
- Gunakan
./configure --helpuntuk melihat semua opsi yang tersedia sebelum mulai kompilasi.--add-moduleuntuk modul statis (dikompilasi ke binary),--add-dynamic-moduleuntuk modul dinamis (file.soyang di-load saat runtime).- Setelah
make install, buat systemd service file secara manual — tidak otomatis dibuat seperti instalasi via package manager.- Untuk upgrade Nginx yang dikompilasi manual, gunakan hot upgrade via signal USR2 untuk zero-downtime.