Я получаю 500 внутренних ошибок сервера, когда пытаюсь сделать HTTP POST на определенный адрес в своем приложении. Я просмотрел журналы сервера в специальном каталоге журналов, указанном в файле виртуальных хостов, но ошибка не появляется там, поэтому отладка это была боль в заднице.
Как заставить Apache регистрировать внутренние ошибки 500 в журнале ошибок?
Журнал ошибок обычно имеет (более) конкретную ошибку. часто это может быть отказано в разрешении или даже интерпретаторе, который не может быть найден.
Это означает, что ошибка почти всегда лежит на вашем script. например, вы загрузили perl script, но не дали ему разрешения на выполнение? или, возможно, он был поврежден в среде linux, если вы пишете script в 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 включено:
Найдите свой файл php.ini:
el@apollo:~$ locate php.ini
/etc/php5/apache2/php.ini
Отредактируйте этот файл как root:
sudo vi /etc/php5/apache2/php.ini
Найдите эту строку в php.ini:
display_errors = Off
Измените вышеприведенную строку на эту:
display_errors = On
Ниже в файле вы увидите это:
;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
Точки с запятой являются комментариями, это означает, что строки не вступают в силу. Измените эти строки, чтобы они выглядели так:
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 это говорит о том, что мы хотим регистрировать все эти ошибки. Внимание, это приведет к значительному снижению производительности, поэтому вы не хотите, чтобы это включалось на производстве, поскольку ведение журнала требует работы, а работа требует времени, время стоит денег.
Перезапуск PHP и Apache должен применить изменения.
Сделайте то, что вы сделали, чтобы снова вызвать 500 Internal Server error, и проверьте журнал:
vi /var/log/apache2/error.log
Вы должны увидеть ошибку 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
display_errors
печатает ошибки на экране . log_errors
записывает ошибки в файл журнала .
Я просто столкнулся с этим, и это произошло из-за неправильной конфигурации mod_authnz_ldap в моем файле .htaccess. Абсолютно ничего не регистрировалось, но я все время получал ошибку 500.
Если вы столкнулись с этой конкретной проблемой, вы можете изменить уровень журнала mod_authnz_ldap следующим образом:
LogLevel warn authnz_ldap_module:debug
Это будет использовать уровень debug debug для mod_authnz_ldap, но предупредить обо всем остальном (https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel).
Проверьте журнал ошибок php, который может быть отдельным файлом из вашего журнала ошибок apache.
Найдите его, перейдя в phpinfo()
и проверьте атрибут error_log.
Если он не установлен. Установите его: https://stackoverflow.com/questions/12834583/where-can-i-find-error-log-files
Возможно, ваш post_max_size слишком мал для того, что вы пытаетесь опубликовать, или один из других максимальных параметров памяти слишком мал.
Если ваша информация об ошибках внутреннего сервера не отображается в файлах журналов, вам, вероятно, потребуется перезапустить службу Apache.
Я обнаружил, что Apache 2.4 (по крайней мере на платформе Windows), как правило, упорно не промывать лог файлы, вместо этого, вошли данные остаются в памяти на некоторое время. Это хорошая идея с точки зрения производительности, но при разработке может быть запутанной.
Убедитесь, что версия php, которую вы запускаете, соответствует вашей кодовой базе. Например, ваша локальная среда может работать php 5.4 (и все работает нормально), и, возможно, вы тестируете свой код на новой машине, на которой установлен php 5.3. Если вы используете синтаксис 5.4, например [] для array(), вы получите описанную выше ситуацию.
В моем случае это была директива ErrorLog в httpd.conf. Просто случайно заметил это уже после того, как я сдался. Решил поделиться открытием) Теперь я знаю, где найти 500 ошибок.
Попробуйте получить доступ к статическому файлу. Если это не работает, то перейдите ко всем каталогам из корня "/" или "c: \" в каталог вашего файла и проверьте, содержат ли они файлы ".htaccess".
Я однажды оставил файл в "c: \", и он имел самые странные результаты.