Внутрішня помилка 500 Apache, але нічого в журналах?


122

Я отримую 500 внутрішніх помилок сервера, коли намагаюся зробити HTTP POST за певною адресою в моєму додатку. Я заглянув у серверні журнали в користувальницький каталог журналів, вказаний у файлі віртуальних хостів, але помилка там не з’являється, тому налагодження це було болем у дупі.

Як змусити Apache записувати внутрішні 500 помилок у журнал помилок?


1
У мене була проблема з використанням PHP з віртуальними хостами .... помилок немає (Apache2, Ubuntu). Закінчено відсутні модулі PHP (mysql, json тощо)

1
З нашої, це було відправлення їх до журналу доступу (мабуть тому, що з точки зору Apache, воно працювало коректно і просто передавало їх уздовж, із глибшого шару - у нашому випадку Пасажира / Рейки). Просто кладу цю замітку сюди, якщо хтось почухає голову.
Том Гундт

Відповіді:


-4

Зверніть увагу: Оригінальний плакат спеціально не запитував про PHP. Усі відповіді, орієнтовані на php, роблять великі припущення, що не стосуються актуального питання.

Журнал помилок за замовчуванням, на відміну від журналів помилок скриптів, зазвичай має (більше) специфічну помилку. часто це буде дозволено відмовити чи навіть перекладача, який не можна знайти.

Це означає, що вина майже завжди лежить у вашому сценарії. наприклад, ви завантажили сценарій perl, але не дали йому виконувати дозволи? або, можливо, вона була пошкоджена в середовищі Linux, якщо ви пишете сценарій у Windows, а потім завантажуєте його на сервер без конвертування рядків, ви отримаєте цю помилку.

в перлі, якщо ви забудете

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

ви отримаєте цю помилку

Причин для цього багато. тому спочатку перевірте свій журнал помилок, а потім надайте додаткову інформацію.

Журнал помилок за замовчуванням часто знаходиться у /var/log/httpd/error_logабо /var/log/apache2/error.log.

Причина перегляду журналів помилок за замовчуванням (як зазначено вище) полягає в тому, що помилки не завжди публікуються у користувальницький журнал помилок, як визначено у віртуальному хості.

Передбачає Linux, а не обов'язково perl


6
Я перевірив сервер ErrorLog, і там нічого знайти.
wcolbert

1
Ви маєте рацію, виявилася проблема зі скриптом php. Бібліотека PEAR не була встановлена. Я встановив його на свій VPS і все добре. Дякую усім!
wcolbert

261
Як "будь ласка перевірити журнали" може бути прийнятою відповіддю на питання "чому мої журнали порожні"?
Альваро Гонсалес

4
Я вказував користувача на журнали помилок за замовчуванням, а не на власні журнали помилок. Часто, коли сценарій з певних причин виходить з ладу, помилка переходить у журнали помилок за замовчуванням
DeveloperChris

1
З PHP у мене не було нічого в налаштованих журналах помилок apache, але я знайшов помилки з grep PHP /var/log/syslog. Можливо, тому, що я мав error_log = syslogу /etc/php5/apache2/php.ini.
mivk

145

Чому 500 помилок внутрішнього сервера не реєструються у ваших журналах помилок apache?

Помилки, що викликають вашу помилку 500 внутрішніх серверів, надходять із модуля PHP. За замовчуванням PHP НЕ записує ці помилки. З огляду на те, що ви хочете, щоб веб-запити проходили якомога швидше фізично, і це небезпека безпеки для реєстрації помилок на екрані, де зловмисники можуть їх спостерігати.

Ці інструкції для того, щоб Internal Server Error Logging призначені для Ubuntu 12.10з PHP 5.3.10і Apache/2.2.22.

Переконайтесь, що журнал PHP увімкнено:

  1. Знайдіть файл php.ini:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. Відредагуйте цей файл як корінь:

    sudo vi /etc/php5/apache2/php.ini
    
  3. Знайдіть цей рядок у php.ini:

    display_errors = Off
    
  4. Змініть наведений рядок на цей:

    display_errors = On
    
  5. Знизу у файлі ви побачите це:

    ;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. Точки з комою є коментарями, це означає, що рядки не набувають чинності. Змініть ці рядки, щоб вони виглядали приблизно так:

    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
    

    Це повідомляє PHP, що ми хочемо зафіксувати всі ці помилки. Попередження, буде великий показник продуктивності, тому ви не хочете, щоб це було увімкнено у виробництві, оскільки ведення журналу займає роботу, а робота вимагає часу, часу коштує грошей.

  7. Перезапуск PHP та Apache має застосувати цю зміну.

  8. Зробіть те, що ви зробили, щоб знову викликати помилку 500 внутрішнього сервера, і перевірте журнал:

    tail -f /var/log/apache2/error.log
    
  9. Ви повинні побачити помилку 500 наприкінці, приблизно так:

    [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_errorsдрукує помилки на екрані . log_errorsзаписує помилки у файл журналу .
daVe

11
Це має бути канонічною відповіддю на це питання.
Девід

9
@WanLiqun Це досить непогана інформація, але вона стосується лише PHP, про який навіть не йдеться у питанні.
Альваро Гонсалес

1
"Помилки, що спричиняють вашу помилку 500 внутрішніх серверів, надходять із модуля PHP. За замовчуванням PHP НЕ записує ці помилки." Хто згадав PHP? Відключення журналу сервера 500 в PHP - це припущення і найчастіше неправильне припущення. Apache запише 500 помилок сервера з несправного модуля (у цьому випадку php), але найчастіше він перейде до /var/log/apache2/error.log (припустимо, дебіан або подібне)
DeveloperChris

4
Ця відповідь починається з поганої поради щодо скидання помилок на екран.
luqo33

11

Перевірте свій журнал помилок php, який може бути окремим файлом від журналу помилок apache.

Знайдіть його phpinfo()та перевірте на наявність атрибута error_log. Якщо він не встановлений. Встановіть його: https://stackoverflow.com/a/12835262/445131

Можливо, ваш post_max_size занадто малий для того, що ви намагаєтеся опублікувати, або один з інших параметрів максимальної пам'яті занадто низький.


1
Питання було: "Як я змушу Apache записувати внутрішні 500 помилок у журнал помилок?" Це, мабуть, має бути коментарем.
jww

11

Я щойно натрапив на це, і це було пов’язано з неправильною конфігурацією mod_authnz_ldap у моєму файлі .htaccess. Абсолютно нічого не реєстрували, але я постійно отримував помилку 500.

Якщо ви зіткнулися з цією проблемою, ви можете змінити рівень журналу mod_authnz_ldap так:

LogLevel warn authnz_ldap_module:debug

Це використовує рівень налагодження журналу для mod_authnz_ldap, але попередить про все інше ( https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel ).


1
Питання було: "Як я змушу Apache записувати внутрішні 500 помилок у журнал помилок?" Це, мабуть, має бути коментарем.
jww

Гарне спостереження. Я додав інструкції щодо реєстрації цих помилок.
бмаупін

7

Якщо інформація про внутрішню серверну помилку не відображається у файлах журналів, вам, можливо, потрібно перезапустити службу Apache .

Я виявив, що Apache 2.4 (принаймні на платформі Windows), як правило, вперто відмовляється від очищення файлів журналів - натомість зафіксовані дані залишаються в пам'яті досить довго. Це гарна ідея з точки зору продуктивності, але вона може бути заплутаною при розробці.


Це була правильна відповідь для мене в Linux. Навіть після видалення оригінального error.log (який був файлом символьного пристрою) і замінивши його на дотик 777 error.log, Apache не писав би до нього, поки не буде перезапущено.
Адельмар

2

Відповіді @ eric-leschinski правильні.

Але є інший випадок, якщо серверним API є FPM / FastCGI (за замовчуванням у Centos 8 або ви можете перевірити використання phpinfo () функції)

В цьому випадку:

  1. Виконати phpinfo()у файлі php;
  2. Шукаєте Loaded Configuration Fileпарам, щоб побачити, де налаштований файл для вашого PHP.
  3. Редагуйте конфігураційний файл, як-от відповідь @ eric-leschinski.
  4. Перевір Server APIпарам. Якщо ваш сервер використовує лише API для обробки файлів apache -> перезапустити apache. Якщо ваш сервер використовує php-fpm, ви повинні перезапустити службу php-fpm

    systemctl перезапустити php-fpm

    Перевірте файл журналу в папці журналу php-fpm. напр/var/log/php-fpm/www-error.log


1

У моєму випадку це була директива ErrorLog в httpd.conf. Просто випадково помітив це вже після того, як я здався. Вирішив поділитися відкриттям) Тепер я знаю, де знайти 500 помилок.


Чи можете ви, будь ласка, надіслати більше деталей у своїй відповіді
Yahya Hussein

Я використовую Magento (CMS - система управління вмістом) для Apache. На моїй сторінці сталася помилка 500 за допомогою основних класів Magento. Я не міг знайти, де я міг побачити повідомлення про помилку. Відповідно до деяких відповідей тут, я намагався шукати в журналах apache / etc / httpd / logs / error_log. Але там нічого не було. Пізніше я дізнався, що в моєму httpd.conf є рядок для конкретного веб-хоста, що визначає шлях журналу: <VirtualHost. ... ErrorLog / usr / www / log / error_log Тому мені потрібно було звернутися до більш конкретного журналу хостів, а не до загального журналу apache.
Євген Лиценок

1

Додайте HttpProtocolOptions Unsafeу свій конфігураційний файл apache та перезапустіть сервер apache. Він показує деталі помилки.


0

Перевірте, чи відповідає версія php, що відповідає вашій кодовій базі. Наприклад, у вашому локальному середовищі працює php 5.4 (і все працює нормально), і, можливо, ви тестуєте свій код на новій машині, на якій встановлено php 5.3. Якщо ви використовуєте синтаксис 5.4, такий як [] для масиву (), ви отримаєте ситуацію, яку ви описали вище.


Питання було: "Як я змушу Apache записувати внутрішні 500 помилок у журнал помилок?" Це, мабуть, має бути коментарем.
jww

0

Спробуйте отримати доступ до статичного файлу. Якщо це не працює, то перейдіть до всіх каталогів з кореня "/" або "c: \" до каталогу вашого файлу і перевірте, чи містять вони файли ".htaccess".

Я одного разу залишив файл у "c: \", і він мав найдивніші результати.


1
Питання було: "Як я змушу Apache записувати внутрішні 500 помилок у журнал помилок?"
jww

0

Перевірте, чи деактивовано повідомлення про помилки десь у вашому коді.

У моєму коді було місце, де я його відключив, тому я додав код налагодження після нього:

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.