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

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

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


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


Ответы (11)


Обратите внимание: исходный постер конкретно не спрашивал о 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

person DeveloperChris    schedule 19.01.2011
comment
Я проверил сервер ErrorLog, и там ничего не найдено. - person wcolbert; 19.01.2011
comment
Вы правы, проблема оказалась в php скрипте. Библиотека PEAR не была установлена. Я установил его на свой VPS, и все в порядке. Спасибо всем! - person wcolbert; 19.01.2011
comment
Как можно проверить журналы, чтобы они были принятым ответом на вопрос, почему мои журналы пусты? - person Álvaro González; 22.08.2015
comment
Я указал пользователю на журналы ошибок по умолчанию, а не на пользовательские журналы ошибок. Часто, когда скрипт по какой-то причине не работает, ошибка перенаправляется в журналы ошибок по умолчанию. - person DeveloperChris; 02.03.2016
comment
С PHP у меня ничего не было в настроенных журналах ошибок apache, но ошибки были обнаружены с grep PHP /var/log/syslog. Наверное, потому что у меня было error_log = syslog в /etc/php5/apache2/php.ini. - person mivk; 18.11.2016
comment
У меня было 775 разрешений, но Apache это не понравилось. Поменял на 744 и снова заработал. Хромой. - person Hypershadsy; 16.05.2017
comment
Для разработки рекомендуется проверить /etc/php5/apache2/php.ini, чтобы убедиться, что display_errors и display_startup_errors включены. Существует множество различных настроек, предназначенных для скрытия сообщений об ошибках от удаленных программ просмотра в целях безопасности. Все это необходимо настроить так, чтобы они отображали эту информацию для использования местным разработчиком. - person Sam Azer; 07.06.2018

Почему 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
    
person Eric Leschinski    schedule 11.12.2013
comment
display_errors выводит ошибки на экран. log_errors записывает ошибки в файл журнала. - person daVe; 16.08.2014
comment
Это должен быть канонический ответ на этот вопрос. - person David; 30.10.2014
comment
@WanLiqun Это довольно хорошая информация, но она применима только к PHP, который даже не упоминается в вопросе. - person Álvaro González; 22.08.2015
comment
Ошибки, вызывающие вашу внутреннюю ошибку сервера 500, происходят из модуля PHP. По умолчанию PHP НЕ регистрирует эти ошибки. Кто упомянул PHP? Отключение ведения журнала на сервере 500 в PHP является предположением и чаще всего ошибочным. Apache будет регистрировать ошибки сервера 500 из модуля, вызвавшего сбой (в данном случае php), но чаще всего он попадает в /var/log/apache2/error.log (при условии, что debian или аналогичный) - person DeveloperChris; 07.06.2016
comment
500 Internal Server error может относиться к .htaccess файлу, пытающемуся использовать недоступный модуль Apache! Для проверки отключите модуль заголовков и добавьте его в .htaccess файл: Header add X-Custom-Header "My header content". - person Zuul; 25.07.2017
comment
Как расстраивает имя контроллера: p - person Nabin; 26.04.2018
comment
Этот ответ начинается с плохого совета, как выводить ошибки на экран. - person luqo33; 25.01.2019
comment
Почему за это проголосовали, а за принятый ответ - против? когда был задан этот вопрос, PHP находился в зачаточном состоянии, а PERL был преобладающим языком. Тогда (а иногда даже сейчас), если интерпретатор выйдет из строя из-за недопустимого сценария, ошибка будет обходить журнал виртуальных хостов и попадет в журнал серверов по умолчанию, поэтому OP не смог найти проблему. Следовательно, ответ принимается. - person DeveloperChris; 17.03.2019
comment
Для меня эта неприятная ситуация возникла из-за того, что я забыл установить модули PHP, от которых зависело мое приложение. - person Adam Friedman; 05.12.2019

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

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

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

person jsonH    schedule 18.07.2012
comment
Вопрос был в следующем: Как заставить Apache записывать 500 внутренних ошибок в журнал ошибок? Вероятно, это должен быть комментарий. - person jww; 22.12.2017

Я только что столкнулся с этим, и это произошло из-за неправильной конфигурации 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).

person bmaupin    schedule 13.05.2013
comment
Вопрос был в следующем: Как заставить Apache записывать 500 внутренних ошибок в журнал ошибок? Вероятно, это должен быть комментарий. - person jww; 22.12.2017
comment
Хорошее наблюдение. Я добавил инструкции по регистрации этих ошибок. - person bmaupin; 23.03.2018

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

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

person Álvaro González    schedule 22.08.2015
comment
Для меня это был правильный ответ в Linux. Даже после удаления исходного error.log (который был файлом символьного устройства) и его замены на touch 777 error.log Apache не записывал в него записи до перезапуска. - person Adelmar; 02.12.2015

Ответы @ eric-leschinski верны.

Но есть еще один случай, если ваш серверный API - это FPM / FastCGI (по умолчанию на Centos 8 или вы можете проверить использование функции phpinfo ())

В этом случае:

  1. Запустите phpinfo() в файле php;
  2. Ищем параметр Loaded Configuration File, чтобы узнать, где находится файл конфигурации для вашего PHP.
  3. Отредактируйте файл конфигурации, как ответ @ eric-leschinski.
  4. # P4 #
    # P5 #
    # P6 #
person Ngô Văn Thao    schedule 28.12.2019

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

person Saber    schedule 16.03.2019

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

В моем коде было место, где я отключил его, поэтому я добавил отладочный код после него:

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);
person Black    schedule 29.06.2020

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

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

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

person John Erck    schedule 09.04.2013
comment
Вопрос был в следующем: Как заставить Apache записывать 500 внутренних ошибок в журнал ошибок? Вероятно, это должен быть комментарий. - person jww; 22.12.2017

Попробуйте получить доступ к статическому файлу. Если и это не работает, перейдите во все каталоги от корня «/» или «c: \» до каталога вашего файла и проверьте, содержат ли они файлы «.htaccess».

Однажды я оставил файл в "c: \", и это дало самые странные результаты.

person Lothar    schedule 28.05.2016
comment
Вопрос был в следующем: Как заставить Apache регистрировать внутренние 500 ошибок в журнале ошибок? - person jww; 22.12.2017