500 Internal Server Error Nedir, Nasıl Çözülür?

Yayın tarihi:

11 dk okuma

Acar Diveroli
Yazar: Acar Diveroli
Havalandırmalı, vidalı bir sunucu kasası; ön yüzde HTTP 500 durum plakası ve tek kırmızı arıza lambası, üstünde mavi plaka

Bir siparişin ödeme düğmesine basıyorsunuz; sonraki sayfa yerine neredeyse bomboş bir ekran geliyor: kalın harflerle "500 Internal Server Error", altında "nginx". Başka bir sitede Chrome kendi sayfasını çiziyor: "Bu sayfa çalışmıyor" başlığı, en altta "HTTP ERROR 500". Bir uygulamanın içinde sözcükler değişir, örneğin "The call failed on the server; see server log for details", ama sayı aynıdır.

Bu yazıda kodun ne anlama geldiğini ve neden bu kadar az şey söylediğini, gördüğünüz sayfayı kimin ürettiğini, 500'ün 502, 503 ve 504'ten farkını ve ziyaretçilerin, site sahiplerinin ve betiklerin bu hatada ne yapması gerektiğini anlatıyoruz.

500 Internal Server Error ne anlama gelir?

HTTP standardı kodu tek cümleyle tanımlar: sunucu, isteği yerine getirmesini engelleyen beklenmedik bir durumla karşılaşmıştır (RFC 9110, bölüm 15.6.1). 5 ile başlayan her kod bir sunucu hatasıdır, yani sunucu kusurun kendisinde olduğunu bilir; 500 ise daha özel bir kodun uymadığı her durumda kullanılan koddur.

Mesajın bu kadar az şey söylemesinin nedeni budur. Bağlantıları kabul eden program olan web sunucusu (nginx ya da Apache gibi), isteğinizi sayfaları hazırlayan uygulamaya devretmiştir ve uygulama bu işin bir yerinde durmuştur. Web sunucusu yalnız kullanılabilir bir sayfa gelmediğini bilir ve 500 döner; ayrıntı ise yalnız sitenin işletmecisinin okuyabildiği hata kaydına (error log) düşmüştür.

Baktığınız sayfayı kim gönderdi?

Hata sayfasının görünüşü, hangi programın pes ettiğini ve sitenin ne kadarının hâlâ çalıştığını söyler.

Ne görürsünüz?Kim gönderir?Ne anlatır?
Sitenin kendi tasarımı, bir özür, bazen bir istek kimliğiUygulamaÇalışıyor ve kendi hatasını yakalamış; kimlik, kayıttaki satırı gösterir
Beyaz bir sayfa, "500 Internal Server Error", altında "nginx" ya da "Apache"Web sunucusuUygulama çökmüş ya da kullanılabilir bir şey göndermemiş
"Bu sayfa çalışmıyor", "example.com şu anda bu isteği işleme alamıyor.", "HTTP ERROR 500"Chrome500 boş bir gövdeyle gelmiş; tarayıcı kendi sayfasını çizmiş

Son satırı, her isteğe sayfasız bir 500 ile cevap veren küçük bir test sunucusunu kendi bilgisayarımızda çalıştırıp Chromium 145'te Türkçe arayüzle açarak doğruladık: tam olarak bu satırlar (ortadakinde kendi sunucumuzun adıyla) ve bir Yeniden Yükle düğmesi. Başlık ve sunucu satırı Chromium'un Türkçe çeviri dosyasından gelir (components_strings_tr.xtb); "HTTP ERROR 500" satırını ise kod ekler ve hiç çevrilmez.

500 hatası adım adım nasıl oluşur?

  1. Tarayıcınız isteği gönderir: adres, çerezleriniz ve varsa form verisi.
  2. Web sunucusu isteği uygulamaya, yani sayfaları o anda üreten programa devreder. Sabit dosyaları kendisi sunar.
  3. Uygulama yarı yolda durur: ele alınmamış bir hata, cevap vermeyen bir veritabanı, bozuk bir yapılandırma satırı, bellek sınırını aşan bir betik.
  4. Bir şey 500 döner: uygulama hatayı yakaladıysa kendi sayfası, çöktüyse web sunucusunun genel sayfası ya da boş bir cevap.
  5. Tarayıcınız aldığını gösterir; gövde boşsa kendi "Bu sayfa çalışmıyor" ekranını.

500, 502, 503 ve 504 arasındaki fark nedir?

Dördü de sunucu hatasıdır, ama arızalanan parçayı farklı adlandırır. 500, uygulamanın kendisinin hata verdiğini söyler; 502, 503 ve 504 ise bir ağ geçidini (gateway), yani uygulamanın önünde durup ziyaretçilerin isteklerini arkaya ileten reverse proxy'yi, yük dengeleyiciyi ya da CDN'i anlatır.

KodHangi parça arızalandı?Sık görülen nedenZiyaretçi ne yapabilir?
500UygulamaKod hatası, bozuk ayar, tükenen bellek, kapalı veritabanıBir kez yenileyin, sonra bildirin
502Ağ geçidi geçersiz bir cevap aldı ya da hiç alamadıDurmuş ya da çökmüş uygulamaBir dakika bekleyip yenileyin
503Sunucu şu anda hizmet veremiyorAşırı yük, bakımBekleyin, durum sayfasına bakın
504Ağ geçidi çok uzun beklediYavaş uygulama, uzun istekDaha hafif bir sayfayı sonra deneyin

Aynı çökme iki koddan biri olarak görünebilir: uygulama cevap vermeden ölürse ve önünde nginx varsa nginx 502 bildirir; uygulama hatayı yakalayıp kendisi cevap verirse 500 görürsünüz. Ağ geçidi tarafını 502 Bad Gateway Hatası Nedir, Nasıl Çözülür? yazısında anlattık.

500 hatası sizden mi kaynaklanır?

Neredeyse hiçbir zaman ve bağlantınız yüzünden asla: istek yerine ulaşmıştır. Yine de isteğiniz tetikleyici olabilir; örneğin kodun beklemediği bir form değeri ya da çok büyük bir yükleme. Hata sitenindir, ama site düzeltene kadar yalnız sizde çıkar. Bayat bir çerez ya da oturum da uygulamanın kafasını karıştırabilir; sitenin çerezlerini silmenin, yenilemenin çözmediği bir 500'ü bazen çözmesinin nedeni budur.

Proxy ya da VPN de 500'e yol açmaz: hata, istek siteye ulaştıktan sonra üretilir; bu yüzden farklı bir IP adresi hatayı ortadan kaldırmaz.

Ziyaretçi olarak ne yapabilirsiniz?

  1. Bir kez yenileyin, sonra birkaç dakika bekleyin. F5'e ya da Chrome'un hata sayfasındaki Yeniden Yükle düğmesine basın; sonrası, zaten zorlanan bir sunucuya yük eklemekten başka işe yaramaz.
  2. Aynı sitenin başka bir sayfasını deneyin. Ana sayfa açılıyor ama ödeme adımı hata veriyorsa site ayaktadır, bir özelliği bozuktur.
  3. Siteyi telefonunuzda mobil veriyle deneyin. Orada da hata veriyorsa arıza herkes içindir ve bilgisayarınızda yapacağınız hiçbir şey bunu değiştirmez. Proxy ya da VPN ile çıkışı değiştirmek aynı testtir; Residential Proxy ile bu testi bir dakika içinde başka bir ülkeden yineleyebilirsiniz.
  4. Sitenin durum sayfasına bakın. Büyük hizmetler kesintileri orada duyurur; sürekli 500 gösteren bir uygulama, aynı kesintiye kendi API'si üzerinden takılıyordur.
  5. Sitenin çerezlerini silin; ama yalnız hata bekledikten sonra da sürüyorsa ve sayfadan sayfaya sizi izliyorsa. Bilgisayardaki Chrome'da: Diğer > Tarama verilerini sil, bir zaman aralığı seçin, Çerezler ve diğer site verileri kutusunu işaretleyin, sonra Verileri sil (Google'ın adımları). Bu işlem sitelerdeki oturumlarınızı kapatır; o yüzden en sona bırakın.
  6. Siteye bildirin: tam adres, saat, neye tıkladığınız ve sayfada yazan istek kimliği.

Modemi yeniden başlatmak, DNS sunucusunu değiştirmek ya da tarayıcıyı yeniden kurmak burada işe yaramaz: üçü de yolculuğun zaten çalışan bölümüne etki eder.

Site sizinse: nedeni nasıl bulursunuz?

500, ziyaretçi için bilerek belirsizdir; kayıtta ise hiç belirsiz değildir. Aşağıdakileri sırayla uygulayın; 500'lerin çoğu ilk üç adımda biter.

  1. Önce hata kaydını okuyun. Apache, hata kaydını bir sorun çıktığında ilk bakılacak yer olarak tanımlar; kaydın yerini ErrorLog yönergesi belirler ve Unix'te bu genellikle error_log adlı bir dosyadır (Apache kayıt belgeleri, İngilizce). nginx varsayılan olarak logs/error.log dosyasına, PHP ise kendi error_log dosyasına ya da web sunucusunun kaydına yazar. 500'ün çıktığı dakikayı bulun: PHP Fatal error: Allowed memory size of 134217728 bytes exhausted bir bellek sorunudur, Apache'nin Premature end of script headers satırı sayfa göndermeden ölen bir betiği gösterir, bir hata izi (stack trace) ise dosyayı ve satırı söyler.
  2. Son değişikliği geri alın. Bir güncellemenin, sürüm geçişinin ya da ayar düzenlemesinin hemen ardından başlayan 500, aksi kanıtlanana kadar o değişikliktir; önce geri alın.
  3. Eklentiler ve temalar. WordPress'in Internal Server Error rehberi bütün eklentileri devre dışı bırakmanızı ve varsayılan bir temaya geçmenizi söyler (Common WordPress errors, İngilizce); site geri geliyorsa eklentileri tek tek yeniden açın.
  4. .htaccess dosyası. Apache'de klasör başına tutulan bu yapılandırma dosyası her istekte okunur; bu yüzden tek bir bozuk satır bütün sayfaları bozar. WordPress rehberi bozulmuş bir .htaccess dosyasını en olası neden sayar: dosyayı .htaccess_old olarak yeniden adlandırın, site açılıyorsa Settings > Permalinks (Ayarlar > Kalıcı bağlantılar) sayfasından yeniden oluşturun. AllowOverride ayarının izin vermediği bir yönerge ya da bir yazım hatası, nedeni kayda yazılan bir sunucu hatası üretir.
  5. PHP sınırları. PHP, memory_limit değerinden (varsayılan 128M) fazla bellek ayıran betiği durdurur; max_execution_time değerinden (web sunucusunda varsayılan 30 saniye) uzun çalışan betiği de sonlandırır. Sınırı php.ini ya da hosting panelindeki PHP ayarlarından yükseltin; ama sürekli artan bir ihtiyacı bir hata olarak görün.
  6. İzinler ve bağımlılıklar. Web sunucusu kendi kullanıcısıyla çalışır: okuyamadığı bir betik ya da içine yazamadığı bir klasör, açık bir mesaj yerine 500 ile biter. Kapalı bir veritabanı, süresi dolmuş bir API anahtarı ya da sertifika, dolu bir disk de öyle; bunlar uygulamanın kendi kaydındadır.
  7. Hosting paneliniz. Paylaşımlı hostingde kaydı panel gösterir: cPanel'de Metrics (Metrikler) altındaki Errors (Hatalar) arayüzü, en son 300 kayıt satırına kadar listeler. Satırlar sunucunun kendisini gösteriyorsa ya da sunucudaki bütün siteler hata veriyorsa hosting firmasına saat, adres ve kayıt satırlarıyla bir destek talebi açın.

Google'ın tarama botları 5xx hatalarında yavaşlar ve sürekli hata veren adresleri sonunda dizinden çıkarır; yani uzun süren bir 500 sıralamaya mal olur. Birkaç önemli sayfayı dakikada bir çeken bir izleme aracı sizi önceden uyarır; kontrolleri birkaç sabit, size ayrılmış Datacenter Proxy adresinden yaparsanız bu adresleri sunucuda izin listesine ekleyebilir ve hata istatistiklerinizin dışında tutabilirsiniz.

Betik ya da scraper 500 hatasını nasıl ele almalı?

500'ü geçici ama bedelsiz olmayan bir hata olarak görün: aralıkları artırarak birkaç kez yeniden deneyin, sonra o adresten vazgeçin.

  • Denemeleri sınırlayın, aralığı büyütün. Bir saniye, sonra iki, sonra dört; üç dört denemeden sonra durun. Aynı adresi döven bir döngü kesintiyi daha da kötüleştirir.
  • Yük altında gelen 500, yavaşlayın demektir. Scraper'ınız (veri kazıma programınız) yüksek eşzamanlılıkla çalışırken site 500 döndürmeye başladıysa eşzamanlı istek sayısını azaltın. Geçmek için asla IP adresi değiştirmeyin: uygulama herkes için hata veriyordur.
  • Cevap gövdesini kaydedin. Bir JSON hatası, bir istek kimliği ya da bir hata izi, arızanın sizden mi (hatalı bir parametre) yoksa onlardan mı kaynaklandığını söyler; gerçek bir 500'ü engellemeden de ayırır. Doğrulama sayfası taşıyan bir 403 ya da 429, sunucu arızası değil, trafiğiniz hakkında verilmiş bir karardır; bunları 429 Too Many Requests ve Rate Limit Hatası Nedir? yazısında anlattık.

Aşağıdaki örnek bu kuralları Python'un Requests kütüphanesiyle uygular. Betiği, /flaky sayfası iki kez 500 sonra 200 döndüren, /text sayfası ise her zaman 500 döndüren yerel test sunucumuza karşı çalıştırdık (Python 3.13, Requests 2.34):

python
import time

import requests

URL = "http://127.0.0.1:18500/flaky"  # yerel test sunucumuz; buraya ihtiyacınız olan sayfayı yazın
PROXIES = None  # ya da {"http": "http://user:pass@pr.proxynet.io:8000", "https": "http://user:pass@pr.proxynet.io:8000"}
ATTEMPTS = 4  # üst sınır: süren bir 500 sizin değil, sitenin sorunudur


def fetch(url):
    wait = 1.0
    for attempt in range(1, ATTEMPTS + 1):
        r = requests.get(url, proxies=PROXIES, timeout=20)
        if r.status_code in (403, 429):
            raise RuntimeError(f"{url}: HTTP {r.status_code} is a block or a rate limit, not a server error")
        if r.status_code < 500:
            return r
        print(f"attempt {attempt}: HTTP {r.status_code} {r.reason}, body: {r.text.strip()[:60]!r}")
        if attempt < ATTEMPTS:
            time.sleep(wait)
            wait *= 2  # 1 sn, 2 sn, 4 sn
    raise RuntimeError(f"{url}: HTTP 500 after {ATTEMPTS} attempts, skip it and come back later")


r = fetch(URL)
print(f"HTTP {r.status_code}: {r.text.strip()}")

/flaky için çıktı:

text
attempt 1: HTTP 500 Internal Server Error, body: '{"error":"database connection lost"}'
attempt 2: HTTP 500 Internal Server Error, body: '{"error":"database connection lost"}'
HTTP 200: ok

/text için dört deneme yazdırılır ve betik şu satırla biter:

text
RuntimeError: http://127.0.0.1:18500/text: HTTP 500 after 4 attempts, skip it and come back later

Proxy üzerinden göndermek için PROXIES satırına Endpoint Oluşturucu'daki adresi yazın; mantık değişmez, çünkü 500 hedeften gelir. 403'ten 504'e kadar hangi kodların yeniden deneneceğini, hangilerinde durulacağını Scraping'de HTTP Hata Kodları: 403, 407, 429 ve 503 yazısında topladık.

500 hatasıyla nerelerde karşılaşırsınız?

  • Küçük bir sitede, altında "nginx" yazan düz bir "500 Internal Server Error" sayfası olarak; çoğu zaman içerik yönetim sisteminin ya da PHP'nin güncellenmesinin hemen ardından.
  • Discord ya da bir banka uygulaması gibi, ekranları hizmetin kendi API'sini çağıran ve onun döndürdüğü sayıyı gösteren bir uygulamanın içinde.
  • Bir Java web uygulamasındaki "The call failed on the server; see server log for details" mesajı olarak: GWT çatısının bir sunucu çağrısı hata verdiğinde 500 ile birlikte gönderdiği sabit metin.

Sık yapılan hatalar

  • Saniyede bir yenilemek. Uygulama zaten hata veriyor; fazladan istekler onu daha da yavaşlatır ve toparlandığı anı gizler.
  • Site sahipleri: kaydı okumadan memory_limit değerini yükseltmek. Daha yüksek sınır bir bellek sızıntısını bir hafta gizler, sonra 500 geri gelir.
  • Site sahipleri: hata izini ziyaretçiye göstermek. Canlıda açık unutulan hata ayıklama modu, hata sayfasına dosya yollarını ve veritabanı ayrıntılarını yazar.
  • Scraper'lar: 500'de IP değiştirmek. Site her adres için hata veriyor; aralıklarla yeniden deneyin ya da sayfayı atlayın.

Karar rehberi

DurumunuzNe yapmalısınız?
Tek bir sayfa 500 veriyor, sitenin kalanı çalışıyorBir kez yenileyin, birkaç dakika sonra deneyin, sayfayı bildirin
Site telefonda da tümüyle hata veriyorSite kapalı; bekleyin ya da durum sayfasına bakın
Siteniz, bir güncelleme ya da sürüm geçişinin hemen ardındanGeri alın, sonra hata kaydını okuyun
Siteniz, kayıtta "Allowed memory size" yazıyormemory_limit değerini bir kez yükseltin, sonra ona ihtiyaç duyan kodu düzeltin
Betiğiniz tek bir siteden 500 alıyorAralıkları artırarak 3-4 kez deneyin, sonra atlayın ve eşzamanlılığı düşürün

Sıkça sorulan sorular

500 Internal Server Error hatası benden mi kaynaklanıyor?

Hayır. Kod, sitenin kendi yazılımının isteğinizi işlerken hata verdiğini gösterir; bağlantınız ve tarayıcınız üzerlerine düşeni yapmıştır. Girdiniz var olan bir hatayı tetikleyebilir, ama onu düzeltmek yine sitenin işidir.

500 hatası ne kadar sürer?

Belirli bir süresi yoktur. Yeniden başlatma ya da kısa bir veritabanı kesintisi saniyeler içinde geçer; bozuk bir güncelleme ya da .htaccess dosyası, site sahibi fark edip düzeltene kadar sürer.

"500 Internal Server Error nginx" ne demek?

nginx, sitenin önündeki web sunucusu programıdır; gördüğünüz sayfa da onun genel hata sayfasıdır: nginx'in arkasındaki uygulama hata vermiş, nginx'in de iletecek düzgün bir cevabı kalmamıştır.

"The call failed on the server; see server log for details" ne demek?

Bazı Java web uygulamalarının kullandığı GWT çatısının, sunucuya yapılan bir çağrı hata verdiğinde 500 durum koduyla gönderdiği sabit metindir. Sözü edilen kaydı yalnız sitenin işletmecileri okuyabilir; sizin için sıradan bir 500'dür.

Discord ya da başka bir uygulama neden 500 hatası gösteriyor?

Uygulamalar verilerini hizmetin API'si üzerinden çeker; API 500 döndürdüğünde uygulama bu sayıyı gösterir. Kesinti hizmetin tarafındadır; durum sayfasına bakın ve daha sonra deneyin.

Çerezleri silmek 500 hatasını çözer mi?

Bazen, uygulama bayat bir çereze ya da oturuma takıldığında. Bunu yalnız yenileyip bekledikten sonra deneyin; 500'lerin çoğu sunucudadır ve veri silmek onlara etki etmez.

Özet

500 Internal Server Error, sitenin uygulamasının baş edemediği bir sorunla karşılaştığını ve sunucunun sayfa yerine genel bir hata gönderdiğini gösterir. Ziyaretçiler bir kez yeniler, bekler ve başka bir cihazdan dener; site sahipleri hata kaydını okur ve son değişiklik, eklentiler, .htaccess, PHP sınırları ve izinler üzerinden geriye doğru gider; betikler aralıkları artırarak yeniden dener ve yeni adreslerle asla zorlamaz. Proxy türlerini proxy sayfamızda karşılaştırabilirsiniz.

ChatGPT'ye sorClaude'a sor