Kesalahan Internal 500 Apache, tetapi tidak ada di log?

122

Saya mendapatkan 500 kesalahan Server Internal saat mencoba membuat HTTP POST ke alamat tertentu di aplikasi saya. Saya telah memeriksa log server di direktori log kustom yang ditentukan dalam file host virtual, tetapi kesalahan tidak muncul di sana, jadi debugging ini sangat menyebalkan.

Bagaimana cara membuat Apache mencatat kesalahan Internal 500 ke dalam log kesalahan?

wcolbert.dll
sumber
1
Saya memiliki masalah yang sama menggunakan PHP dengan host virtual .... tidak ada kesalahan (Apache2, Ubuntu). Akhirnya kehilangan modul PHP (mysql, json, dll.)
1
Di kami, itu mengirim mereka ke log akses (mungkin karena dari sudut pandang Apache, itu berfungsi dengan benar dan hanya meneruskannya, dari lapisan yang lebih dalam - dalam kasus kami, Penumpang / Rel). Letakkan saja catatan ini di sini jika ada yang menggaruk kepala.
Tom Hundt

Jawaban:

-4

Harap Dicatat: Poster asli tidak secara khusus menanyakan tentang PHP. Semua jawaban sentris php membuat asumsi besar tidak relevan dengan pertanyaan sebenarnya.

Log kesalahan default yang bertentangan dengan log kesalahan skrip biasanya memiliki kesalahan (lebih) spesifik. seringkali izin ditolak atau bahkan penerjemah yang tidak dapat ditemukan.

Ini berarti kesalahan hampir selalu ada pada skrip Anda. misalnya Anda mengunggah skrip perl tetapi tidak memberikan izin eksekusi? atau mungkin rusak di lingkungan linux jika Anda menulis skrip di windows dan kemudian mengunggahnya ke server tanpa mengubah ujung baris, Anda akan mendapatkan kesalahan ini.

di perl jika anda lupa

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

Anda akan mendapatkan kesalahan ini

Ada banyak alasan untuk itu. jadi harap periksa dulu log kesalahan Anda, lalu berikan beberapa informasi lebih lanjut.

Log kesalahan default sering kali dalam /var/log/httpd/error_logatau /var/log/apache2/error.log.

Alasan Anda melihat log error default (seperti yang ditunjukkan di atas) adalah karena error tidak selalu diposting ke log error kustom seperti yang ditentukan di host virtual.

Mengasumsikan linux dan belum tentu perl

PengembangChris
sumber
6
Saya memeriksa server ErrorLog, dan tidak ada yang bisa ditemukan di sana.
wcolbert
2
Anda benar, ternyata ada masalah dengan script php. Perpustakaan PEAR tidak dipasang. Saya menginstalnya di VPS saya dan semuanya baik-baik saja. Terima kasih semuanya!
wcolbert
262
Bagaimana "silakan periksa log" menjadi jawaban yang diterima untuk "mengapa log saya kosong"?
Álvaro González
5
Saya mengarahkan pengguna ke log kesalahan default, bukan log kesalahan kustom. Seringkali ketika skrip gagal karena suatu alasan kesalahan dialihkan ke log kesalahan default
DeveloperChris
2
Dengan PHP, saya tidak memiliki apa pun di log kesalahan apache yang dikonfigurasi, tetapi menemukan kesalahan dengan grep PHP /var/log/syslog. Mungkin karena saya pernah error_log = syslogmasuk /etc/php5/apache2/php.ini.
mivk
145

Mengapa 500 Kesalahan Server Internal tidak masuk ke log kesalahan apache Anda?

Kesalahan yang menyebabkan 500 Internal Server Error Anda berasal dari modul PHP. Secara default, PHP TIDAK mencatat kesalahan ini. Alasannya karena Anda ingin permintaan web berjalan secepat mungkin secara fisik dan merupakan bahaya keamanan untuk mencatat kesalahan ke layar tempat penyerang dapat mengamatinya.

Petunjuk untuk mengaktifkan Log Kesalahan Server Internal ini adalah untuk Ubuntu 12.10dengan PHP 5.3.10dan Apache/2.2.22.

Pastikan pembuatan log PHP diaktifkan:

  1. Temukan file php.ini Anda:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. Edit file itu sebagai root:

    sudo vi /etc/php5/apache2/php.ini
    
  3. Temukan baris ini di php.ini:

    display_errors = Off
    
  4. Ubah baris di atas menjadi ini:

    display_errors = On
    
  5. Di bagian bawah file, Anda akan melihat ini:

    ;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. Titik koma adalah komentar, yang berarti garis tersebut tidak berpengaruh. Ubah garis tersebut sehingga terlihat seperti ini:

    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
    

    Apa yang dikomunikasikan ini ke PHP adalah bahwa kami ingin mencatat semua kesalahan ini. Peringatan, akan ada pukulan kinerja yang besar, jadi Anda tidak ingin ini diaktifkan pada produksi karena pencatatan membutuhkan kerja dan pekerjaan membutuhkan waktu, waktu membutuhkan uang.

  7. Memulai ulang PHP dan Apache akan menerapkan perubahan tersebut.

  8. Lakukan apa yang Anda lakukan untuk menyebabkan kesalahan 500 Server Internal lagi, dan periksa log:

    tail -f /var/log/apache2/error.log
    
  9. Anda akan melihat kesalahan 500 di bagian akhir, seperti ini:

    [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
    
Eric Leschinski
sumber
46
display_errorsmencetak kesalahan di layar . log_errorsmenulis kesalahan di file log .
daVe
11
Ini harus menjadi jawaban kanonik untuk pertanyaan ini.
David
9
@WanLiqun Ini adalah info yang cukup bagus tetapi hanya berlaku untuk PHP, yang bahkan tidak disebutkan dalam pertanyaan.
Álvaro González
1
"Kesalahan yang menyebabkan 500 Kesalahan Server Internal Anda berasal dari modul PHP. Secara default, PHP TIDAK mencatat kesalahan ini." Siapa yang menyebut PHP? Server 500 Logging yang dinonaktifkan di PHP adalah asumsi dan seringkali merupakan asumsi yang salah. Apache akan mencatat kesalahan server 500 dari modul kesalahan (dalam hal ini php) tetapi paling sering itu akan masuk ke /var/log/apache2/error.log (dengan asumsi debian atau serupa)
DeveloperChris
4
Jawaban ini dimulai dengan saran buruk untuk membuang kesalahan ke layar.
luqo33
11

Periksa log kesalahan php Anda yang mungkin merupakan file terpisah dari log kesalahan apache Anda.

Temukan dengan membuka phpinfo()dan memeriksa atribut error_log. Jika tidak diatur. Setel: https://stackoverflow.com/a/12835262/445131

Mungkin post_max_size Anda terlalu kecil untuk apa yang Anda coba posting, atau salah satu pengaturan memori maksimal lainnya terlalu rendah.

jsonH
sumber
1
Pertanyaannya adalah, "Bagaimana cara membuat Apache mencatat kesalahan Internal 500 ke dalam log kesalahan?" Ini mungkin sebuah komentar.
jww
11

Saya baru saja mengalami ini dan itu karena kesalahan konfigurasi mod_authnz_ldap di file .htaccess saya. Sama sekali tidak ada yang dicatat, tetapi saya terus mendapatkan kesalahan 500.

Jika Anda mengalami masalah khusus ini, Anda dapat mengubah level log mod_authnz_ldap seperti:

LogLevel warn authnz_ldap_module:debug

Itu akan menggunakan tingkat log debug untuk mod_authnz_ldap tetapi memperingatkan untuk yang lainnya ( https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel ).

bmaupin
sumber
1
Pertanyaannya adalah, "Bagaimana cara membuat Apache mencatat kesalahan Internal 500 ke dalam log kesalahan?" Ini mungkin sebuah komentar.
jww
Pengamatan yang bagus. Saya telah menambahkan instruksi untuk mencatat kesalahan tersebut.
bmaupin
7

Jika informasi Kesalahan Server Internal Anda tidak muncul di file log, Anda mungkin perlu memulai ulang layanan Apache .

Saya telah menemukan bahwa Apache 2.4 (setidaknya pada platform Windows) cenderung dengan keras kepala menolak untuk membersihkan file log — sebaliknya, data yang dicatat tetap berada di memori untuk waktu yang cukup lama. Itu ide yang bagus dari sudut pandang kinerja tetapi bisa membingungkan saat berkembang.

Álvaro González
sumber
Ini adalah jawaban yang benar untuk saya di Linux. Bahkan setelah menghapus error.log asli (yang merupakan file perangkat karakter) dan menggantinya dengan error.log sentuh 777, Apache tidak akan menulis padanya sampai di-restart.
Adelmar
2

Jawaban oleh @ eric-leschinski benar.

Tetapi ada kasus lain jika API Server Anda adalah FPM / FastCGI (Default pada Centos 8 atau Anda dapat memeriksa menggunakan fungsi phpinfo ())

Pada kasus ini:

  1. Jalankan phpinfo()dalam file php;
  2. Mencari Loaded Configuration Fileparam untuk melihat di mana file config untuk PHP Anda.
  3. Edit file config seperti jawaban @ eric-leschinski.
  4. Periksa Server APIparameter. Jika server Anda hanya menggunakan apache handle API -> restart apache. Jika server Anda menggunakan php-fpm, Anda harus memulai ulang layanan php-fpm

    systemctl restart php-fpm

    Periksa file log di folder log php-fpm. misalnya/var/log/php-fpm/www-error.log

Ngô Văn Thao
sumber
1

Dalam kasus saya itu adalah direktif ErrorLog di httpd.conf. Hanya secara tidak sengaja menyadarinya setelah saya menyerah. Memutuskan untuk berbagi penemuan) Sekarang saya tahu di mana menemukan 500 kesalahan.

Eugene Lycenok
sumber
Bisakah Anda memberikan rincian lebih lanjut dalam jawaban Anda
Yahya Hussein
Saya menggunakan Magento (CMS - Content Management System) untuk Apache. Ada kesalahan 500 di halaman saya menggunakan kelas inti Magento. Saya tidak dapat menemukan di mana saya bisa melihat pesan kesalahan. Menurut beberapa jawaban di sini saya mencoba mencari di log apache / etc / httpd / logs / error_log. Tapi tidak ada apa-apa di sana. Kemudian saya menemukan bahwa ada baris di httpd.conf saya untuk host web tertentu itu, yang menentukan jalur log: <VirtualHost. ... ErrorLog / usr / www / log / error_log Jadi saya perlu melihat ke log host yang lebih spesifik, bukan log apache yang umum.
Eugene Lycenok
1

Tambahkan HttpProtocolOptions Unsafeke file konfigurasi apache Anda dan mulai ulang server apache. Ini menunjukkan detail kesalahan.

Pedang
sumber
0

Periksa apakah versi php yang Anda jalankan cocok dengan basis kode Anda. Misalnya, lingkungan lokal Anda mungkin menjalankan php 5.4 (dan semuanya berjalan dengan baik) dan mungkin Anda menguji kode Anda pada mesin baru yang menginstal php 5.3. Jika Anda menggunakan sintaks 5.4 seperti [] untuk array () maka Anda akan mendapatkan situasi yang Anda jelaskan di atas.

John Erck
sumber
Pertanyaannya adalah, "Bagaimana cara membuat Apache mencatat kesalahan Internal 500 ke dalam log kesalahan?" Ini mungkin sebuah komentar.
jww
0

Coba akses file statis. Jika ini tidak berhasil, pergilah ke semua direktori dari root "/" atau "c: \" ke direktori file Anda dan periksa apakah direktori tersebut berisi file ".htaccess".

Saya pernah meninggalkan file di "c: \" dan hasilnya paling aneh.

Lothar
sumber
1
Pertanyaannya adalah, "Bagaimana cara membuat Apache mencatat kesalahan Internal 500 ke dalam log kesalahan?"
jww
0

Harap periksa apakah Anda menonaktifkan pelaporan kesalahan di suatu tempat dalam kode Anda.

Ada tempat di kode saya di mana saya telah menonaktifkannya, jadi saya menambahkan kode debug setelahnya:

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);
Hitam
sumber