Apache mod_status ile Sunucu Durumu İzleme

Sunucunu kör kör parmağım gözüne yönetmek zorunda değilsin. Apache’nin yerleşik mod_status modülü, web sunucunun içinde neler döndüğünü gerçek zamanlı olarak görmen için güçlü ve hafif bir araç sunar. Özellikle “sunucu neden bu kadar yavaşladı?” veya “şu an kaç aktif bağlantı var?” gibi sorularla boğuşan sysadmin’ler için mod_status ilk başvurulacak yerdir.

mod_status Nedir ve Ne İşe Yarar?

mod_status, Apache HTTP Server’ın standart dağıtımıyla birlikte gelen bir modüldür. Etkinleştirildiğinde, belirli bir URL üzerinden sunucunun anlık durumunu HTML veya düz metin formatında sunar. Bu durum sayfasında şunları görebilirsin:

  • Toplam aktif ve bekleme durumundaki worker sayısı
  • Sunucu uptime bilgisi
  • Saniyede işlenen istek sayısı (requests/sec)
  • Saniyede aktarılan veri miktarı (bytes/sec)
  • Her bir worker’ın şu an ne iş yaptığı
  • CPU kullanımı (ExtendedStatus etkinleştirilmişse)
  • İşlenen toplam istek sayısı
  • Anlık bağlantı detayları ve istemci IP’leri

Bu bilgiler, performans sorunlarını teşhis etmek, kapasite planlaması yapmak ve sunucunun genel sağlığını takip etmek için son derece değerlidir.

mod_status Etkinleştirme

Debian/Ubuntu Sistemlerde

Debian tabanlı sistemlerde mod_status genellikle kurulu gelir ama etkin olmayabilir. Etkinleştirmek için:

sudo a2enmod status
sudo systemctl restart apache2

Modülün aktif olup olmadığını doğrulamak için:

apache2ctl -M | grep status

Çıktıda status_module (shared) görüyorsan her şey yolunda demektir.

RHEL/CentOS/AlmaLinux Sistemlerde

Red Hat tabanlı sistemlerde mod_status genellikle httpd paketi içinde gelir ve /etc/httpd/conf.modules.d/00-base.conf dosyasında tanımlıdır. Aktif olup olmadığını kontrol et:

grep -i "mod_status" /etc/httpd/conf.modules.d/00-base.conf

Yorum satırı değilse zaten yüklüdür. httpd’yi yeniden başlatmak yeterli olacaktır:

sudo systemctl restart httpd

Temel Yapılandırma

mod_status‘u yapılandırmak için Apache’nin ana yapılandırma dosyasını veya ayrı bir conf dosyasını kullanabilirsin. Genellikle /etc/apache2/mods-enabled/status.conf (Debian) veya doğrudan httpd.conf (RHEL) üzerinde çalışılır.

En basit çalışan yapılandırma şöyle görünür:

# /etc/apache2/conf-available/server-status.conf

<Location "/server-status">
    SetHandler server-status
    Require local
</Location>

ExtendedStatus On

Bu yapılandırmayı etkinleştirmek için:

sudo a2enconf server-status
sudo systemctl reload apache2

Şimdi http://localhost/server-status adresine gittiğinde sunucu durumunu görebilirsin.

ExtendedStatus Neden Önemli?

ExtendedStatus On direktifi, her worker için CPU kullanımı, işlenen istek sayısı ve aktarılan veri gibi ek istatistikleri toplar. Performans açısından çok küçük bir yük getirir ama verdiği bilgi miktarı bu yükü fazlasıyla karşılar. Production sunucularda bile açık bırakmak mantıklıdır.

Güvenlik Yapılandırması

Bu noktada çok dikkatli olmak gerekiyor. /server-status sayfası açık kalırsa, dünyanın her yerinden biri senin sunucu iç yapını, işlenen URL’leri ve client IP’lerini görebilir. Bu ciddi bir güvenlik açığıdır.

IP Bazlı Kısıtlama

Sadece belirli IP’lerden erişime izin ver:

<Location "/server-status">
    SetHandler server-status
    Require ip 127.0.0.1
    Require ip 192.168.1.0/24
    Require ip 10.0.0.50
</Location>

ExtendedStatus On

Şifre Koruması ile Güvenli Erişim

Eğer VPN veya yerel ağ dışından erişmen gerekiyorsa, temel HTTP kimlik doğrulaması ekleyebilirsin:

# Önce htpasswd dosyasını oluştur
sudo htpasswd -c /etc/apache2/.htpasswd-status admin
<Location "/server-status">
    SetHandler server-status
    AuthType Basic
    AuthName "Server Status"
    AuthUserFile /etc/apache2/.htpasswd-status
    Require valid-user
    # Ayrıca IP kısıtlaması da ekle
    Require ip 192.168.1.0/24
</Location>

ExtendedStatus On

Farklı Bir URL Kullanmak

Güvenlik açısından /server-status yerine tahmin edilmesi zor bir URL kullanmak iyi bir pratiktir:

<Location "/x7k2-internal-monitoring-status">
    SetHandler server-status
    Require local
</Location>

Bu “security through obscurity” pratiği tek başına yeterli değil ama ek bir katman sağlar.

Durum Sayfasını Okumak

http://localhost/server-status adresine gittiğinde karmaşık görünebilir. Önemli bölümleri inceleyelim.

Worker Durum Tablosu

Sayfanın alt kısmında her worker için tek karakterli bir durum göstergesi görürsün. Bu karakterlerin anlamları:

  • _: Boşta bekliyor (Waiting for Connection)
  • S: Yeni bağlantı başlatıyor (Starting Up)
  • R: İstek okuyor (Reading Request)
  • W: Yanıt gönderiyor (Sending Reply)
  • K: Keepalive bağlantısı bekliyor (Keepalive)
  • D: DNS sorgulama (DNS Lookup)
  • C: Bağlantı kapatıyor (Closing Connection)
  • L: Log yazıyor (Logging)
  • G: Güvenli kapanış bekliyor (Gracefully Finishing)
  • I: Boş worker (Idle Cleanup of Worker)
  • .: Açık olmayan slot (Open Slot with No Current Process)

Eğer sayfada çok sayıda W görüyorsan sunucu yanıt göndermekle meşgul demektir. Çok sayıda R varsa istek okuma aşamasında tıkanma yaşanıyor olabilir. K karakterleri keepalive bağlantılarını temsil eder ve çok fazlası worker’ları meşgul tutabilir.

Düz Metin Formatı

Betiklerle işlemek için ?auto parametresini kullanabilirsin:

curl -s http://localhost/server-status?auto

Çıktı şöyle görünür:

Total Accesses: 458291
Total kBytes: 1284902
CPULoad: .0123456
Uptime: 86400
ReqPerSec: 5.304
BytesPerSec: 15232.1
BytesPerReq: 2871.6
BusyWorkers: 12
IdleWorkers: 38
Scoreboard: ____W____K__R_W...

Bu format, monitoring araçları ve betiklerle entegrasyon için idealdir.

Gerçek Dünya Senaryosu: Yavaşlayan Sunucu Tespiti

Bir gece saat 02:30’da monitöring sistemin alarm verdi, web sitesi yavaşlamış. SSH ile sunucuya bağlandın, ilk refleksin server-status‘a bakmak olmalı:

# Hızlı durum kontrolü
curl -s http://localhost/server-status?auto | grep -E "BusyWorkers|IdleWorkers|ReqPerSec"

Çıktıda şunu gördün:

BusyWorkers: 150
IdleWorkers: 0
ReqPerSec: 0.5

150 meşgul worker ve sıfır idle worker: bu klasik bir worker pool tükenmesi senaryosu. Sunucu istek kabul ediyor ama işleyemiyor. Şimdi hangi URL’lerin tıkandığını görmek için:

curl -s http://localhost/server-status | grep "request" | head -20

Buradan hangi endpoint’in yığılmaya yol açtığını görebilir, log dosyalarına yönlenebilirsin.

Gerçek Dünya Senaryosu: Otomatik İzleme Betiği

Sadece elle kontrol etmek yerine, server-status çıktısını düzenli aralıklarla parse eden ve eşik değer aşıldığında uyarı gönderen bir betik yaz:

#!/bin/bash
# /usr/local/bin/apache-status-check.sh

STATUS_URL="http://localhost/server-status?auto"
ALERT_EMAIL="[email protected]"
BUSY_THRESHOLD=80
LOG_FILE="/var/log/apache-status.log"

# Değerleri çek
BUSY=$(curl -s "$STATUS_URL" | grep "BusyWorkers" | awk '{print $2}')
IDLE=$(curl -s "$STATUS_URL" | grep "IdleWorkers" | awk '{print $2}')
RPS=$(curl -s "$STATUS_URL" | grep "ReqPerSec" | awk '{print $2}')

# Log yaz
echo "$(date '+%Y-%m-%d %H:%M:%S') - Busy: $BUSY, Idle: $IDLE, RPS: $RPS" >> "$LOG_FILE"

# Eşik kontrolü
if [ -z "$BUSY" ]; then
    echo "HATA: server-status erişilemiyor!" | mail -s "Apache Status HATA" "$ALERT_EMAIL"
    exit 1
fi

if [ "$BUSY" -gt "$BUSY_THRESHOLD" ]; then
    MESAJ="UYARI: Apache busy worker sayisi yuksek!nBusy: $BUSYnIdle: $IDLEnRPS: $RPSnZaman: $(date)"
    echo -e "$MESAJ" | mail -s "Apache Yuksek Yuk Uyarisi" "$ALERT_EMAIL"
fi

echo "Durum: Busy=$BUSY, Idle=$IDLE, RPS=$RPS"

Bu betiği cron’a ekle:

# Her 5 dakikada bir çalıştır
*/5 * * * * /usr/local/bin/apache-status-check.sh

Prometheus ile Entegrasyon

Modern altyapılarda mod_status verilerini Prometheus’a aktarmak için apache_exporter kullanabilirsin:

# apache_exporter'ı indir
wget https://github.com/Lusitaniae/apache_exporter/releases/latest/download/apache_exporter-linux-amd64.tar.gz
tar xzf apache_exporter-linux-amd64.tar.gz
sudo mv apache_exporter /usr/local/bin/

# Servis dosyasını oluştur
sudo tee /etc/systemd/system/apache_exporter.service > /dev/null <<EOF
[Unit]
Description=Apache Exporter for Prometheus
After=network.target

[Service]
Type=simple
User=www-data
ExecStart=/usr/local/bin/apache_exporter 
  --scrape_uri=http://localhost/server-status?auto 
  --telemetry.address=:9117
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now apache_exporter

Artık Prometheus’un prometheus.yml dosyasına şu satırları ekleyebilirsin:

# /etc/prometheus/prometheus.yml içine eklenecek bölüm
scrape_configs:
  - job_name: 'apache'
    static_configs:
      - targets: ['localhost:9117']
    scrape_interval: 15s

Bu sayede Grafana dashboard’larında Apache worker kullanımı, requests/sec ve diğer metrikleri güzel grafikler halinde izleyebilirsin.

Virtual Host Bazlı İzleme

Birden fazla virtual host çalıştırıyorsan ve her biri için ayrı izleme sayfası istersan:

<VirtualHost *:80>
    ServerName admin.sirket.com
    
    <Location "/apache-status">
        SetHandler server-status
        Require ip 10.0.0.0/8
        Require ip 192.168.0.0/16
    </Location>
    
    # Bu virtual host'a erişimi logla
    CustomLog /var/log/apache2/admin-access.log combined
    ErrorLog /var/log/apache2/admin-error.log
</VirtualHost>

ExtendedStatus On

mod_status ile mod_info Kombinasyonu

mod_status‘ın yanı sıra mod_info modülünü de etkinleştirirsen, çalışan Apache yapılandırmasını ve yüklü modülleri web üzerinden görebilirsin. Bunları birlikte yapılandırmak mantıklıdır:

# mod_info'yu etkinleştir
sudo a2enmod info

# Yapılandırma dosyasına ekle
sudo tee /etc/apache2/conf-available/server-info.conf > /dev/null <<EOF
<Location "/server-info">
    SetHandler server-info
    Require ip 127.0.0.1
    Require ip 192.168.1.0/24
</Location>
EOF

sudo a2enconf server-info
sudo systemctl reload apache2

/server-info sayfasında Apache sürümü, derleme parametreleri ve her modülün yapılandırmasını görebilirsin. Bu sayfayı daha da kısıtlı tut çünkü yapılandırma detayları güvenlik açısından hassastır.

Performans Tuning için mod_status Kullanımı

mod_status verileri, mpm_prefork veya mpm_worker ayarlarını optimize etmek için doğrudan kullanılabilir.

Diyelim ki gün içinde periyodik olarak server-status?auto çıktısını kaydettin ve analiz ettin:

# 10 dakikada bir veri topla
*/10 * * * * curl -s http://localhost/server-status?auto >> /var/log/apache-metrics.log

Bu verileri analiz ederek peak saatlerde kaç worker’ın kullanıldığını görebilir, MaxRequestWorkers değerini buna göre ayarlayabilirsin. Eğer idle worker sayısı sürekli 100’ün üzerindeyse MaxRequestWorkers değerini düşürerek bellek tasarrufu yapabilirsin. Tersine, idle worker sayısı çok düşük kalıyorsa ve CPU/RAM izin veriyorsa değeri artırabilirsin.

mpm_prefork Örnek Ayarı

# /etc/apache2/mods-available/mpm_prefork.conf

<IfModule mpm_prefork_module>
    StartServers            5
    MinSpareServers         5
    MaxSpareServers         10
    MaxRequestWorkers       150
    MaxConnectionsPerChild  0
</IfModule>

mod_status verilerine bakarak MaxRequestWorkers değerinin yeterli olup olmadığını anlayabilirsin. Eğer BusyWorkers değeri MaxRequestWorkers’a sürekli yaklaşıyorsa limiti artırman gerekiyor demektir.

Yaygın Hatalar ve Çözümleri

403 Forbidden hatası alıyorum: Require direktifini kontrol et. Apache 2.4’te Allow from yerine Require ip kullanılıyor. Eski yapılandırmalar kopyalandıysa sözdizimi hatası olabilir.

Sayfa boş geliyor: ExtendedStatus On direktifinin server-level’da tanımlandığından emin ol, VirtualHost bloğunun içine değil.

curl ile bağlanamıyorum: Eğer localhost üzerinden bağlanıyorsan ve IPv6 aktifse, Apache sadece IPv4’te dinliyor olabilir. 127.0.0.1 yerine ::1 de eklemeyi dene.

server-status URL’i çalışmıyor ama 404 veriyor: SetHandler server-status satırının doğru bloğu içinde olduğunu ve yapılandırmanın reload edildiğini doğrula:

sudo apache2ctl configtest && sudo systemctl reload apache2

Sonuç

mod_status, Apache yöneticisinin araç çantasında mutlaka bulunması gereken bir özelliktir. Kurulumu ve yapılandırması 10 dakikayı geçmez ama sağladığı görünürlük çok değerlidir. Özellikle yüksek trafikli veya karmaşık yapılandırmalara sahip sunucularda gerçek zamanlı worker durumunu görmek, sorun tespitini kör tahmin yapmaktan çıkarıp somut veri analizine taşır.

Yapılandırma yaparken güvenliği hiç ihmal etme. IP kısıtlaması olmadan açılan bir server-status sayfası hem bilgi sızdırır hem de kötü niyetli kişilere altyapı hakkında bilgi verir. En az Require local veya IP bazlı kısıtlama her zaman şart.

Son olarak, mod_status‘u yalnızca sorun çıktığında değil, proaktif bir şekilde kullan. Prometheus/Grafana entegrasyonu veya basit bir bash betiğiyle düzenli veri toplamak, kapasitesi dolmadan önce seni uyaracak ve sunucunun davranış profilini anlamana yardımcı olacaktır. İzlemediğin şeyi yönetemezsin.

Yorum yapın