Dahili Hata 500 Apache, ancak günlüklerde yok mu?


122

Uygulamamdaki belirli bir adrese HTTP POST yapmaya çalıştığımda 500 Dahili Sunucu hatası alıyorum. Sanal ana bilgisayar dosyasında belirtilen özel günlük dizinindeki sunucu günlüklerine baktım, ancak hata orada görünmüyor, bu nedenle hata ayıklama işlemi baş belası oldu.

Apache'nin Hata günlüğüne Dahili 500 hatalarını kaydetmesine nasıl neden olurum?


1
PHP'yi sanal konaklarla kullanırken aynı sorunu yaşadım .... hata yok (Apache2, Ubuntu). Eksik PHP modülleri (mysql, json, vb.)

1
Bizimkinde, onları erişim günlüğüne gönderiyordu (muhtemelen Apache'nin bakış açısına göre, doğru çalışıyordu ve sadece onları daha derin bir katmandan - bizim durumumuzda Yolcu / Raylar) aktarıyordu. Birinin kafasını kaşıması ihtimaline karşı bu notu buraya koyuyorum.
Tom Hundt

Yanıtlar:


-4

Lütfen Dikkat: Orijinal poster özellikle PHP hakkında soru sormuyordu. Tüm php merkezli cevaplar, asıl soruyla alakalı olmayan büyük varsayımlarda bulunur.

Komut dosyası hata günlüklerinin aksine varsayılan hata günlüğü genellikle (daha fazla) belirli hataya sahiptir. çoğu zaman izinler reddedilir veya bulunamayan bir tercüman bile olur.

Bu, hatanın neredeyse her zaman senaryonuzda olduğu anlamına gelir. Örneğin, bir perl betiği yüklediniz ancak yürütme izni vermediniz mi? veya belki bir linux ortamında bozulmuş betiği pencerelerde yazıp sonra satır sonları dönüştürülmeden sunucuya yüklerseniz bu hatayı alırsınız.

unutursan perl'de

print "content-type: text/html\r\n\r\n";

bu hatayı alacaksın

Bunun birçok nedeni var. Bu nedenle lütfen önce hata günlüğünüzü kontrol edin ve ardından biraz daha bilgi sağlayın.

Varsayılan hata günlüğü genellikle /var/log/httpd/error_logveya dizinindedir /var/log/apache2/error.log.

Varsayılan hata günlüklerine (yukarıda belirtildiği gibi) bakmanızın nedeni, hataların her zaman sanal ana bilgisayarda tanımlandığı gibi özel hata günlüğüne gönderilmemesidir.

Linux varsayar ve perl olması gerekmez


6
ErrorLog sunucusunu kontrol ettim ve orada bulunacak hiçbir şey yok.
wcolbert

2
Haklısın, php betiği ile ilgili bir sorun olduğu ortaya çıktı. PEAR kitaplığı kurulmadı. VPS'ime kurdum ve her şey yolunda. Hepinize teşekkürler!
wcolbert

262
"Lütfen günlükleri kontrol edin", "günlüklerim neden boş?" Sorusunun yanıtı nasıl kabul edilebilir?
Álvaro González

5
Kullanıcıyı özel hata günlüklerine değil varsayılan hata günlüklerine yönlendirdim. Genellikle bir komut dosyası herhangi bir nedenle başarısız olduğunda, hata varsayılan hata günlüklerine yönlendirilir
DeveloperChris

2
PHP ile yapılandırılmış apache hata günlüklerinde hiçbir şey yoktu, ancak hataları buldum grep PHP /var/log/syslog. Muhtemelen içeri girdiğim error_log = syslogiçin /etc/php5/apache2/php.ini.
mivk

145

500 Dahili Sunucu Hatası, apache hata günlüklerinize neden kaydedilmiyor?

500 Dahili Sunucu Hatasına neden olan hatalar bir PHP modülünden gelmektedir. Varsayılan olarak, PHP bu hataları KAYDETMEZ. Web isteklerinin fiziksel olarak olabildiğince hızlı gitmesini istemenizin nedeni ve saldırganların bunları gözlemleyebilecekleri yerleri taramak için hataları günlüğe kaydetmek bir güvenlik tehlikesidir.

Dahili Sunucu Hata Günlüğü'nü etkinleştirmeye yönelik bu talimatlar Ubuntu 12.10, PHP 5.3.10ve ile içindir Apache/2.2.22.

PHP günlüğünün açık olduğundan emin olun:

  1. Php.ini dosyanızı bulun:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. Bu dosyayı kök olarak düzenleyin:

    sudo vi /etc/php5/apache2/php.ini
    
  3. Bu satırı php.ini içinde bulun:

    display_errors = Off
    
  4. Yukarıdaki satırı şununla değiştirin:

    display_errors = On
    
  5. Dosyanın daha aşağısında şunu göreceksiniz:

    ;display_startup_errors
    ;   Default Value: Off
    ;   Development Value: On
    ;   Production Value: Off
    
    ;error_reporting
    ;   Default Value: E_ALL & ~E_NOTICE
    ;   Development Value: E_ALL | E_STRICT
    ;   Production Value: E_ALL & ~E_DEPRECATED
    
  6. Noktalı virgüller yorumlardır, yani satırlar etkili olmaz. Bu satırları şöyle görünecek şekilde değiştirin:

    display_startup_errors = On
    ;   Default Value: Off
    ;   Development Value: On
    ;   Production Value: Off
    
    error_reporting = E_ALL
    ;   Default Value: E_ALL & ~E_NOTICE
    ;   Development Value: E_ALL | E_STRICT
    ;   Production Value: E_ALL & ~E_DEPRECATED
    

    Bunun PHP'ye ilettiği şey, tüm bu hataları günlüğe kaydetmek istememizdir. Uyarı, büyük bir performans düşüşü yaşanacaktır, bu nedenle bunun üretimde etkinleştirilmesini istemezsiniz çünkü günlük tutma iş gerektirir ve çalışma zaman alır, zaman maliyete mal olur.

  7. PHP ve Apache'nin yeniden başlatılması değişikliği uygulamalıdır.

  8. 500 Dahili Sunucu hatasına tekrar neden olmak için yaptığınız şeyi yapın ve günlüğü kontrol edin:

    tail -f /var/log/apache2/error.log
    
  9. Sonunda 500 hatasını görmelisiniz, bunun gibi bir şey:

    [Wed Dec 11 01:00:40 2013] [error] [client 192.168.11.11] PHP Fatal error:  
    Call to undefined function Foobar\\byob\\penguin\\alert() in /yourproject/
    your_src/symfony/Controller/MessedUpController.php on line 249, referer: 
    https://nuclearreactor.com/abouttoblowup
    

46
display_errorshataları ekranda yazdırır . günlük dosyasınalog_errors hataları yazar .
daVe

11
Bu sorunun kanonik cevabı bu olmalıdır.
David

9
@WanLiqun Oldukça iyi bir bilgi parçası, ancak yalnızca soruda bahsedilmeyen PHP için geçerli.
Álvaro González

1
"500 Dahili Sunucu Hatasına neden olan hatalar bir PHP modülünden gelmektedir. Varsayılan olarak, PHP bu hataları KAYDETMEZ." PHP'den kim bahsetti? Sunucu 500 Günlüğünün PHP'de devre dışı bırakılması bir varsayımdır ve çoğu zaman yanlış bir varsayımdır. Apache, bir hataya neden olan modülden (bu durumda php) sunucu 500 hatalarını günlüğe kaydeder, ancak çoğu zaman /var/log/apache2/error.log (debian veya benzeri olduğu varsayılarak)
DeveloperChris

4
Bu cevap, hataları ekrana dökmek için kötü bir tavsiye ile başlar.
luqo33

11

Apache hata günlüğünüzden ayrı bir dosya olabilecek php hata günlüğünüzü kontrol edin.

Bunu bulun phpinfo()ve error_log özniteliğini kontrol edin. Ayarlanmamışsa. Ayarlayın: https://stackoverflow.com/a/12835262/445131

Belki post_max_size, göndermeye çalıştığınız şey için çok küçük veya diğer maksimum bellek ayarlarından biri çok düşük.


1
Soru şuydu: "Apache'nin Hata günlüğüne Dahili 500 hatası kaydetmesine nasıl neden olabilirim?" Bu muhtemelen bir yorum olmalı.
jww

11

Bununla karşılaştım ve bunun nedeni .htaccess dosyamdaki bir mod_authnz_ldap yapılandırmasıydı. Kesinlikle hiçbir şey kaydedilmiyordu, ancak 500 hatası almaya devam ettim.

Bu özel sorunla karşılaşırsanız, mod_authnz_ldap günlük düzeyini şu şekilde değiştirebilirsiniz:

LogLevel warn authnz_ldap_module:debug

Bu, mod_authnz_ldap için bir günlük hata ayıklama düzeyi kullanır ancak diğer her şey için uyarır ( https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel ).


1
Soru şuydu: "Apache'nin Hata günlüğüne Dahili 500 hatası kaydetmesine nasıl neden olabilirim?" Bu muhtemelen bir yorum olmalı.
jww

İyi gözlem. Bu hataları günlüğe kaydetmek için talimatlar ekledim.
bmaupin

7

Senin Eğer Internal Server Error bilgi günlük dosyalarında görünmüyor, muhtemelen gerek Apache hizmetini yeniden başlatın .

Apache 2.4'ün (en azından Windows platformunda) inatla günlük dosyalarını temizlemeyi reddetme eğiliminde olduğunu buldum - bunun yerine, günlüğe kaydedilen veriler uzun bir süre bellekte kalır. Performans açısından iyi bir fikir ama geliştirirken kafa karıştırıcı olabilir.


Bu benim için Linux'ta doğru cevaptı. Orijinal error.log dosyasını (bir karakter aygıt dosyası olan) sildikten ve onu touch 777 error.log ile değiştirdikten sonra bile, Apache yeniden başlatılıncaya kadar ona yazmazdı.
Adelmar

2

@ Eric-leschinski tarafından verilen cevaplar doğrudur.

Ancak Sunucu API'niz FPM / FastCGI ise başka bir durum daha var (Centos 8'de varsayılan veya phpinfo () işlevini kullanmayı kontrol edebilirsiniz)

Bu durumda:

  1. phpinfo()Bir php dosyasında çalıştırın ;
  2. Loaded Configuration FilePHP'niz için yapılandırma dosyasının nerede olduğunu görmek için param aranıyor.
  3. @ Eric-leschinski'nin yanıtı gibi yapılandırma dosyasını düzenleyin.
  4. Server APIParametreyi kontrol edin . Sunucunuz yalnızca apache handle API'sini kullanıyorsa -> apache'yi yeniden başlatın. Sunucunuz php-fpm kullanıyorsa php-fpm hizmetini yeniden başlatmalısınız

    systemctl php-fpm'yi yeniden başlat

    Php-fpm günlük klasöründeki günlük dosyasını kontrol edin. Örneğin/var/log/php-fpm/www-error.log


1

Benim durumumda bu, httpd.conf'daki ErrorLog yönergesiydi. Ben pes ettikten sonra kazara fark ettim. Keşfi paylaşmaya karar verdim) Şimdi 500 hatayı nerede bulacağımı biliyorum.


Eğer cevap daha fazla ayrıntı koyun lütfen Can
Yahya Hüseyin'i

Apache için Magento (CMS - İçerik Yönetim Sistemi) kullanıyorum. Magento çekirdek sınıflarını kullanan sayfamda 500 hatası oluştu. Hata mesajını nerede görebileceğimi bulamadım. Buradaki bazı cevaplara göre apache logs / etc / httpd / logs / error_log içinde arama yapmaya çalıştım. Ama orada hiçbir şey yoktu. Daha sonra, httpd.conf dosyamda belirli bir web sunucusu için günlük yolunu tanımlayan bir satır olduğunu öğrendim: <VirtualHost. ... ErrorLog / usr / www / log / error_log Bu nedenle, genel apache günlüğüne değil daha özel bir ana bilgisayar günlüğüne bakmam gerekiyordu.
Eugene Lycenok

1

HttpProtocolOptions UnsafeApache yapılandırma dosyanıza ekleyin ve apache sunucusunu yeniden başlatın. Hata ayrıntılarını gösterir.


0

Çalıştırdığınız php sürümünün kod tabanınızla eşleşip eşleşmediğini kontrol edin. Örneğin, yerel ortamınız php 5.4 çalıştırıyor olabilir (ve işler yolunda gidiyor olabilir) ve belki de kodunuzu php 5.3 kurulu olan yeni bir makinede test ediyorsunuzdur. Dizi () için [] gibi 5.4 sözdizimi kullanıyorsanız, yukarıda anlattığınız durumu alırsınız.


Soru şuydu: "Apache'nin Hata günlüğüne Dahili 500 hatası kaydetmesine nasıl neden olabilirim?" Bu muhtemelen bir yorum olmalı.
jww

0

Statik bir dosyaya erişmeyi deneyin. Bu da çalışmıyorsa, kök "/" veya "c: \" den dosyanızın dizinine tüm dizinlere gidin ve ".htaccess" dosyalarını içerip içermediklerini kontrol edin.

Bir keresinde "c: \" de bir dosya bırakmıştım ve çok garip sonuçlar aldı.


1
Soru şuydu: "Apache'nin Hata günlüğüne Dahili 500 hatası kaydetmesine nasıl neden olabilirim?"
jww

0

Lütfen kodunuzun herhangi bir yerinde hata raporlamayı devre dışı bırakıp bırakmadığınızı kontrol edin.

Kodumda onu devre dışı bıraktığım bir yer vardı, bu yüzden hata ayıklama kodunu bundan sonra ekledim:

require_once("inc/req.php");   <-- Error reporting is disabled here

// overwrite it
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.