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

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

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

13 ответов

Решение

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

Это означает, что ошибка почти всегда лежит в вашем сценарии. Например, вы загрузили скрипт 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

Почему 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 Internal Server error, и проверьте журнал:

    vi /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/FuckedUpController.php on line 249, referer: 
    https://nuclearreactor.com/abouttoblowup
    

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

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

Найдите это, перейдя в phpinfo() и проверьте атрибут error_log. Если это не установлено. Установите его: /questions/28226992/gde-ya-mogu-najti-fajlyi-zhurnala-oshibok/28227016#28227016

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

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

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

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

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

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

  1. Бегать phpinfo() в php файле;
  2. Находясь в поиске Loaded Configuration File param, чтобы увидеть, где находится файл конфигурации для вашего 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

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

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

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

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

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

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

ДобавлятьScriptLog logs/cgi_log[1] в файл конфигурации вашего сервера, то в него будут напечатаны синтаксические ошибки Python или Bash (и, конечно, все остальные ошибки тоже — за исключением ошибок PHP, они контролируются другой директивой).

Это сообщение о неправильной конфигурации появилось у меня, когда я использовал символ комментария # не в столбце 1 (помните, что Apache — это старое программное обеспечение, в котором номера столбцов и пробелы иногда могут быть значительными).

Options -Indexes # Never show folder indices

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

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

Другие вопросы по тегам