내 앱의 특정 주소로 HTTP POST를 수행하려고하면 500 개의 내부 서버 오류가 발생합니다. 가상 호스트 파일에 지정된 사용자 지정 로그 디렉터리의 서버 로그를 살펴 봤지만 오류가 표시되지 않아 디버깅이 엉덩이에 고통 스러웠습니다.
Apache가 내부 500 오류를 오류 로그에 기록하도록하려면 어떻게해야합니까?
내 앱의 특정 주소로 HTTP POST를 수행하려고하면 500 개의 내부 서버 오류가 발생합니다. 가상 호스트 파일에 지정된 사용자 지정 로그 디렉터리의 서버 로그를 살펴 봤지만 오류가 표시되지 않아 디버깅이 엉덩이에 고통 스러웠습니다.
Apache가 내부 500 오류를 오류 로그에 기록하도록하려면 어떻게해야합니까?
답변:
참고 : 원래 포스터는 PHP에 대해 구체적으로 묻지 않았습니다. 모든 PHP 중심 답변은 실제 질문과 관련이없는 큰 가정을합니다.
스크립트 오류 로그와 반대로 기본 오류 로그에는 일반적으로 (더 많은) 특정 오류가 있습니다. 종종 권한이 거부되거나 심지어 찾을 수없는 통역사 일 수도 있습니다.
이것은 오류가 거의 항상 스크립트에 있음을 의미합니다. 예를 들어 펄 스크립트를 업로드했지만 실행 권한을 부여하지 않았습니까? 또는 Windows에서 스크립트를 작성한 다음 줄 끝이 변환되지 않고 서버에 업로드하면 Linux 환경에서 손상되었을 수 있습니다.이 오류가 발생합니다.
잊어 버린 경우 펄에서
print "content-type: text/html\r\n\r\n";
이 오류가 발생합니다
그것에 대한 많은 이유가 있습니다. 따라서 먼저 오류 로그를 확인한 다음 추가 정보를 제공하십시오.
기본 오류 로그는 종종 /var/log/httpd/error_log
또는에 /var/log/apache2/error.log
있습니다.
기본 오류 로그 (위에 표시된대로)를 보는 이유는 오류가 가상 호스트에 정의 된대로 사용자 지정 오류 로그에 항상 게시되는 것은 아니기 때문입니다.
리눅스를 가정하고 반드시 펄은 아닙니다.
grep PHP /var/log/syslog
. 아마 내가했기 때문에 error_log = syslog
에서 /etc/php5/apache2/php.ini
.
500 개의 내부 서버 오류가 아파치 오류 로그에 기록되지 않는 이유는 무엇입니까?
500 내부 서버 오류를 일으키는 오류는 PHP 모듈에서 발생합니다. 기본적으로 PHP는 이러한 오류를 기록하지 않습니다. 웹 요청이 물리적으로 가능한 한 빨리 진행되기를 원하는 이유는 공격자가이를 관찰 할 수있는 화면에 오류를 기록하는 것이 보안 위험입니다.
내부 서버 오류 로깅을 활성화하기위한이 지침은 Ubuntu 12.10
with PHP 5.3.10
및에 대한 것 입니다 Apache/2.2.22
.
PHP 로깅이 켜져 있는지 확인하십시오.
php.ini 파일을 찾습니다.
el@apollo:~$ locate php.ini
/etc/php5/apache2/php.ini
해당 파일을 루트로 편집하십시오.
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 내부 서버 오류를 발생시키기 위해 수행 한 작업을 다시 수행하고 로그를 확인하십시오.
tail -f /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/MessedUpController.php on line 249, referer:
https://nuclearreactor.com/abouttoblowup
display_errors
화면 에 오류를 인쇄합니다 . 로그 파일에log_errors
오류를 기록합니다 .
아파치 오류 로그와 별도의 파일 일 수있는 PHP 오류 로그를 확인하십시오.
찾아 가서 phpinfo()
error_log 속성을 확인하십시오. 설정되지 않은 경우. 설정 : https://stackoverflow.com/a/12835262/445131
post_max_size가 게시하려는 항목에 비해 너무 작거나 다른 최대 메모리 설정 중 하나가 너무 낮을 수 있습니다.
나는 방금 이것을 만났고 그것은 내 .htaccess 파일의 mod_authnz_ldap 잘못된 구성 때문이었습니다. 아무것도 기록되지 않았지만 계속 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 ).
귀하의 경우 내부 서버 오류 정보가 로그 파일에 표시되지 않습니다, 당신은 아마 필요가 아파치 서비스를 다시 시작합니다 .
Apache 2.4 (적어도 Windows 플랫폼에서는)가 로그 파일 플러시를 완고하게 거부하는 경향이 있음을 발견했습니다. 대신 로그 된 데이터는 꽤 오랫동안 메모리에 남아 있습니다. 성능 측면에서 보면 좋은 생각이지만 개발할 때 혼란 스러울 수 있습니다.
@ eric-leschinski의 답변이 정확합니다.
그러나 서버 API가 FPM / FastCGI 인 경우 다른 경우가 있습니다 (Centos 8의 기본값 또는 phpinfo () 함수 사용을 확인할 수 있음)
이 경우 :
phpinfo()
PHP 파일에서 .Loaded Configuration File
PHP의 구성 파일이 어디에 있는지 확인 param을 십시오.Server API
매개 변수를 확인하십시오 . 서버가 아파치 핸들 API 만 사용하는 경우-> 아파치를 다시 시작하십시오. 서버에서 php-fpm을 사용하는 경우 php-fpm 서비스를 다시 시작해야합니다.
systemctl 다시 시작 php-fpm
php-fpm 로그 폴더의 로그 파일을 확인하십시오. 예 :/var/log/php-fpm/www-error.log
제 경우에는 httpd.conf의 ErrorLog 지시문이었습니다. 내가 포기한 후 우연히 이미 그것을 발견했습니다. 발견을 공유하기로 결정했습니다.) 이제 500 오류를 찾을 수있는 위치를 알고 있습니다.