Merhaba arkadaşlar, bugün sizlere Nginx sunucularımızın göz bebeği olan log dosyalarını nasıl daha verimli yönetebileceğimizi anlatacağım. Loglar, sorun gidermenin yanı sıra trafik analizi ve güvenlik izleme için de altın değerindedir. Ancak kontrolsüz büyürlerse disk alanını tüketir ve analizi zorlaştırır. Bu rehberde, log formatını ihtiyaçlarımıza göre özelleştirip, logrotate ile otomatik olarak döndürerek hem diskimizi hem de zihnimizi rahatlatacağız.
Nginx Log Formatını Özelleştirme
Varsayılan log formatı genelde yeterli olsa da, bazen daha fazla bilgiye (örneğin, kullanıcı agent'ı, özel başlıklar, cache durumu) ihtiyaç duyarız. İlk olarak, ana Nginx yapılandırma dosyasında veya bir snippet dosyasında özel bir log formatı tanımlayalım.
Bu main_ext formatı, upstream sunucu bilgileri, cache durumu ve istek süresi gibi detayları da loglar. Benim sunucularda genelde kullandığım yöntem budur. Error log formatı ise genelde özelleştirilmez, ancak log seviyesini ayarlayabilirsiniz.
Logrotate ile Otomatik Döndürme
Log dosyalarının sürekli büyümesini engellemek için logrotate kullanırız. Nginx genelde kendi logrotate konfigürasyonu ile gelir (/etc/logrotate.d/nginx), ancak biz kendi ihtiyaçlarımıza göre ayarlayalım. Şu ayara çok dikkat etmelisiniz: Nginx logları yeniden açabilmek için sinyal göndermeliyiz, aksi halde log yazmaya devam etmez.
Öncelikle mevcut ayar dosyasını yedekleyip düzenleyelim:
Aşağıdaki gibi, daha sıkı ve kontrollü bir yapılandırma kullanmanızı tavsiye ederim. Bu ayarlar, logları günlük döndürür, 30 gün saklar ve sıkıştırır.
Buradaki kritik parametreler:
- daily: Logları her gün döndürür.
- rotate 30: 30 eski log dosyasını saklar, sonrasında siler.
- compress: Döndürülen logları gzip ile sıkıştırır (disk alanından büyük tasarruf!).
- delaycompress: En son döndürülen logu bir sonraki döndürmeye kadar sıkıştırmaz, canlı log analizi yapıyorsanız faydalıdır.
- postrotate: Döndürme işleminden sonra Nginx'e yeni log dosyasına yazmaya başlaması için USR1 sinyali gönderir.
Test ve Manuel Çalıştırma
Konfigürasyonun doğru çalışıp çalışmadığını test etmek için logrotate'ın debug modunu kullanabilirsiniz. Bu komut, yapılacak işlemleri gösterir ama gerçekte bir şey yapmaz.
Her şey yolunda görünüyorsa, logrotate'ı manuel olarak çalıştırarak işlemi hemen başlatabilirsiniz:
Bu komuttan sonra /var/log/nginx/ dizininize bakarsanız, access.log.1, error.log.1 gibi yeni dosyalar ve muhtemelen sıkıştırılmış eski dosyalar (.gz uzantılı) göreceksiniz. Ana log dosyalarının (access.log, error.log) boyutunun sıfırlandığını gözlemleyin.
Dikkat Edilmesi Gerekenler
1. Disk Alanı Takibi: rotate değerini ve saklama süresini, disk alanınıza göre ayarlayın. 30 gün makul bir süredir.
2. İzinler (Permissions): create satırında belirttiğimiz kullanıcı/grup (www-data adm) sizin sisteminizdeki Nginx kullanıcısı ve log dizini izinleriyle uyumlu olmalı. Aksi halde "permission denied" hatası alırsınız.
3. Sinyal Gönderme: postrotate script'i olmazsa olmazdır. Nginx, log dosyasının inode'unun değiştiğini anlamaz ve eski (döndürülmüş) dosyaya yazmaya devam edebilir.
4. Monitoring: Error loglarında bir patlama olup olmadığını düzenli kontrol edin. Anormal artışlar bir sorunun habercisi olabilir.
Bu ayarları yaptıktan sonra artık log dosyalarınız otomatik olarak yönetilecek, disk alanınız korunacak ve daha anlamlı log kayıtlarınız olacak. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı log formatları veya logrotate taktikleriniz varsa paylaşın. Konuyla ilgili sorusu olan aşağıya yazsın, elimden geldiğince yardımcı olurum.
Varsayılan log formatı genelde yeterli olsa da, bazen daha fazla bilgiye (örneğin, kullanıcı agent'ı, özel başlıklar, cache durumu) ihtiyaç duyarız. İlk olarak, ana Nginx yapılandırma dosyasında veya bir snippet dosyasında özel bir log formatı tanımlayalım.
NGINX:
http {
log_format main_ext '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$host" "sn=$server_name" '
'rt=$request_time ua="$upstream_addr" '
'us="$upstream_status" ut="$upstream_response_time" '
'ul="$upstream_cache_status" cs=$connection $connection_requests';
access_log /var/log/nginx/access.log main_ext;
}
Bu main_ext formatı, upstream sunucu bilgileri, cache durumu ve istek süresi gibi detayları da loglar. Benim sunucularda genelde kullandığım yöntem budur. Error log formatı ise genelde özelleştirilmez, ancak log seviyesini ayarlayabilirsiniz.
Log dosyalarının sürekli büyümesini engellemek için logrotate kullanırız. Nginx genelde kendi logrotate konfigürasyonu ile gelir (/etc/logrotate.d/nginx), ancak biz kendi ihtiyaçlarımıza göre ayarlayalım. Şu ayara çok dikkat etmelisiniz: Nginx logları yeniden açabilmek için sinyal göndermeliyiz, aksi halde log yazmaya devam etmez.
Öncelikle mevcut ayar dosyasını yedekleyip düzenleyelim:
Bash:
sudo cp /etc/logrotate.d/nginx /etc/logrotate.d/nginx.backup
sudo nano /etc/logrotate.d/nginx
Aşağıdaki gibi, daha sıkı ve kontrollü bir yapılandırma kullanmanızı tavsiye ederim. Bu ayarlar, logları günlük döndürür, 30 gün saklar ve sıkıştırır.
NGINX:
/var/log/nginx/.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Buradaki kritik parametreler:
- daily: Logları her gün döndürür.
- rotate 30: 30 eski log dosyasını saklar, sonrasında siler.
- compress: Döndürülen logları gzip ile sıkıştırır (disk alanından büyük tasarruf!).
- delaycompress: En son döndürülen logu bir sonraki döndürmeye kadar sıkıştırmaz, canlı log analizi yapıyorsanız faydalıdır.
- postrotate: Döndürme işleminden sonra Nginx'e yeni log dosyasına yazmaya başlaması için USR1 sinyali gönderir.
Konfigürasyonun doğru çalışıp çalışmadığını test etmek için logrotate'ın debug modunu kullanabilirsiniz. Bu komut, yapılacak işlemleri gösterir ama gerçekte bir şey yapmaz.
Bash:
sudo logrotate -d /etc/logrotate.d/nginx
Her şey yolunda görünüyorsa, logrotate'ı manuel olarak çalıştırarak işlemi hemen başlatabilirsiniz:
Bash:
sudo logrotate -vf /etc/logrotate.d/nginx
Bu komuttan sonra /var/log/nginx/ dizininize bakarsanız, access.log.1, error.log.1 gibi yeni dosyalar ve muhtemelen sıkıştırılmış eski dosyalar (.gz uzantılı) göreceksiniz. Ana log dosyalarının (access.log, error.log) boyutunun sıfırlandığını gözlemleyin.
1. Disk Alanı Takibi: rotate değerini ve saklama süresini, disk alanınıza göre ayarlayın. 30 gün makul bir süredir.
2. İzinler (Permissions): create satırında belirttiğimiz kullanıcı/grup (www-data adm) sizin sisteminizdeki Nginx kullanıcısı ve log dizini izinleriyle uyumlu olmalı. Aksi halde "permission denied" hatası alırsınız.
3. Sinyal Gönderme: postrotate script'i olmazsa olmazdır. Nginx, log dosyasının inode'unun değiştiğini anlamaz ve eski (döndürülmüş) dosyaya yazmaya devam edebilir.
4. Monitoring: Error loglarında bir patlama olup olmadığını düzenli kontrol edin. Anormal artışlar bir sorunun habercisi olabilir.
Bu ayarları yaptıktan sonra artık log dosyalarınız otomatik olarak yönetilecek, disk alanınız korunacak ve daha anlamlı log kayıtlarınız olacak. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı log formatları veya logrotate taktikleriniz varsa paylaşın. Konuyla ilgili sorusu olan aşağıya yazsın, elimden geldiğince yardımcı olurum.