Giriş: Apache Günlük Kayıtlarının Önemi
Bir Ubuntu VPS üzerinde Apache web sunucusu çalıştırırken, sunucunuzun sağlığını, performansını ve güvenliğini anlamak için günlük kayıtları (loglar) hayati öneme sahiptir. Erişim günlükleri (access logs), web sitenize gelen her isteği kaydederken; hata günlükleri (error logs), sunucu tarafında oluşan sorunları, yapılandırma hatalarını veya uygulama hatalarını gösterir. Bu günlükler, sorun giderme, performans analizi, güvenlik denetimi ve kullanıcı davranışlarını anlama gibi birçok konuda paha biçilmez bilgiler sunar.
Ancak, özellikle yüksek trafiğe sahip web sitelerinde, bu günlük dosyaları hızla büyüyebilir ve disk alanınızı tüketebilir. Büyük günlük dosyaları, disk G/Ç performansını etkileyebilir ve yönetimi zorlaştırabilir. İşte bu noktada günlük döndürme (log rotation) devreye girer. Günlük döndürme, eski günlük dosyalarını otomatik olarak arşivleyerek, sıkıştırarak veya silerek disk alanının verimli kullanılmasını sağlar ve günlük yönetimini kolaylaştırır. Bu rehberde, Apache günlük kayıtlarını nasıl yapılandıracağınızı ve logrotate aracıyla günlük döndürmeyi nasıl kuracağınızı adım adım öğreneceksiniz.
Apache Günlük Kayıtlarının Temelleri ve Yapılandırması
Apache, günlük kayıtlarını çeşitli amaçlar için kullanır. En yaygın olanları erişim günlükleri ve hata günlükleridir. Bu günlüklerin nerede saklandığını, biçimlerini ve nasıl özelleştirileceğini anlamak, etkili bir yönetim için ilk adımdır.
Günlük Dosyalarının Türleri ve Konumları
Ubuntu sistemlerinde Apache günlük dosyaları genellikle /var/log/apache2/ dizininde bulunur. Bu dizinde karşılaşacağınız başlıca dosyalar şunlardır:
* access.log: Web sunucusuna yapılan tüm başarılı ve başarısız istekleri kaydeder. IP adresleri, istek zamanları, URL’ler, HTTP durum kodları, kullanıcı aracıları (user agents) gibi bilgiler içerir.
* error.log: Apache sunucusunun kendisiyle ilgili hataları, uyarıları ve bilgilendirme mesajlarını kaydeder. PHP hataları, modül yükleme sorunları veya yapılandırma hataları gibi sorunları burada bulabilirsiniz.
Sanal sunucular (Virtual Hosts) kullanıyorsanız, her sanal sunucu için ayrı erişim ve hata günlükleri tanımlamak iyi bir uygulamadır. Bu, belirli bir web sitesine ait sorunları veya trafiği izlemeyi çok daha kolay hale getirir.
Günlük Biçimlerini Anlama ve Özelleştirme
Apache, günlük dosyalarını belirli biçimlerde yazar. Bu biçimler, LogFormat yönergesi ile tanımlanır ve CustomLog yönergesi ile kullanılır.
Varsayılan olarak, Ubuntu’daki Apache yapılandırmasında /etc/apache2/apache2.conf veya /etc/apache2/conf-available/other-vhosts-access-log.conf gibi dosyalarda aşağıdaki gibi tanımlar bulabilirsiniz:
# Ortak Günlük Biçimi (Common Log Format)
LogFormat "%h %l %u %t \"%r\" %>s %b" common
Birleşik Günlük Biçimi (Combined Log Format)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
SSL Birleşik Günlük Biçimi (SSL Combined Log Format)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x" combinedssl
Varsayılan olarak kullanılan özel günlük
CustomLog ${APACHE_LOG_DIR}/access.log combined
* LogFormat: Günlük kaydının hangi bilgileri içereceğini ve hangi sırayla yazılacağını tanımlar. Örneğin, combined biçimi, common biçimine ek olarak Referer ve User-Agent bilgilerini de içerir.
* CustomLog: Belirli bir günlük dosyasının hangi biçimi kullanacağını belirtir. ${APACHE_LOG_DIR} değişkeni, /var/log/apache2 dizinini işaret eder.
Kendi Özel Günlük Biçiminizi Oluşturma:
Daha fazla bilgiye ihtiyacınız varsa (örneğin, istek süresi, VHost adı), kendi LogFormat tanımınızı oluşturabilirsiniz. Örneğin, istek süresini eklemek için:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" custom_with_request_time
CustomLog ${APACHE_LOG_DIR}/access.log custom_with_request_time
Burada %D, isteğin milisaniye cinsinden işlenme süresini gösterir.
Sanal Sunucu Bazında Günlük Kaydı Yapılandırması
Her sanal sunucu için ayrı günlük dosyaları tutmak, yönetimi önemli ölçüde kolaylaştırır. Sanal sunucu yapılandırma dosyanızda (örneğin, /etc/apache2/sites-available/your_domain.conf), VirtualHost bloğunun içine ErrorLog ve CustomLog yönergelerini ekleyebilirsiniz:
ServerAdmin webmaster@your_domain.com
ServerName your_domain.com
ServerAlias www.your_domain.com
DocumentRoot /var/www/your_domain
# Bu sanal sunucuya özel hata günlüğü
ErrorLog ${APACHE_LOG_DIR}/your_domain_error.log
# Bu sanal sunucuya özel erişim günlüğü (combined biçimini kullanarak)
CustomLog ${APACHE_LOG_DIR}/your_domain_access.log combined
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
Bu yapılandırma, your_domain.com adresine yapılan tüm istekler için ayrı bir your_domain_access.log ve hatalar için your_domain_error.log dosyası oluşturacaktır.
Yapılandırmayı değiştirdikten sonra Apache’yi yeniden başlatmayı unutmayın:
sudo systemctl restart apache2
Hata Günlük Kayıt Düzeyleri
LogLevel yönergesi, error.log dosyasına ne kadar detaylı bilgi yazılacağını kontrol eder. Daha yüksek düzeyler daha az, daha düşük düzeyler ise daha fazla bilgi kaydeder.
Yaygın LogLevel değerleri (en azdan en çoğa):
* emerg: Sistem kullanılamaz durumda.
* alert: Acil durum, hemen harekete geçilmeli.
* crit: Kritik koşullar.
* err: Hata koşulları.
* warn: Uyarı koşulları.
* notice: Normal ama önemli koşullar.
* info: Bilgilendirici mesajlar.
* debug: Hata ayıklama mesajları (çok detaylı, üretim ortamında önerilmez).
Varsayılan olarak, Ubuntu’da LogLevel genellikle warn olarak ayarlanmıştır. Bunu /etc/apache2/apache2.conf dosyasında veya sanal sunucu yapılandırmanızda değiştirebilirsiniz:
# Daha detaylı bilgi almak için (sorun giderme sırasında faydalıdır)
LogLevel info
Daha az detaylı, üretim ortamı için
LogLevel warn
Log Döndürme (Log Rotation) Nedir ve Neden Gereklidir?
Günlük döndürme (log rotation), sistem günlük dosyalarının boyutunu ve yaşını yönetmek için kullanılan otomatik bir işlemdir. Temel amacı, günlük dosyalarının sürekli büyümesini engelleyerek disk alanının tükenmesini önlemek, günlük dosyalarının analizini kolaylaştırmak ve sistem performansını korumaktır.
Günlük döndürme olmadan, özellikle yüksek trafiğe sahip sunucularda, Apache günlük dosyaları kısa sürede gigabaytlarca boyuta ulaşabilir. Bu durum:
* Disk Alanı Tükenmesi: Sunucunuzun disk alanını tamamen doldurarak yeni yazma işlemlerini engelleyebilir, bu da web sitenizin veya diğer uygulamaların çalışmamasına neden olabilir.
* Performans Sorunları: Çok büyük dosyalara yazmak veya bu dosyaları okumak disk G/Ç işlemlerini artırarak sunucu performansını düşürebilir.
* Yönetim Zorluğu: Büyük günlük dosyalarını metin düzenleyicilerle açmak veya analiz araçlarıyla işlemek çok zor veya imkansız hale gelebilir.
* Veri Bütünlüğü: Belirli bir zaman dilimindeki olayları bulmak, tek bir devasa dosyada kaybolabilir.
Log döndürme, bu sorunları çözmek için eski günlük dosyalarını belirli aralıklarla (günlük, haftalık, aylık) yeniden adlandırır, sıkıştırır ve belirli bir sayıya ulaştığında en eski olanları siler. Bu sayede, her zaman belirli bir miktarda güncel ve yönetilebilir boyutta günlük dosyasına sahip olursunuz.
Logrotate ile Apache Günlüklerini Etkin Bir Şekilde Yönetme
Ubuntu sistemlerinde günlük döndürme işlemleri için varsayılan ve en yaygın kullanılan araç logrotate‘tir. logrotate, sistem genelindeki günlük dosyalarını yönetmek için tasarlanmış güçlü ve esnek bir yardımcı programdır.
Logrotate Nasıl Çalışır?
logrotate, /etc/logrotate.conf ana yapılandırma dosyası ve /etc/logrotate.d/ dizinindeki uygulama özelindeki yapılandırma dosyaları aracılığıyla çalışır. Ubuntu’da logrotate, cron tarafından düzenli olarak çalıştırılır. Genellikle /etc/cron.daily/logrotate betiği, her gün logrotate‘i çağırır.
logrotate çalıştığında, belirtilen günlük dosyalarını kontrol eder. Eğer bir dosya döndürme kriterlerini (boyut, yaş) karşılıyorsa, aşağıdaki adımları uygular:
1. Mevcut günlük dosyasının adını değiştirir (örneğin, access.log -> access.log.1).
2. İsteğe bağlı olarak, yeni bir boş günlük dosyası oluşturur.
3. Eski günlük dosyalarını sıkıştırır (örneğin, access.log.1 -> access.log.1.gz).
4. Belirli bir sayıda eski dosya saklandıktan sonra en eski olanları siler.
5. Gerekirse, ilgili hizmeti (bu durumda Apache) günlük dosyalarını yeniden açmaya zorlamak için bir komut çalıştırır.
Apache İçin Varsayılan Logrotate Yapılandırması
Ubuntu’da Apache için varsayılan logrotate yapılandırması /etc/logrotate.d/apache2 dosyasında bulunur. Bu dosyanın içeriği genellikle şuna benzer:
/var/log/apache2/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
if /usr/bin/test -f /var/run/apache2/apache2.pid; then \
/usr/sbin/apache2ctl graceful > /dev/null; \
fi
endscript
}
Bu yapılandırma, /var/log/apache2/ dizinindeki tüm .log uzantılı dosyalar için geçerlidir ve aşağıdaki yönergeleri kullanır:
/var/log/apache2/.log: Bu kuralın uygulanacağı günlük dosyalarını belirtir.
* daily: Günlük dosyalarını her gün döndür.
* missingok: Günlük dosyası eksikse hata verme.
* rotate 14: En fazla 14 adet döndürülmüş günlük dosyası sakla. 15. döndürmede en eski dosya silinir.
* compress: Döndürülen günlük dosyalarını sıkıştır (gzip kullanarak).
* delaycompress: Son döndürülen dosyayı bir sonraki döndürmeye kadar sıkıştırma. Bu, mevcut günlük dosyasının hala yazılıyor olabileceği durumlarda faydalıdır.
* notifempty: Günlük dosyası boşsa döndürme.
* create 640 root adm: Yeni bir günlük dosyası oluştur ve dosya izinlerini 640, sahibi root, grubu adm olarak ayarla.
* sharedscripts: Tüm günlük dosyaları için sadece bir kez postrotate betiğini çalıştır.
* postrotate/endscript: Günlük döndürme işleminden sonra çalıştırılacak komutları tanımlar. Burada Apache’ye günlük dosyalarını yeniden açması için sinyal gönderilir (apache2ctl graceful). Bu, Apache’nin kesinti olmadan yeni günlük dosyalarına yazmaya başlamasını sağlar.
Logrotate Yönergeleri ve Özelleştirme
logrotate yapılandırmasını ihtiyaçlarınıza göre özelleştirebilirsiniz. İşte bazı yaygın yönergeler:
* weekly/monthly/yearly: Döndürme sıklığını belirler.
* size 10M: Dosya boyutu 10MB’a ulaştığında döndür. (Sıklık yönergeleriyle birlikte kullanıldığında, “eğer günlük döndürme zamanı geldiyse VEYA boyutu aşıldıysa” şeklinde çalışır.)
* copytruncate: Mevcut günlük dosyasının bir kopyasını oluşturur, ardından orijinal dosyayı sıfırlar. Bu, Apache gibi uygulamaların günlük dosyalarını kapatıp yeniden açmasına gerek kalmadan çalışmaya devam etmesini sağlar. Ancak, küçük bir veri kaybı riski taşıyabilir. postrotate betiği gereksiz hale gelir.
* dateext: Döndürülen günlük dosyalarına tarih uzantısı ekler (örn. access.log-20230101.gz).
* maxage 30: 30 günden eski günlük dosyalarını sil.
Özel bir Sanal Sunucu için Logrotate Yapılandırması:
Eğer sanal sunucularınız için ayrı günlük dosyaları tutuyorsanız ve bunlar için farklı döndürme kuralları uygulamak istiyorsanız, /etc/logrotate.d/ dizinine kendi yapılandırma dosyanızı oluşturabilirsiniz.
Örneğin, your_domain.com için:
sudo nano /etc/logrotate.d/your_domain
İçeriği aşağıdaki gibi olabilir:
/var/log/apache2/your_domain_access.log /var/log/apache2/your_domain_error.log {
weekly
rotate 4
compress
delaycompress
missingok
notifempty
create 640 root adm
sharedscripts
postrotate
if /usr/bin/test -f /var/run/apache2/apache2.pid; then \
/usr/sbin/apache2ctl graceful > /dev/null; \
fi
endscript
}
Bu yapılandırma, your_domain_access.log ve your_domain_error.log dosyalarını haftalık olarak döndürecek ve sadece 4 adet sıkıştırılmış eski dosyayı saklayacaktır.
Logrotate Yapılandırmasını Test Etme
Değişikliklerinizi yapmadan veya bir sorun olduğunda logrotate‘in nasıl çalışacağını test etmek için logrotate komutunu debug (-d) veya force (-f) seçenekleriyle kullanabilirsiniz.
* Sadece test (debug modu):
sudo logrotate -d /etc/logrotate.d/apache2
Bu komut, logrotate‘in ne yapacağını gösterir ancak hiçbir değişiklik yapmaz.
* Zorla döndürme (force modu):
sudo logrotate -f /etc/logrotate.d/apache2
Bu komut, normalde döndürme koşulları (sıklık, boyut) karşılanmasa bile belirtilen yapılandırma dosyasındaki günlükleri döndürmeye zorlar. Bu, yapılandırmanızın doğru çalışıp çalışmadığını hemen görmek için faydalıdır. Dikkatli kullanın, çünkü mevcut günlük dosyalarınızı döndürür.
Pratik İpuçları ve En İyi Uygulamalar
* Disk Alanı İzleme: Günlük döndürme disk alanını yönetmeye yardımcı olsa da, düzenli olarak sunucunuzun disk kullanımını izlemelisiniz (df -h). Beklenmedik bir büyüme, bir yapılandırma sorununa veya bir saldırıya işaret edebilir.
* İzinler ve Güvenlik: Günlük dosyaları hassas bilgiler içerebilir. create yönergesindeki 640 izinleri, günlük dosyalarının yalnızca root ve adm grubundaki kullanıcılar tarafından okunabilmesini sağlar. Bu, yetkisiz erişimi engellemek için önemlidir.
* Düzenli Günlük İncelemesi: Günlük döndürme günlükleri yönetilebilir tutarken, bu günlükleri düzenli olarak incelemek de önemlidir. grep, awk, sed gibi komut satırı araçları veya GoAccess, ELK Stack gibi daha gelişmiş analiz araçları kullanabilirsiniz.
* Merkezi Günlük Kaydı: Birden fazla sunucunuz varsa, günlükleri merkezi bir sunucuya (örneğin, ELK Stack, Splunk, Graylog) göndermeyi düşünebilirsiniz. Bu, tüm günlüklerinizi tek bir yerden izlemenizi ve analiz etmenizi sağlar.
* Arşivleme Politikası: rotate yönergesi ile ne kadar eski günlük dosyasını saklayacağınızı belirleyin. Yasal gereklilikler veya kendi analiz ihtiyaçlarınız doğrultusunda bu süreyi ayarlayabilirsiniz. Çok uzun süre saklamak disk alanını tüketirken, çok kısa süre saklamak geçmiş verilere erişiminizi kısıtlayabilir.
Sonuç ve Sıkça Sorulan Sorular (SSS)
Apache günlük kayıtlarının doğru yapılandırılması ve logrotate ile etkin bir şekilde yönetilmesi, bir Ubuntu VPS üzerindeki web sunucunuzun sağlığı, güvenliği ve performansı için kritik öneme sahiptir. Bu rehberde öğrendiğiniz bilgilerle, günlük dosyalarınızın boyutunu kontrol altında tutabilir, disk alanınızı koruyabilir ve sunucunuzda meydana gelen olayları daha kolay bir şekilde izleyip analiz edebilirsiniz. Unutmayın, iyi yönetilen günlükler, sorunları hızlıca tespit etmenize ve potansiyel güvenlik tehditlerine karşı önlem almanıza yardımcı olan değerli bir kaynaktır.
Sıkça Sorulan Sorular (SSS)
S1: Loglarımı nerede bulabilirim?
C1: Varsayılan olarak Apache günlükleri Ubuntu’da /var/log/apache2/ dizininde bulunur. Sanal sunucular için özel olarak yapılandırdıysanız, bu dizin altında kendi belirlediğiniz isimlerde (örn. your_domain_access.log) bulabilirsiniz.
S2: Logrotate çalışmıyorsa ne yapmalıyım?
C2: İlk olarak /etc/cron.daily/logrotate dosyasının varlığını ve yürütülebilir olduğunu kontrol edin. Ardından, sudo logrotate -d /etc/logrotate.d/apache2 komutuyla hata ayıklama modunda çalıştırmayı deneyin. Çıktı, sorunun kaynağını anlamanıza yardımcı olabilir. Ayrıca, /var/lib/logrotate/status dosyasının varlığını ve logrotate‘in bu dosyaya yazabildiğini kontrol edin.
S3: Log dosyalarını sıkıştırmak neden önemlidir?
C3: Sıkıştırma (genellikle gzip ile), eski günlük dosyalarının diskte kapladığı alanı önemli ölçüde azaltır. Bu, daha fazla sayıda eski günlüğü saklamanıza olanak tanır ve disk alanından tasarruf sağlar.
S4: Farklı sanal sunucular için ayrı loglar tutabilir miyim?
C4: Evet, kesinlikle önerilir. Her sanal sunucunun VirtualHost bloğuna ayrı ErrorLog ve CustomLog yönergeleri ekleyerek bunu yapabilirsiniz. Daha sonra bu ayrı günlük dosyaları için /etc/logrotate.d/ dizininde kendi özel logrotate yapılandırmalarını oluşturabilirsiniz.
S5: LogLevel ayarı ne işe yarar?
C5: LogLevel ayarı, Apache’nin error.log dosyasına hangi düzeyde detaylı mesajlar yazacağını belirler. debug en detaylıyken, emerg sadece en kritik sorunları kaydeder. Üretim ortamında genellikle warn veya error seviyesi kullanılırken, sorun giderme sırasında info veya debug seviyesine geçici olarak ayarlanabilir.