Compile dari Source

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 --help untuk melihat semua opsi yang tersedia sebelum mulai kompilasi.
  • --add-module untuk modul statis (dikompilasi ke binary), --add-dynamic-module untuk modul dinamis (file .so yang 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.

← Sebelumnya: Docker   Berikutnya: Struktur File Config →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact