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

122

Я получаю 500 ошибок внутреннего сервера, когда пытаюсь выполнить HTTP POST на определенный адрес в моем приложении. Я просмотрел журналы сервера в каталоге настраиваемых журналов, указанном в файле виртуальных хостов, но ошибки там не было, поэтому отладка этого была головной болью.

Как заставить Apache записывать 500 внутренних ошибок в журнал ошибок?

wcolbert
источник
1
У меня была такая же проблема с использованием PHP с виртуальными хостами ... без ошибок (Apache2, Ubuntu). Закончилось отсутствие модулей PHP (mysql, json и т. Д.)
1
В нашем случае он отправлял их в журнал доступа (предположительно, потому что с точки зрения Apache он работал правильно и просто передавал их из более глубокого уровня - в нашем случае Passenger / Rails). Просто поместите эту записку сюда на случай, если кто-то почесает голову.
Tom Hundt

Ответы:

-4

Обратите внимание: исходный плакат не спрашивал конкретно о PHP. Все ответы, ориентированные на php, делают большие предположения, не относящиеся к фактическому вопросу.

Журнал ошибок по умолчанию, в отличие от журналов ошибок скриптов, обычно содержит (более) конкретную ошибку. часто это будет отказ в разрешениях или даже переводчик, который не может быть найден.

Это означает, что ошибка почти всегда лежит в вашем сценарии. например, вы загрузили perl-скрипт, но не дали ему права на выполнение? или, возможно, он был поврежден в среде Linux, если вы напишете сценарий в Windows, а затем загрузите его на сервер без преобразования окончаний строк, вы получите эту ошибку.

в Perl, если вы забудете

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

вы получите эту ошибку

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

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

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

Предполагает Linux и не обязательно Perl

DeveloperChris
источник
6
Я проверил сервер ErrorLog, и там ничего не найдено.
wcolbert
2
Вы правы, проблема оказалась в php скрипте. Библиотека PEAR не была установлена. Я установил его на свой VPS, и все в порядке. Спасибо всем!
wcolbert
262
Как «пожалуйста, проверьте журналы» может быть принятым ответом на «почему мои журналы пусты»?
Альваро Гонсалес,
5
Я указал пользователю на журналы ошибок по умолчанию, а не на пользовательские журналы ошибок. Часто, когда скрипт по какой-то причине дает сбой, ошибка перенаправляется в журналы ошибок по умолчанию
DeveloperChris,
2
С PHP у меня ничего не было в настроенных журналах ошибок apache, но ошибки были обнаружены с grep PHP /var/log/syslog. Возможно потому , что я имел error_log = syslogв /etc/php5/apache2/php.ini.
mivk
145

Почему 500 внутренних ошибок сервера не регистрируются в журналах ошибок apache?

Ошибки, вызывающие вашу внутреннюю ошибку сервера 500, исходят из модуля PHP. По умолчанию PHP НЕ регистрирует эти ошибки. Причина в том, что вы хотите, чтобы веб-запросы выполнялись как можно быстрее, и угроза безопасности - записывать ошибки на экран, где злоумышленники могут их заметить.

Эти инструкции по включению регистрации ошибок внутреннего сервера предназначены для использования 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. Отредактируйте этот файл как root:

    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 Internal Server Error, происходят из модуля PHP. По умолчанию PHP НЕ регистрирует эти ошибки». Кто упомянул PHP? Отключение ведения журнала Server 500 в PHP является предположением и чаще всего ошибочным. Apache будет регистрировать ошибки сервера 500 из модуля, вызвавшего сбой (в данном случае php), но чаще всего он попадает в /var/log/apache2/error.log (при условии, что debian или аналогичный)
DeveloperChris
4
Этот ответ начинается с плохого совета, как выводить ошибки на экран.
luqo33
11

Проверьте журнал ошибок php, который может быть отдельным файлом от журнала ошибок apache.

Найдите его, перейдя phpinfo()и проверив атрибут error_log. Если не установлен. Установите его: https://stackoverflow.com/a/12835262/445131

Возможно, ваш post_max_size слишком мал для того, что вы пытаетесь опубликовать, или одна из других настроек максимальной памяти слишком мала.

jsonH
источник
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 ).

bmaupin
источник
1
Возник вопрос: «Как заставить Apache записывать 500 внутренних ошибок в журнал ошибок?» Вероятно, это должен быть комментарий.
jww
Хорошее наблюдение. Я добавил инструкции по регистрации этих ошибок.
bmaupin
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 handle -> перезапустите apache. Если ваш сервер использует php-fpm, вы должны перезапустить службу php-fpm

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

    Проверьте файл журнала в папке журнала php-fpm. например/var/log/php-fpm/www-error.log

Нго Ван Тхао
источник
1

В моем случае это была директива ErrorLog в httpd.conf. Просто случайно заметил это уже после того, как сдался. Решил поделиться открытием) Теперь знаю, где искать 500-ошибки.

Евгений Лыченок
источник
Не могли бы вы изложить более подробную информацию в своем ответе
Яхья Хусейн
Я использую Magento (CMS - система управления контентом) для Apache. На моей странице при использовании основных классов Magento произошла ошибка 500. Я не мог найти, где можно было увидеть сообщение об ошибке. Согласно некоторым ответам здесь я попытался выполнить поиск в журналах apache / etc / httpd / logs / error_log. Но там ничего не было. Позже я обнаружил, что в моем httpd.conf есть строка для этого конкретного веб-хоста, определяющая путь к журналу: <VirtualHost. ... ErrorLog / usr / www / log / error_log Итак, мне нужно было посмотреть более конкретный журнал хоста, а не общий журнал apache.
Eugene Lycenok
1

Добавьте HttpProtocolOptions Unsafeв свой файл конфигурации apache и перезапустите сервер apache. Он показывает детали ошибки.

сабля
источник
0

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

Джон Эрк
источник
Возник вопрос: «Как заставить 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);
черный
источник