Zabbix’te Hazır Template ile Nginx İzleme
Üretim ortamında Nginx’in ne zaman tökezlediğini, ne zaman sınıra dayandığını anlamak için ölçüm yapmak şart. Zabbix bu konuda oldukça olgun bir ekosisteme sahip ve Nginx için hazır template kullanmak, sıfırdan metrik yazmak yerine dakikalar içinde kapsamlı izlemeye geçmenizi sağlıyor. Bu yazıda Zabbix’in resmi Nginx template’ini production ortamında nasıl kurduğumu, hangi noktaları atlamadan geçmeniz gerektiğini ve gerçek senaryolarda nasıl davranışlar gördüğümü anlatacağım.
Başlamadan Önce: Neye İhtiyacımız Var?
Önce ortamı netleştirelim. Bu yazıdaki adımlar şu bileşenlerle test edildi:
- Zabbix Server 6.4 (PostgreSQL backend)
- Nginx 1.24 (Ubuntu 22.04 üzerinde)
- Zabbix Agent 2 (active mod)
Zabbix Agent 2, eski Agent’a kıyasla Nginx için çok daha iyi native destek sunuyor. Eğer hâlâ Agent 1 kullanıyorsanız, bu template geçişi için güçlü bir neden olabilir.
Template nginx.status modülüne dayanıyor. Bu modül Nginx’in stub_status yönergesini açık kaynaklarla kullanıyor. Yani her şeyin kökünde bir HTTP endpoint var.
Nginx Tarafında stub_status Ayarı
İlk adım Nginx’e durum sayfasını açtırmak. Bu sayfayı sadece localhost’tan erişilebilir tutmak kritik; dışarıya açık bırakmak bilgi sızıntısına yol açar.
# /etc/nginx/conf.d/stub_status.conf dosyasını oluşturun
sudo nano /etc/nginx/conf.d/stub_status.conf
Dosya içeriği şöyle olmalı:
server {
listen 127.0.0.1:80;
server_name localhost;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
Eğer zaten 80 portunda bir default server bloğunuz varsa ve listen 127.0.0.1:80 çakışıyorsa, farklı bir port kullanabilirsiniz, örneğin 8080. Ama bunu zabbix_agentd.conf tarafında da güncellemeniz gerekir, bunu birazdan göreceğiz.
Konfig syntax’ını test edip reload yapalım:
sudo nginx -t && sudo systemctl reload nginx
Çalışıp çalışmadığını doğrulamak için:
curl http://127.0.0.1/nginx_status
Şöyle bir çıktı görmelisiniz:
Active connections: 43
server accepts handled requests
1523847 1523847 4871203
Reading: 0 Writing: 12 Waiting: 31
Bu çıktıyı anlayalım, çünkü template’in bütün metrikleri buradan geliyor:
- Active connections: Şu an açık olan toplam bağlantı sayısı
- accepts: Kabul edilen toplam bağlantı sayısı (cumulative)
- handled: İşlenen toplam bağlantı sayısı (accepts ile eşitse bağlantı kaybı yok)
- requests: Toplam istek sayısı (cumulative)
- Reading: İstek header’ı okunurken olan bağlantılar
- Writing: Yanıt yazılırken olan bağlantılar
- Waiting: Keepalive bağlantıları, yani idle
Bu altı veri noktası küçük görünebilir ama doğru şekilde yorumlandığında çok şey anlatıyor.
Zabbix Agent 2 Tarafında Yapılandırma
Zabbix Agent 2, Nginx plugin’ini gömülü olarak içeriyor. Ekstra bir şey yüklemenize gerek yok. Sadece konfig dosyasına ekleme yapmanız yeterli.
sudo nano /etc/zabbix/zabbix_agent2.d/nginx.conf
Plugins.Nginx.Status.URL=http://127.0.0.1/nginx_status
Eğer stub_status için farklı bir port kullandıysanız URL’i güncelleyin:
Plugins.Nginx.Status.URL=http://127.0.0.1:8080/nginx_status
Agent 2’yi restart edin:
sudo systemctl restart zabbix-agent2
Restart sonrası agent log’unu kontrol etmek iyi alışkanlık:
sudo tail -f /var/log/zabbix/zabbix_agent2.log
Hata yoksa ve agent başarıyla başladıysa devam edebiliriz. Agent tarafında her şey hazır; şimdi Zabbix Server’da template atamasına geçiyoruz.
Zabbix Server’da Template Atama
Zabbix 6.x ile birlikte resmi template’ler kurulum paketinin içinde geliyor. Ayrıca import etmenize gerek yok. Configuration > Templates yolunu takip edin ve arama kutusuna “nginx” yazın. Nginx by Zabbix agent 2 template’ini göreceksiniz.
Şimdi bu template’i host’a atayalım. Configuration > Hosts > ilgili host > Templates sekmesine gidin, template’i ekleyin ve Update butonuna basın. Birkaç dakika içinde item’lar veri toplamaya başlayacak.
Ama sadece atayıp geçmeyin. Template’in makrolarını inceleyin. Configuration > Templates > Nginx by Zabbix agent 2 > Macros sekmesine bakın:
- {$NGINX.STUB_STATUS.HOST}: Default olarak
localhost - {$NGINX.STUB_STATUS.PATH}: Default olarak
nginx_status - {$NGINX.STUB_STATUS.PORT}: Default olarak
80 - {$NGINX.DROP_RATE.MAX.WARN}: Dropped connection oranı için uyarı eşiği, default
1 - {$NGINX.RESPONSE_TIME.MAX.WARN}: Response time için uyarı eşiği, default
10saniye
Bu makroları template seviyesinde değil, host seviyesinde override edin. Template’i birden fazla host’ta kullanıyorsanız her host farklı bir port veya path kullanıyor olabilir.
Host’a özgü makro setlemek için Configuration > Hosts > ilgili host > Macros sekmesine gidin ve “Inherited and host macros” görünümüne geçin. Burada template’den gelen makroları override edebilirsiniz.
Veri Doğrulama: İlk Kontroller
Template atandıktan 2-3 dakika sonra Monitoring > Latest Data’ya gidin, host’unuzu filtreleyin ve nginx grubunu açın. Şu item’ların veri aldığını görmelisiniz:
Nginx: Connections accepted per secondNginx: Connections dropped per secondNginx: Connections handled per secondNginx: Active connectionsNginx: Connections idle (keepalive)Nginx: Connections readingNginx: Connections writingNginx: Requests per secondNginx: VersionNginx: Service response timeNginx: Service status
Eğer item’lar “Not supported” olarak görünüyorsa şu noktalara bakın:
# Agent'tan manuel test
zabbix_agent2 -t nginx.get
# Dönüş değeri JSON formatında olmalı
“Not supported” hatası genellikle şu nedenlerden birinden kaynaklanır: stub_status endpoint’ine ulaşılamıyor, URL yanlış konfigüre edilmiş, ya da firewall/SELinux engeli var. SELinux aktifse:
# SELinux'un nginx -> network bağlantısını engellediğini kontrol edin
sudo ausearch -m avc -ts recent | grep nginx
# Gerekirse
sudo setsebool -P httpd_can_network_connect 1
Triggerları Anlama ve Özelleştirme
Template ile gelen default triggerlar production için bazen çok hassas, bazen çok gevşek olabiliyor. Kendi ortamınıza göre bunları ayarlamanız gerekecek.
Template’in önemli triggerları:
- Nginx: Service is down:
Service statusitem’ı 0 döndürdüğünde tetiklenir. Bu en kritik trigger. - Nginx: Service response time is too high:
{$NGINX.RESPONSE_TIME.MAX.WARN}makrosunu aşınca çalışır. - Nginx: Drop rate is higher than {$NGINX.DROP_RATE.MAX.WARN}: Bağlantı drop oranı yükselince uyarır.
- Nginx: Version has changed: Nginx versiyonu değiştiğinde bildirim gönderir. Bu özellikle sürpriz upgrade’leri yakalamak için değerli.
Production’da karşılaştığım yaygın bir durum: Gece batch job’ları çalışırken Service response time is too high alarmı geliyordu. Nginx aslında sağlıklıydı, ama stub_status endpoint’inin response time’ı geçici olarak artıyordu. Bunu host makrosu ile çözdük:
Configuration > Hosts > ilgili host > Macros:
{$NGINX.RESPONSE_TIME.MAX.WARN} = 30
Default 10 saniyeden 30 saniyeye çıkarmak o ortam için yeterliydi. Ama bunu artırmak yerine neden yavaşladığını araştırmak daha doğru bir yaklaşım, makroyu artırmak geçici bir bant-yardım.
Custom Item ile Worker Process İzleme
Hazır template bir noktaya kadar yardımcı oluyor; ama Nginx’in kaç worker process çalıştırdığını izlemek istiyorsanız onu kendiniz eklemeniz gerekiyor. Bu konuyu template’e custom item ekleyerek çözebilirsiniz.
Zabbix frontend’de Configuration > Hosts > ilgili host > Items > Create item:
Name: Nginx: Worker process count
Key: proc.num[nginx,,,worker]
Type: Zabbix agent
Value type: Numeric (unsigned)
Update interval: 1m
Bu item her dakika Nginx worker process sayısını raporlar. Worker sayısının sıfıra düşmesi ciddi bir sorun işareti; buna da trigger ekleyin:
Configuration > Hosts > ilgili host > Triggers > Create trigger:
Name: Nginx: No worker processes running
Expression: last(/hostname/proc.num[nginx,,,worker])=0
Severity: High
Grafik Oluşturma: Anlamlı Dashboard
Sayılar önemli ama görsel takip çok daha hızlı yorum yapmanızı sağlıyor. Monitoring > Hosts > ilgili host > Graphs yolundan yeni grafik oluşturun.
Bağlantı durumu için güzel bir grafik:
Graph name: Nginx - Connection States
Items:
- Nginx: Active connections (line, mavi)
- Nginx: Connections idle (keepalive) (line, yeşil)
- Nginx: Connections writing (line, turuncu)
- Nginx: Connections reading (line, kırmızı)
Bu grafik üzerinde yük altındaki Nginx davranışını çok net görebilirsiniz. Waiting/idle sayısı aktif bağlantıların çok üzerinde kalıyorsa keepalive timeout değerinizi gözden geçirmeniz gerekebilir.
Request rate grafiği:
Graph name: Nginx - Request Rate
Items:
- Nginx: Requests per second (line, mavi)
- Nginx: Connections accepted per second (line, yeşil)
- Nginx: Connections dropped per second (filled region, kırmızı)
Dropped connections grafikte belirmeye başlarsa önce worker_connections limitine, sonra worker_processes ayarına bakın.
Gerçek Bir Senaryo: Keepalive Sorununun Tespiti
Bir müşteri ortamında Nginx altındaki uygulama yavaşlıyordu ve ilk bakışta neden anlamak zordu. Zabbix’te bu template kuruluydu ve grafiklere baktığımızda tuhaf bir şey gördük: Waiting connections sayısı düzenli aralıklarla fırlıyor, sonra düşüyor, tekrar fırlıyordu.
# O anki durumu görmek için
watch -n 1 'curl -s http://127.0.0.1/nginx_status'
Çıktı şöyleydi:
Active connections: 892
server accepts handled requests
8234718 8234718 11823491
Reading: 2 Writing: 45 Waiting: 845
845 waiting bağlantı ile sadece 45 writing bağlantı. Bu oran çok bozuktu. keepalive_timeout değerine baktık:
grep keepalive_timeout /etc/nginx/nginx.conf
# keepalive_timeout 75;
75 saniye çok uzundu. Bu kadar bağlantı boşta bekletiliyordu ve yeni bağlantılar için yer kalmıyordu. Değeri makul bir seviyeye çektik:
sudo nano /etc/nginx/nginx.conf
# keepalive_timeout 15;
sudo nginx -t && sudo systemctl reload nginx
Reload sonrasında Zabbix’te waiting connections grafiği hızla düştü. Uygulama performansı gözle görülür şekilde iyileşti. Template olmadan bu tespiti yapmak saatler alabilirdi.
İkinci Senaryo: Yük Testi Sırasında Drop Oranı
Bir load balancer arkasındaki Nginx node’unda yük testi yapılıyordu. Test sırasında Zabbix’ten Drop rate is higher than 1 alarmı geldi. Hemen bakalım:
# Nginx error log kontrol
sudo tail -100 /var/log/nginx/error.log | grep -i "worker_connections"
2024/01/15 14:23:11 [alert] 1234#1234: worker_connections are not enough
Klasik. worker_connections limiti dolmuş. /etc/nginx/nginx.conf kontrol:
grep -E "worker_processes|worker_connections" /etc/nginx/nginx.conf
worker_processes 2;
events {
worker_connections 1024;
}
Toplam maksimum bağlantı kapasitesi 2 x 1024 = 2048’di. Yük testi bu sınırı aşıyordu. CPU sayısına göre düzeltme:
# CPU çekirdeği sayısını öğren
nproc
# 8 çıktı
sudo nano /etc/nginx/nginx.conf
worker_processes auto;
events {
worker_connections 4096;
multi_accept on;
}
sudo nginx -t && sudo systemctl reload nginx
Zabbix’teki drop rate alarmı reload sonrası birkaç dakika içinde kapandı.
Template Güncelleme ve Versiyon Takibi
Zabbix yeni versiyonlarında template’leri güncelliyor. Eğer template’i import etmişseniz veya customize etmişseniz güncellemeleri takip etmeniz önemli.
Mevcut template versiyonunu görmek için:
# Zabbix API üzerinden template bilgisi
curl -s -X POST -H 'Content-Type: application/json'
-d '{
"jsonrpc": "2.0",
"method": "template.get",
"params": {
"output": ["name", "description"],
"filter": {"name": "Nginx by Zabbix agent 2"}
},
"auth": "YOUR_AUTH_TOKEN",
"id": 1
}'
http://your-zabbix-server/zabbix/api_jsonrpc.php
Template’i customize ettiyseniz güncellemeden önce değişikliklerinizi not alın. Güncelleme sırasında host-level değişiklikler korunur ama template-level değişiklikleriniz override edilir.
Uyarı: Çok Sayıda Host’ta Template Yönetimi
Onlarca Nginx sunucusu izliyorsanız her birini teker teker yapılandırmak zahmetli. Zabbix’in host group ve template group yapısını kullanın:
# Zabbix API ile toplu template atama örneği
curl -s -X POST -H 'Content-Type: application/json'
-d '{
"jsonrpc": "2.0",
"method": "host.massadd",
"params": {
"hosts": [
{"hostid": "10101"},
{"hostid": "10102"},
{"hostid": "10103"}
],
"templates": [
{"templateid": "NGINX_TEMPLATE_ID"}
]
},
"auth": "YOUR_AUTH_TOKEN",
"id": 1
}'
http://your-zabbix-server/zabbix/api_jsonrpc.php
Ansible kullanıyorsanız community.zabbix koleksiyonu bu işi çok daha temiz yapıyor:
# Ansible ile template atama
ansible-galaxy collection install community.zabbix
- name: Nginx template ata
community.zabbix.zabbix_host:
server_url: "http://zabbix-server/zabbix"
login_user: Admin
login_password: "{{ zabbix_password }}"
host_name: "web-server-01"
link_templates:
- "Nginx by Zabbix agent 2"
state: present
Sonuç
Zabbix’in hazır Nginx template’i, sıfırdan metrik yazmakla kıyaslandığında ciddi bir zaman tasarrufu sağlıyor. stub_status endpoint’inin kurulumu 5 dakika, template ataması 2 dakika; toplamda 10 dakikadan az sürede kapsamlı bir Nginx izleme altyapısı hazır oluyor.
Ama şunu vurgulamak istiyorum: Template size bir başlangıç noktası veriyor, bitmiş bir izleme sistemi değil. Makroları ortamınıza göre ayarlamanız, kritik triggerları gözden geçirmeniz ve worker process gibi template’in kapsamadığı metrikleri kendiniz eklemeniz gerekiyor.
Grafiklere düzenli bakmak da önemli. Alarm geldiğinde paniklememek için normal davranışı önceden bilmek lazım. Hangi saatlerde connection sayısı yükseliyor, keepalive oranı ne zaman artıyor; bunları öğrenmek ancak günlük grafiklerle oluyor.
Son olarak: handled ile accepts arasındaki fark her zaman sıfır olmalı. Bu iki değerin birbirinden ayrılması, yani drop yaşanması, her zaman acil müdahale gerektiren bir sinyal. Zabbix bu farka otomatik olarak triggerlarla tepki veriyor; siz de o triggerların doğru kişiye, doğru zamanda ulaştığından emin olun.
