Apache 503 Service Unavailable Hatası Nasıl Çözülür?
Apache 503 hatası, sunucunun isteği geçici olarak karşılayamadığını gösterir. MaxRequestWorkers ve backend servis sorunları başlıca nedenlerdir.
Apache 503 Service Unavailable Hatası Nedir?
503 Service Unavailable hatası, web sunucusunun isteği geçici olarak işleyemediğini bildiren bir HTTP durum kodudur. Bu hata, sunucunun tamamen çöktüğü anlamına gelmez; ancak anlık olarak aşırı yüklendiğini, bakımda olduğunu ya da bir arka uç servisinin yanıt vermediğini gösterir. Apache web sunucusunda bu hata birçok farklı nedenden kaynaklanabilir.
Hata tarayıcıda şu şekilde görünür:
503 Service Unavailable
The server is temporarily unable to service your request. Please try again later.
503 Hatasının Başlıca Nedenleri
1. MaxRequestWorkers Limitine Ulaşma
Apache'nin aynı anda işleyebileceği maksimum eşzamanlı bağlantı sayısı MaxRequestWorkers direktifi ile belirlenir. Bu limit aşıldığında yeni gelen istekler reddedilir ve 503 hatası döndürülür. Varsayılan değer genellikle 150'dir ve yoğun trafik altında yetersiz kalabilir.
2. Backend/Proxy Servisinin Çökmesi
Apache'yi bir reverse proxy olarak kullandığınızda (örneğin PHP-FPM, Tomcat veya başka bir uygulama sunucusuna yönlendirme yapıyorsanız), arka uç servis çöktüğünde Apache 503 hatası döner.
3. PHP-FPM Servisi Durmuş
PHP tabanlı web sitelerinde PHP-FPM servisi durduğunda veya crash ettiğinde Apache, PHP dosyalarını işleyemez ve 503 hatası verir.
4. Sunucu Kaynakları Tükenmesi
RAM dolduğunda, CPU aşırı yüklendiğinde veya disk alanı tamamen dolduğunda Apache yeni isteklere yanıt veremez hale gelir.
5. .maintenance Dosyası
WordPress gibi bazı CMS'ler güncelleme sırasında otomatik bakım modu devreye girer ve .maintenance dosyası oluşturulur. Bu dosya silinmezse site sürekli 503 verir.
Tanı Koyma: Hatayı Tespit Etme
Apache Log Dosyalarını İnceleme
# Hata logunu gerçek zamanlı izle
sudo tail -f /var/log/apache2/error.log
# Erişim logunu incele
sudo tail -f /var/log/apache2/access.log
# Son 100 satır hata logu
sudo tail -100 /var/log/apache2/error.log | grep 503
Apache Servis Durumu
sudo systemctl status apache2
# veya CentOS/AlmaLinux için
sudo systemctl status httpd
Mevcut Apache Süreçlerini Kontrol Etme
# Apache işlem sayısını kontrol et
ps aux | grep apache2 | wc -l
# Aktif bağlantıları listele
netstat -an | grep :80 | wc -l
Çözüm 1: MaxRequestWorkers Artırma
Apache yapılandırma dosyasını açın:
sudo nano /etc/apache2/mods-enabled/mpm_prefork.conf
# veya
sudo nano /etc/apache2/apache2.conf
MPM Prefork için ayarları güncelleyin:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 300
MaxConnectionsPerChild 0
</IfModule>
MPM Worker için:
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
Değişiklikleri uygulayın:
sudo apache2ctl configtest
sudo systemctl restart apache2
Çözüm 2: mod_status ile Sunucu İzleme
Apache'nin mod_status modülü sunucu durumunu gerçek zamanlı izlemenizi sağlar:
sudo a2enmod status
sudo nano /etc/apache2/mods-enabled/status.conf
<Location "/server-status">
SetHandler server-status
Require ip 127.0.0.1
Require ip YOUR_IP_ADDRESS
</Location>
ExtendedStatus On
sudo systemctl restart apache2
curl http://localhost/server-status
Bu komut size aktif bağlantı sayısı, işlenen istek sayısı ve sunucu yük bilgisini gösterir.
Çözüm 3: PHP-FPM Sorunlarını Giderme
# PHP-FPM durumunu kontrol et
sudo systemctl status php8.2-fpm
# PHP-FPM loglarını incele
sudo tail -f /var/log/php8.2-fpm.log
# PHP-FPM'i yeniden başlat
sudo systemctl restart php8.2-fpm
PHP-FPM pool yapılandırmasını kontrol edin:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
Çözüm 4: Sunucu Kaynaklarını Kontrol Etme
# RAM kullanımı
free -h
# CPU yükü
top -bn1 | head -5
# Disk kullanımı
df -h
# En çok RAM kullanan süreçler
ps aux --sort=-%mem | head -10
Çözüm 5: Arka Uç Servislerin Durumu
# MySQL/MariaDB durumu
sudo systemctl status mysql
# Redis durumu
sudo systemctl status redis
# Memcached durumu
sudo systemctl status memcached
# Tüm servislerin durumu
sudo systemctl list-units --state=failed
mod_proxy ile 503 Hatası
Eğer Apache'yi reverse proxy olarak kullanıyorsanız ve arka uç 503 veriyorsa:
<VirtualHost *:80>
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
# Proxy timeout ayarları
ProxyTimeout 300
# Arka uç erişilemiyor mesajı için özel sayfa
ErrorDocument 503 /maintenance.html
</VirtualHost>
Önleyici Tedbirler
Otomatik Yeniden Başlatma
sudo systemctl edit apache2
[Service]
Restart=always
RestartSec=5s
Monitoring Kurulumu
Sunucu durumunu sürekli izlemek için Monit, Netdata veya Prometheus gibi araçlar kullanabilirsiniz. Kritik servislerin çökmesi durumunda anında uyarı almanızı ve otomatik yeniden başlatmayı sağlarlar.
Load Balancer Kullanımı
Yüksek trafikli siteler için birden fazla Apache sunucusu önüne bir load balancer koymak, tek sunucunun aşırı yüklenmesini engeller.
Özet
Apache 503 hatası genellikle MaxRequestWorkers limitine ulaşma, PHP-FPM çökmesi veya sistem kaynaklarının tükenmesinden kaynaklanır. Önce log dosyalarını inceleyin, servis durumlarını kontrol edin ve gerekli yapılandırma değişikliklerini yapın. Uzun vadede uygun monitoring ve otomatik yeniden başlatma ayarları kurarak bu tür sorunları proaktif biçimde önleyebilirsiniz.
Yorumlar
Henüz yorum yok. İlk yorumu siz yapın!