Modul Pihak Ketiga #
Meskipun Nginx hadir dengan banyak modul bawaan yang kuat, fleksibilitas sejati Nginx terpancar melalui ekosistem modul pihak ketiga (third-party modules). Dikembangkan oleh komunitas pengembang global dan perusahaan teknologi ternama, modul-modul ini memungkinkan kita untuk menyisipkan fitur-fitur mutakhir—seperti algoritma kompresi canggih, firewall aplikasi web (WAF), pemantauan lalu lintas per virtual host secara detail, hingga optimasi gambar otomatis.
Di artikel ini, kita akan membahas modul pihak ketiga paling populer yang memberikan nilai nyata di lingkungan produksi. Kita juga akan menelaah panduan kompilasi mandiri dari source code menggunakan flag kompatibilitas agar modul dapat dimuat secara dinamis tanpa hambatan.
ngx_brotli: Kompresi Brotli Google #
Brotli adalah algoritma kompresi data lossless modern yang dikembangkan oleh Google. Jika dibandingkan dengan Gzip tradisional, Brotli mampu menghasilkan ukuran berkas HTML, CSS, dan JavaScript sekitar 15% hingga 25% lebih kecil, yang secara langsung mempercepat waktu render halaman web di browser pengguna dan menghemat bandwidth server kita.
Semua browser internet modern saat ini telah mendukung Brotli secara native. Di Nginx, kita mengintegrasikan modul ngx_brotli untuk mengaktifkan kompresi ini.
Konfigurasi Brotli Berdampingan dengan Gzip #
Kita bisa mengonfigurasi Brotli agar berjalan berdampingan dengan Gzip. Browser klien yang mendukung Brotli akan otomatis memilih Brotli (lewat header Accept-Encoding: br), sedangkan browser lama akan dilayani menggunakan Gzip.
# Muat modul Brotli dinamis di main context
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;
http {
# 1. Aktifkan Kompresi Brotli Dinamis
brotli on;
brotli_comp_level 6; # Sweet spot: tingkat kompresi 6 (hemat CPU) vs tingkat 11 (CPU-bound)
# 2. Aktifkan Sajian Brotli Statis (.br pre-compressed files)
brotli_static on; # Jika ada file index.html.br di disk, sajikan langsung tanpa kompresi on-the-fly
# 3. Tentukan tipe file teks yang perlu dikompresi
brotli_types
text/html
text/css
text/plain
text/xml
application/javascript
application/json
image/svg+xml
application/xml+rss;
# 4. Fallback Gzip tetap menyala untuk backward compatibility
gzip on;
gzip_comp_level 6;
gzip_types text/html text/css application/javascript application/json;
}
headers-more-nginx-module: Manipulasi Header Tingkat Lanjut #
Modul bawaan Nginx hanya menyediakan direktif add_header yang memiliki beberapa batasan penting:
- Tidak bisa menghapus header respons yang dihasilkan oleh server backend (seperti PHP-FPM, Tomcat, atau Node.js).
- Menambahkan header baru dengan nama yang sama alih-alih menimpa yang sudah ada, sehingga memicu header duplikat di browser klien.
- Aturan pewarisan (inheritance) di location block bertingkat sering kali membatalkan header yang telah dideklarasikan di level http global.
Modul headers-more-nginx-module memecahkan semua masalah ini dengan menyediakan kontrol penuh terhadap header request maupun response.
Mengamankan Informasi Server dengan headers-more #
Kita bisa menggunakan modul ini untuk menyembunyikan teknologi backend kita (reconnaissance hardening) dan menyusun aturan CORS secara lebih rapi:
# Muat modul headers-more
load_module modules/ngx_http_headers_more_filter_module.so;
http {
# Ubah identitas server secara global (default: "Server: nginx/1.x.x")
more_set_headers "Server: Enterprise-Web-Server";
server {
listen 80;
server_name app.unisbadri.com;
location / {
# Hapus header backend yang membocorkan detail framework/bahasa pemrograman
more_clear_headers "X-Powered-By";
more_clear_headers "X-AspNet-Version";
more_clear_headers "X-Runtime";
proxy_pass http://node_backend;
}
location /api/ {
# Ganti atau set header respons secara deterministik
more_set_headers "Access-Control-Allow-Origin: *";
more_set_headers "Access-Control-Allow-Methods: GET, POST, OPTIONS";
more_set_headers -t "application/json" "Cache-Control: no-store, must-revalidate";
proxy_pass http://node_backend;
}
}
}
nginx-module-vts: Pemantauan Trafik per Virtual Host #
Modul bawaan stub_status hanya menyajikan statistik koneksi global server Nginx. Di lingkungan server multi-tenant atau hosting bersama (shared hosting), kita membutuhkan statistik terpisah per domain (virtual host).
Modul nginx-module-vts (Virtual Host Traffic Status) menyediakan metrik detail per server name, per upstream backend, dan per cache zone. Modul ini juga menyediakan dashboard pemantauan HTML interaktif dan format output JSON asli yang dapat dibaca oleh Prometheus untuk visualisasi di Grafana.
Konfigurasi Dashboard VTS #
# Muat modul VTS
load_module modules/ngx_http_vhost_traffic_status_module.so;
http {
# Aktifkan pengumpulan data trafik VTS secara global
vhost_traffic_status_zone;
# Batasi memori monitoring maksimal 10MB
vhost_traffic_status_dump_file /var/log/nginx/vts.db;
server {
listen 8080;
server_name localhost;
# Endpoint visual dashboard HTML
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
allow 127.0.0.1;
allow 10.0.0.0/8;
deny all;
}
# Endpoint Prometheus untuk ditarik (scraped) oleh Prometheus server
location /metrics {
vhost_traffic_status_display;
vhost_traffic_status_display_format prometheus;
allow 127.0.0.1;
allow 10.0.0.0/8;
deny all;
}
}
}
ModSecurity: Web Application Firewall (WAF) #
ModSecurity adalah mesin Web Application Firewall open-source standar industri. ModSecurity versi 3 (libmodsecurity) dapat diintegrasikan ke dalam Nginx untuk menyaring lalu lintas request masuk terhadap ancaman eksploitasi keamanan umum—seperti serangan SQL Injection, Cross-Site Scripting (XSS), pembacaan berkas sewenang-wenang (path traversal), dan serangan Session Hijacking.
Kita mengombinasikan ModSecurity dengan pustaka aturan OWASP Core Rule Set (CRS) untuk perlindungan tingkat tinggi sejak di gerbang masuk web server Nginx.
Konfigurasi ModSecurity WAF di Nginx #
# Muat modul konektor ModSecurity Nginx
load_module modules/ngx_http_modsecurity_module.so;
http {
# Aktifkan ModSecurity secara global
modsecurity on;
# Tunjuk file konfigurasi aturan utama
modsecurity_rules_file /etc/nginx/modsec/main.conf;
server {
listen 80;
server_name portal.unisbadri.com;
location / {
proxy_pass http://portal_backend;
}
}
}
Konfigurasi Aturan CRS /etc/nginx/modsec/main.conf
#
# Muat setelan dasar ModSecurity
Include /etc/nginx/modsec/modsecurity.conf
# Pasang OWASP Core Rule Set
Include /etc/nginx/modsec/coreruleset/crs-setup.conf
Include /etc/nginx/modsec/coreruleset/rules/*.conf
Strategi Migrasi: DetectionOnly vs Enforcement #
Menyalakan WAF langsung pada mode pemblokiran (SecRuleEngine On) berisiko tinggi memblokir lalu lintas klien sah akibat kesalahan deteksi (false positives). Rekomendasi rilisnya adalah:
- Mulai dengan menyetel
SecRuleEngine DetectionOnlydi dalam berkasmodsecurity.conf. Pada mode ini, request mencurigakan hanya akan dicatat ke dalam/var/log/nginx/modsec_audit.logtanpa memblokir koneksi klien. - Analisis log audit selama beberapa minggu untuk mengenali anomali false positives.
- Tulis aturan pengecualian (rule exclusions) untuk melegalkan request sah.
- Ubah pengaturan menjadi
SecRuleEngine Onuntuk mulai memblokir serangan secara aktif.
1. Menganalisis Log Audit ModSecurity #
Ketika ada permintaan klien yang terblokir atau terdeteksi mencurigakan, ModSecurity akan mencatat entri log secara detail. Baris kritis di log biasanya berisi informasi seperti:
[file "/usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "37"] [id "941100"] [rev "2"] [msg "Libinjection-XSS detection"] [data "Matched Data: <script> found within ARGS:search"] [severity "CRITICAL"]
Dari entri log di atas, kita bisa mengekstrak informasi penting berikut:
id "941100": ID aturan spesifik yang mendeteksi request tersebut.msg "Libinjection-XSS detection": Deskripsi jenis serangan yang dideteksi.data "Matched Data: ...": Parameter atau payload spesifik klien yang memicu deteksi.
2. Menulis Aturan Pengecualian (Rule Exclusions) #
Jika data pencarian pada formulir aplikasi kita sah (misalnya admin memasukkan sintaks HTML di dashboard editor) tetapi terdeteksi sebagai serangan XSS oleh aturan 941100, kita tidak boleh mematikan WAF secara keseluruhan. Sebaliknya, kita menulis aturan pengecualian yang terfokus:
# Di /etc/nginx/modsec/main.conf (sebelum CRS rules dimuat)
# Matikan aturan 941100 khusus untuk parameter 'search' pada URL '/admin/editor/'
SecRuleUpdateTargetById 941100 "!ARGS:search"
Atau jika kita ingin menonaktifkan aturan tertentu untuk seluruh API terpercaya kita:
# Nonaktifkan aturan deteksi SQLi (942100) dan XSS (941100) untuk /api/trusted/
SecRule REQUEST_URI "@beginsWith /api/trusted/" \
"id:1001,phase:1,pass,nolog,ctl:ruleRemoveById=941100,ctl:ruleRemoveById=942100"
Dengan taktik di atas, server kita tetap terlindungi dari serangan siber tanpa merusak fungsionalitas normal aplikasi web kita.
ngx_http_geoip2_module: Geolokasi Terintegrasi #
Modul ngx_http_geoip2_module mencocokkan IP address klien dengan database geolokasi MaxMind GeoIP2 (format .mmdb) untuk mendeteksi asal negara, kota, nama ISP, atau koordinat geografis klien.
Kita bisa memanfaatkan data geolokasi ini untuk mengalihkan bahasa situs web secara otomatis, melakukan regional routing ke upstream terdekat, atau memblokir lalu lintas dari negara-negara dengan tingkat serangan siber tinggi.
Konfigurasi Pembatasan Akses Negara #
# Muat modul GeoIP2
load_module modules/ngx_http_geoip2_module.so;
http {
# Daftarkan database MaxMind Country MMDB
geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb {
auto_reload 5m; # Cek berkas database setiap 5 menit untuk update otomatis
$geoip2_country_code country iso_code;
}
# Blokir akses dari negara tertentu (contoh: CN dan RU)
map $geoip2_country_code $access_allowed {
default 1; # Izinkan semua negara
CN 0; # Blokir Tiongkok
RU 0; # Blokir Rusia
}
server {
listen 443 ssl;
server_name core-api.unisbadri.com;
location / {
if ($access_allowed = 0) {
return 403; # Kembalikan Forbidden
}
# Kirim info geolokasi ke backend utama via header HTTP
proxy_set_header X-Client-Country $geoip2_country_code;
proxy_pass http://api_backend;
}
}
}
Panduan Kompilasi Modul Pihak Ketiga Mandiri (Dynamic Module) #
Jika distribusi Linux kita tidak menyediakan paket binary siap pakai untuk modul pihak ketiga yang kita inginkan, kita harus mengompilasi modul tersebut secara mandiri dari source code.
Kunci sukses kompilasi modul tanpa perlu menimpa seluruh sistem Nginx kita yang sudah berjalan adalah dengan menggunakan flag --with-compat saat konfigurasi. Ini memastikan file shared object .so hasil kompilasi kompatibel secara biner dengan Nginx berjalan kita.
Berikut adalah diagram alur langkah-langkah kompilasi modul pihak ketiga:
flowchart TD
CheckVersion["1. Cek Versi Nginx Aktual<br/>(nginx -v)"] --> GetSource["2. Unduh Source Nginx Versi Tersebut<br/>(wget nginx.org/download/...)"]
GetSource --> GetModule["3. Klon Source Modul Pihak Ketiga<br/>(git clone & update submodules)"]
GetModule --> Configure["4. Konfigurasi Opsi Kompilasi<br/>(./configure --with-compat --add-dynamic-module=...)"]
Configure --> Compile["5. Kompilasi Modul Shared Object<br/>(make modules)"]
Compile --> Deploy["6. Salin File .so ke Nginx Modules<br/>(cp objs/*.so /etc/nginx/modules/)"]
Deploy --> LoadConfig["7. Muat Modul di nginx.conf<br/>(load_module di main context)"]
classDef default fill:#f9f9f9,stroke:#d1d5db,stroke-width:1px,color:#111827;
classDef steps fill:#eff6ff,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a;
class CheckVersion,GetSource,GetModule,Configure,Compile,Deploy,LoadConfig steps;Eksekusi Kompilasi Modul ngx_brotli Step-by-Step #
Jalankan langkah-langkah berikut di lingkungan pengujian server kita:
# Langkah 1: Catat versi Nginx berjalan kita
nginx -v
# Output contoh: nginx version: nginx/1.24.0
# Langkah 2: Instal alat pengembangan compiler
sudo apt install build-essential git libpcre3-dev zlib1g-dev libssl-dev -y
# Langkah 3: Unduh source code Nginx dengan versi yang persis sama
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzf nginx-1.24.0.tar.gz
# Langkah 4: Klon repositori source modul ngx_brotli
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init --recursive
cd ..
# Langkah 5: Masuk ke folder source Nginx dan jalankan konfigurasi kompatibilitas
cd nginx-1.24.0
./configure --with-compat --add-dynamic-module=../ngx_brotli
# Langkah 6: Jalankan kompilasi modul saja (tidak perlu install seluruh Nginx)
make modules
# Langkah 7: Salin file .so ke direktori kerja modul Nginx kita
sudo cp objs/ngx_http_brotli_filter_module.so /etc/nginx/modules/
sudo cp objs/ngx_http_brotli_static_module.so /etc/nginx/modules/
Setelah file .so tersalin, kita tinggal menambahkan direktif load_module di baris teratas file nginx.conf kita untuk mengaktifkan modul tersebut secara dinamis.
[NEW] ngx_pagespeed: Optimasi Aset Front-End Otomatis #
Modul ngx_pagespeed dikembangkan oleh Google untuk mengotomatisasi praktik terbaik optimasi aset front-end langsung di sisi server. Beberapa optimasi otomatis yang dijalankan oleh modul ini meliputi:
- Mengompresi dan mengonversi format gambar biasa (JPEG/PNG) menjadi WebP secara dinamis.
- Menggabungkan (concatenation) dan meminimalkan (minify) ukuran file CSS dan JavaScript.
- Melakukan inline terhadap CSS kritis (critical CSS) untuk menghindari render-blocking resources.
Kapan Harus Menggunakan ngx_pagespeed? #
Modul ini sangat bermanfaat untuk situs web tradisional berbasis CMS (seperti WordPress, Drupal, atau server PHP lama) yang aset-asetnya tidak dioptimalkan secara baik di level pengembangan.
Namun, jika kita menggunakan kerangka kerja frontend modern (seperti React, Vue, Next.js, atau Vite) yang alur build-nya sudah mengoptimalkan dan mengompresi aset secara maksimal sebelum di-deploy, menggunakan ngx_pagespeed menjadi kurang disarankan karena modul ini memakan resource CPU dan RAM server yang sangat besar untuk kalkulasi dinamis.
Ringkasan dan Praktik Terbaik #
- Gunakan –with-compat untuk Portabilitas: Jangan pernah melewatkan flag
--with-compatsaat mengompilasi modul mandiri. Tanpa flag ini, modul kita dijamin akan ditolak oleh Nginx berjalan karena masalah inkonsistensi struktur data memori.- Uji WAF Secara Bertahap: Jangan langsung menyalakan pemblokiran aktif pada ModSecurity WAF. Jalankan mode
DetectionOnlyterlebih dahulu untuk menyaring anomali request klien sah agar situs kita tidak mengalami downtime fungsional.- Perbarui Database GeoIP2 Berkala: Data IP address di dunia selalu berubah secara dinamis. Buat cron job bulanan untuk mengunduh database
.mmdbterbaru dari MaxMind agar penapisan lokasi kita tetap akurat.- Prioritaskan Brotli untuk Aset Teks: Aktifkan Brotli pada server aset statis. Penghematan ukuran payload sebesar 20% dibandingkan gzip sangat berdampak pada skor optimasi Core Web Vitals (LCP) situs web kita.
← Sebelumnya: Lua dan OpenResty Berikutnya: Dynamic Module →