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 -vadalah langkah pertama untuk setiap masalah HTTP — tampilkan seluruh request/response cycle termasuk headers.openssl s_clientuntuk masalah SSL yang lebih detail — cek chain sertifikat, tanggal expiry, dan protokol yang digunakan.ss -tn | awk '{print $1}' | uniq -cuntuk melihat distribusi state koneksi — banyakTIME_WAITatauCLOSE_WAITbisa mengindikasikan masalah.abatauwrkuntuk 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 →