Modul Pihak Ketiga

Modul Pihak Ketiga #

Ekosistem modul pihak ketiga Nginx sangat kaya. Ada ratusan modul yang dikembangkan komunitas untuk berbagai keperluan. Section ini membahas yang paling sering digunakan dan memberikan nilai nyata di production.

ngx_brotli: Kompresi Brotli #

Brotli adalah algoritma kompresi Google yang menghasilkan ukuran file 15-25% lebih kecil dari gzip untuk konten web. Semua browser modern mendukungnya.

# Instalasi di Ubuntu dengan paket yang tersedia
sudo apt install libnginx-mod-http-brotli -y   # Tersedia di beberapa distro

# Atau kompilasi sebagai dynamic module (lihat bagian kompilasi di bawah)
# Di /etc/nginx/nginx.conf
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

http {
    brotli on;
    brotli_comp_level 6;
    brotli_static on;   # Sajikan file .br yang sudah ada
    brotli_types
        text/html
        text/css
        application/javascript
        application/json
        image/svg+xml;

    # Bisa berjalan bersamaan dengan gzip
    # Browser modern akan memilih brotli (lebih baik)
    gzip on;
    gzip_types text/html text/css application/javascript;
}

headers-more-nginx-module: Kontrol Header Penuh #

Modul bawaan Nginx hanya bisa menambah (add_header) atau menyembunyikan (proxy_hide_header) header. headers-more memungkinkan mengganti, menghapus, atau menset header dengan lebih fleksibel:

sudo apt install libnginx-mod-http-headers-more-filter -y
load_module modules/ngx_http_headers_more_filter_module.so;

http {
    # Ubah header Server (default: "nginx" atau "nginx/1.x.x")
    more_set_headers "Server: myapp";

    server {
        # Hapus header yang mengekspos teknologi backend
        more_clear_headers "X-Powered-By";
        more_clear_headers "X-AspNet-Version";

        # Set header hanya untuk response tertentu
        location /api/ {
            more_set_headers "Access-Control-Allow-Origin: *";
            more_set_headers "Access-Control-Allow-Methods: GET, POST, OPTIONS";
        }

        # Ganti header yang sudah ada (bukan tambah)
        more_set_headers -t "text/html" "Cache-Control: no-store";
    }
}

more_set_headers mengganti header yang sudah ada jika namanya sama, sedangkan add_header bawaan Nginx menambahkan header baru tanpa menghapus yang lama — yang bisa menghasilkan header duplikat.


nginx-module-vts: Monitoring Traffic per Virtual Host #

Virtual Host Traffic Status memberikan metrics yang jauh lebih detail dari stub_status — per virtual host, per upstream server, per zone cache:

# Kompilasi atau gunakan paket yang tersedia di beberapa distro
# Tersedia juga sebagai dynamic module di beberapa distribusi Nginx
http {
    vhost_traffic_status_zone;

    server {
        # Dashboard monitoring
        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
            allow 10.0.0.0/8;
            deny all;
        }
    }
}

Dashboard menampilkan: requests per second, bytes per second, response time rata-rata, dan status code breakdown — semua per server name dan per upstream. Format JSON juga tersedia untuk integrasi dengan Prometheus atau Grafana.


ModSecurity: Web Application Firewall #

ModSecurity adalah WAF (Web Application Firewall) yang bisa diintegrasikan ke Nginx untuk memfilter serangan web umum (SQL injection, XSS, path traversal, dll.) berdasarkan rule set OWASP Core Rule Set:

# Install connector ModSecurity untuk Nginx
sudo apt install libmodsecurity3 libnginx-mod-security2 -y
load_module modules/ngx_http_modsecurity_module.so;

http {
    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsec/main.conf;

    server {
        location / {
            proxy_pass http://backend;
        }
    }
}
# /etc/nginx/modsec/main.conf
Include /etc/nginx/modsec/modsecurity.conf
Include /usr/share/modsecurity-crs/crs-setup.conf
Include /usr/share/modsecurity-crs/rules/*.conf

ModSecurity bisa berjalan dalam dua mode: DetectionOnly (log tapi tidak blokir — bagus untuk audit awal) dan On (blokir request yang melanggar rule). Mulai dengan DetectionOnly, evaluasi false positive, lalu switch ke enforcement mode.


ngx_http_geoip2_module: Geolocation #

Memungkinkan keputusan routing atau pembatasan akses berdasarkan negara/kota, menggunakan database MaxMind GeoLite2:

sudo apt install libnginx-mod-http-geoip2 mmdb-bin -y
# Download database gratis (butuh akun MaxMind)
# https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
load_module modules/ngx_http_geoip2_module.so;

http {
    geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb {
        $geoip2_country_code country iso_code;
    }

    geoip2 /etc/nginx/geoip/GeoLite2-City.mmdb {
        $geoip2_city city names en;
    }

    server {
        # Blokir akses dari negara tertentu
        map $geoip2_country_code $allowed_country {
            default     1;
            CN          0;   # Blokir Tiongkok
            RU          0;   # Blokir Rusia
        }

        location / {
            if ($allowed_country = 0) {
                return 403;
            }

            # Teruskan info negara ke backend
            proxy_set_header X-Country-Code $geoip2_country_code;
            proxy_set_header X-City $geoip2_city;

            proxy_pass http://backend;
        }
    }
}

Mengkompilasi Modul dari Source #

Jika modul tidak tersedia sebagai paket binary, kamu perlu mengkompilasi sendiri:

# 1. Cek versi Nginx yang sedang berjalan
nginx -v
# nginx version: nginx/1.24.0

# 2. Download source Nginx versi yang sama
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar xzf nginx-1.24.0.tar.gz

# 3. Download source modul yang ingin dikompilasi
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli && git submodule update --init

# 4. Kompilasi sebagai dynamic module
cd nginx-1.24.0
./configure \
    --with-compat \           # Penting: kompatibel dengan binary Nginx yang ada
    --add-dynamic-module=../ngx_brotli
make modules

# 5. Copy .so ke direktori module Nginx
sudo cp objs/ngx_http_brotli_filter_module.so /etc/nginx/modules/
sudo cp objs/ngx_http_brotli_static_module.so /etc/nginx/modules/

# 6. Load module di nginx.conf
echo 'load_module modules/ngx_http_brotli_filter_module.so;' | \
    sudo tee -a /etc/nginx/nginx.conf

Ringkasan #

  • ngx_brotli memberikan kompresi 15-25% lebih baik dari gzip — bisa berjalan bersamaan dengan gzip, browser pilih yang terbaik.
  • headers-more lebih powerful dari add_header bawaan — bisa mengganti header yang sudah ada dan menghapus header backend yang mengekspos info sensitif.
  • ModSecurity + OWASP CRS menyediakan proteksi WAF untuk serangan web umum — mulai dengan mode DetectionOnly untuk evaluasi false positive.
  • GeoIP2 memungkinkan routing dan pembatasan akses berdasarkan negara — butuh database MaxMind yang diperbarui secara berkala.
  • Saat mengkompilasi modul dari source, selalu gunakan --with-compat dan source Nginx dengan versi yang persis sama dengan yang berjalan.

← Sebelumnya: Lua dan OpenResty   Berikutnya: Dynamic Module →

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