Tools Diagnostik

Tools Diagnostik #

Mendiagnosis masalah Nginx yang efektif membutuhkan tools yang tepat. Beberapa tools ini sudah ada di setiap server Linux, beberapa perlu diinstal. Mengenal kegunaan masing-masing dan kapan menggunakannya adalah skill yang tidak kalah penting dari memahami konfigurasi Nginx itu sendiri.

curl: Swiss Army Knife HTTP #

curl adalah tool pertama yang harus kamu gunakan saat ada masalah:

# Request dasar dengan verbose output
curl -v https://example.com/

# Lihat hanya response headers
curl -I https://example.com/

# Test dengan Host header berbeda (tanpa DNS)
curl -H "Host: example.com" http://YOUR_SERVER_IP/

# Test dengan SNI untuk virtual host HTTPS
curl --resolve example.com:443:YOUR_SERVER_IP https://example.com/

# Ikuti redirect
curl -L https://example.com/old-path

# Kirim POST dengan JSON body
curl -X POST https://example.com/api/data \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer TOKEN" \
    -d '{"key": "value"}' \
    -v

# Ukur response time (useful untuk benchmark sederhana)
curl -o /dev/null -s -w \
    "dns: %{time_namelookup}s\nconnect: %{time_connect}s\nssl: %{time_appconnect}s\nttfb: %{time_starttransfer}s\ntotal: %{time_total}s\n" \
    https://example.com/

# Skip verifikasi SSL (untuk self-signed cert)
curl -k https://example.com/

# Simpan response ke file
curl -o response.html https://example.com/

openssl s_client: Debug SSL/TLS #

Untuk masalah SSL yang lebih detail dari yang bisa dilihat dengan curl:

# Koneksi SSL dasar dan lihat sertifikat
echo | openssl s_client -connect example.com:443 2>/dev/null | \
    openssl x509 -noout -text | grep -E "Subject:|Issuer:|Not After:|DNS:"

# Test protokol TLS yang digunakan
echo | openssl s_client -connect example.com:443 -tls1_2 2>&1 | \
    grep -E "Protocol|Cipher"

# Test TLS 1.3
echo | openssl s_client -connect example.com:443 -tls1_3 2>&1 | \
    grep -E "Protocol|Cipher"

# Cek expired date sertifikat
echo | openssl s_client -connect example.com:443 2>/dev/null | \
    openssl x509 -noout -dates

# Test dengan SNI (untuk virtual host)
echo | openssl s_client -connect YOUR_IP:443 -servername example.com 2>/dev/null | \
    openssl x509 -noout -subject

# Verifikasi chain sertifikat
echo | openssl s_client -connect example.com:443 -showcerts 2>/dev/null | \
    grep -E "^(subject|issuer)="

ss dan netstat: Inspeksi Koneksi #

# Lihat semua port yang di-listen
sudo ss -tlnp

# Lihat koneksi ke port Nginx
sudo ss -tn | grep ':80\|:443'

# Hitung state koneksi
sudo ss -tn | grep ':443' | awk '{print $1}' | sort | uniq -c

# Banyak TIME_WAIT = koneksi tanpa keepalive (normal tapi bisa dioptimalkan)
# Banyak CLOSE_WAIT = aplikasi tidak menutup koneksi dengan benar
# Banyak ESTABLISHED = koneksi aktif saat ini

# Lihat koneksi ke backend Node.js
sudo ss -tn | grep ':3000'

# Detail per proses
sudo ss -tnp | grep nginx

strace: Debug Syscall Level Rendah #

Untuk masalah yang sulit didiagnosis dengan tools biasa — permission errors, file access, socket issues:

# Trace syscall Nginx worker process
sudo strace -p $(pgrep -x nginx | tail -1) -e trace=file,network 2>&1 | head -50

# Trace saat menangani request (filter untuk akses file)
sudo strace -p $(pgrep -x nginx | tail -1) -e trace=open,read,write,close 2>&1

# Simpan ke file untuk analisis
sudo strace -p $(pgrep -x nginx | tail -1) -o /tmp/nginx_strace.txt &
# Buat request
# Kill strace
# Analisis: grep "EACCES\|ENOENT\|ECONNREFUSED" /tmp/nginx_strace.txt

strace memberikan visibilitas ke level sistem operasi — terlihat file apa yang dibuka, koneksi apa yang dilakukan, dan apa yang gagal di level syscall.


ab dan wrk: Load Testing #

Sebelum men-deploy konfigurasi baru ke production, test performanya:

# Apache Benchmark (ab) — sudah ada di banyak sistem
sudo apt install apache2-utils -y

# 1000 request, 10 concurrent
ab -n 1000 -c 10 https://example.com/

# Dengan keep-alive
ab -n 1000 -c 10 -k https://example.com/

# Output penting:
# Requests per second: 847.23 [#/sec]
# Time per request: 11.800 [ms] (mean)
# Transfer rate: 1234.56 [Kbytes/sec]
# wrk — lebih modern dan akurat
sudo apt install wrk -y

# 30 detik test, 4 thread, 100 koneksi
wrk -t4 -c100 -d30s https://example.com/

# Dengan custom header dan method
wrk -t4 -c100 -d30s \
    -H "Authorization: Bearer TOKEN" \
    https://example.com/api/endpoint

GoAccess: Analisis Log Real-Time #

GoAccess membuat laporan visual dari log Nginx — baik di terminal maupun sebagai HTML report:

# Install
sudo apt install goaccess -y

# Analisis log di terminal (real-time)
sudo goaccess /var/log/nginx/access.log \
    --log-format=COMBINED \
    --real-time-html \
    -o /var/www/html/report.html

# Generate HTML report sekali jalan
sudo goaccess /var/log/nginx/access.log \
    --log-format=COMBINED \
    -o /tmp/report.html

# Analisis log yang sudah dikompres
zcat /var/log/nginx/access.log.*.gz | \
    sudo goaccess - --log-format=COMBINED -o /tmp/report.html

GoAccess menampilkan: top visitor IPs, most requested URLs, response codes distribution, bandwidth, referrers, dan user agents — semuanya dari file log yang sudah ada tanpa perlu setup database.


Prometheus + nginx-prometheus-exporter: Monitoring Berkelanjutan #

Untuk production, monitoring satu kali dengan tools di atas tidak cukup — kamu butuh metrics yang berkelanjutan:

# Install nginx-prometheus-exporter
# (ia membaca dari stub_status dan expose sebagai Prometheus metrics)
docker run -d \
    -p 9113:9113 \
    nginx/nginx-prometheus-exporter:latest \
    -nginx.scrape-uri=http://localhost:8080/nginx_status
# prometheus.yml — tambahkan scrape config
scrape_configs:
  - job_name: 'nginx'
    static_configs:
      - targets: ['localhost:9113']

Metrics yang tersedia: nginx_connections_active, nginx_connections_waiting, nginx_http_requests_total. Visualisasikan di Grafana dengan dashboard Nginx yang sudah tersedia di grafana.com/grafana/dashboards.


Checklist Diagnostik Cepat #

# 1. Nginx berjalan?
sudo systemctl status nginx

# 2. Konfigurasi valid?
sudo nginx -t

# 3. Port listen?
sudo ss -tlnp | grep nginx

# 4. Error terbaru di log?
sudo tail -20 /var/log/nginx/error.log

# 5. Backend bisa dihubungi?
curl -v http://localhost:3000/health

# 6. Request sampai ke Nginx?
sudo tail -f /var/log/nginx/access.log
# Buat request dari browser/curl, lihat apakah muncul di log

# 7. DNS resolve dengan benar?
dig +short example.com

# 8. Firewall memblokir?
sudo iptables -L -n | grep -E "80|443"
# atau
sudo ufw status

Ringkasan #

  • curl -v adalah langkah pertama untuk setiap masalah HTTP — tampilkan seluruh request/response cycle termasuk headers.
  • openssl s_client untuk masalah SSL yang lebih detail — cek chain sertifikat, tanggal expiry, dan protokol yang digunakan.
  • ss -tn | awk '{print $1}' | uniq -c untuk melihat distribusi state koneksi — banyak TIME_WAIT atau CLOSE_WAIT bisa mengindikasikan masalah.
  • ab atau wrk untuk load test sederhana sebelum deployment ke production.
  • GoAccess untuk analisis log cepat tanpa setup infrastruktur — bisa generate HTML report dari log yang sudah ada.

← Sebelumnya: Debug Konfigurasi   Berikutnya: Best Practices →

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