Web uygulamaları, özellikle yoğun trafiğe sahip ortamlarda çalışırken, Reverse proxy görevini üstlenen Nginx tarafından çok sayıda log üretir. Bu loglar zaman içinde ciddi boyutlara ulaşabilir. Eğer log dosyaları zamanında rotate edilmez ve yönetilmezse, sistemde disk alanı dolabilir, performans düşebilir veya servisler kesintiye uğrayabilir.
Docker konteynerlerinde bu problem daha da karmaşık hale gelir çünkü konteynerler genellikle kısa ömürlüdür ve sistem logları dış dünyadan izole olabilir.
Docker konteynerleri içinde çalışan uygulamalar genellikle loglarını dosya sistemi üzerine ya da doğrudan standart çıkışa (stdout) yazarlar. Nginx'in log yönetimi de bu iki yöntemden biriyle sağlanır:
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;Bu klasik yöntem, logların doğrudan dosya sistemi üzerinde tutulmasını sağlar. Ancak Docker konteyneri içinde kalan bu log dosyalarına host (sunucu) üzerinden erişilemez. Bu yüzden volume mount yapılması gerekir.
access_log /dev/stdout;
error_log /dev/stderr;Bu yöntemle loglar, Docker motorunun log yönetimine teslim edilir. Böylece JSON formatında döndürme (rotate) işlemleri Docker tarafından yapılabilir.
Docker Compose ile log klasörü konteyner dışına taşınır:
services:
nginx:
image: nginx:stable
volumes:
- ./logs:/var/log/nginxBu yapılandırma ile /var/log/nginx dizini, host üzerindeki ./logs klasörüne bağlanır. Böylece host loglara erişebilir.
Linux sistemlerde logrotate, belirli aralıklarla log dosyalarını döndürür, sıkıştırır ve temizler. Aşağıdaki yapılandırma örneği, günlük döndürme sağlar:
sudo nano /etc/logrotate.d/nginx-dockerİçerik:
/home/kullanici/nginx-logs/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 root adm
sharedscripts
postrotate
docker exec nginx-container-name nginx -s reopen
endscript
}
daily: Her gün log döndürülürrotate 7: 7 gün boyunca eski loglar saklanırcompress: Eski loglar gzip ile sıkıştırılırpostrotate: Nginx'e log dosyasını yeniden aç komutu gönderilir
Logrotate eski log dosyasını yeniden adlandırır. Ancak Nginx hâlâ eski dosyaya yazmaya devam eder. Bu yüzden şu komutla Nginx yeniden log dosyasını açmaya zorlanır:
docker exec nginx-container-name nginx -s reopenAlternatif olarak:
kill -USR1 $(cat /var/run/nginx.pid)Bu sinyal access.log ve error.log dosyalarının yeniden oluşturulmasını sağlar.
Logları /dev/stdout ve /dev/stderr'e yönlendirerek Docker’ın kendi log yönetim sürücüsünden yararlanabilirsiniz.
services:
nginx:
image: nginx
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"Bu konfigürasyonla:
- Her log dosyası 10MB'a ulaştığında döndürülür
- En fazla 5 döndürülmüş log dosyası tutulur
Loglar şu dizinde tutulur:
/var/lib/docker/containers/<container-id>/<container-id>-json.log
Bu yöntem sistem tarafından otomatik olarak yönetildiği için logrotate gibi ek işlemlere gerek kalmaz.
docker exec nginx-container-name bash -c "for i in {1..10000}; do echo \"$(date) log test\" >> /var/log/nginx/access.log; done"sudo logrotate -f /etc/logrotate.d/nginx-dockerYeni log dosyasının oluştuğunu ve Nginx’in yeni dosyaya yazmaya devam ettiğini kontrol edin.
| Hata | Açıklama |
|---|---|
| logrotate çalışmıyor | Dosya host'a mount edilmemiş olabilir |
| Yeni log dosyası oluşmuyor | nginx -s reopen komutu gönderilmemiş olabilir |
| Disk alanı hala dolu | .gz loglar silinmemiştir veya log driver düzgün çalışmıyordur |
| logrotate işlemiyor | PID dosyası yanlış veya container erişilemiyor olabilir |
Docker ortamında çalışan Nginx servislerinde log yönetimi, sistem kararlılığı için hayati önem taşır. Gerek klasik logrotate ile, gerekse Docker’ın sunduğu json-file log driver üzerinden log döndürme işlemleri sağlıklı bir şekilde yapılandırılmalıdır.
Yazılımcılar ve sistem yöneticileri için bu yapıların doğru şekilde konumlandırılması, logların hem arşivlenmesi hem de merkezi izleme sistemlerine aktarılması için temel oluşturur.
*Oluşturulma Tarihi: 2025-05-2025