내부 오류 500 Apache이지만 로그에 아무것도 없습니까?


122

내 앱의 특정 주소로 HTTP POST를 수행하려고하면 500 개의 내부 서버 오류가 발생합니다. 가상 호스트 파일에 지정된 사용자 지정 로그 디렉터리의 서버 로그를 살펴 봤지만 오류가 표시되지 않아 디버깅이 엉덩이에 고통 스러웠습니다.

Apache가 내부 500 오류를 오류 로그에 기록하도록하려면 어떻게해야합니까?


1
가상 호스트와 함께 PHP를 사용하여 동일한 문제가 발생했습니다 .... 오류 없음 (Apache2, Ubuntu). 결국 PHP 모듈 (mysql, json 등)이 누락 됨

1
우리의 경우 액세스 로그로 전송했습니다 (아마도 Apache의 관점에서 올바르게 작동하고 더 깊은 계층-우리의 경우 Passenger / Rails에서 단순히 전달했기 때문일 것입니다). 누군가가 머리를 긁적 일 경우를 대비하여이 메모를 여기에 넣으십시오.
Tom Hundt

답변:


-4

참고 : 원래 포스터는 PHP에 대해 구체적으로 묻지 않았습니다. 모든 PHP 중심 답변은 실제 질문과 관련이없는 큰 가정을합니다.

스크립트 오류 로그와 반대로 기본 오류 로그에는 일반적으로 (더 많은) 특정 오류가 있습니다. 종종 권한이 거부되거나 심지어 찾을 수없는 통역사 일 수도 있습니다.

이것은 오류가 거의 항상 스크립트에 있음을 의미합니다. 예를 들어 펄 스크립트를 업로드했지만 실행 권한을 부여하지 않았습니까? 또는 Windows에서 스크립트를 작성한 다음 줄 끝이 변환되지 않고 서버에 업로드하면 Linux 환경에서 손상되었을 수 있습니다.이 오류가 발생합니다.

잊어 버린 경우 펄에서

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

이 오류가 발생합니다

그것에 대한 많은 이유가 있습니다. 따라서 먼저 오류 로그를 확인한 다음 추가 정보를 제공하십시오.

기본 오류 로그는 종종 /var/log/httpd/error_log또는에 /var/log/apache2/error.log있습니다.

기본 오류 로그 (위에 표시된대로)를 보는 이유는 오류가 가상 호스트에 정의 된대로 사용자 지정 오류 로그에 항상 게시되는 것은 아니기 때문입니다.

리눅스를 가정하고 반드시 펄은 아닙니다.


6
서버 ErrorLog를 확인했는데 거기에 아무것도 없습니다.
wcolbert

1
맞습니다. PHP 스크립트에 문제가있는 것으로 나타났습니다. PEAR 라이브러리가 설치되지 않았습니다. 내 VPS에 설치했고 모든 것이 잘되었습니다. 모두 감사합니다!
wcolbert

261
"로그를 확인하십시오"가 "내 로그가 비어있는 이유"에 대한 대답이 될 수 있습니까?
Álvaro González

4
사용자에게 사용자 지정 오류 로그가 아닌 기본 오류 로그를 가리 켰습니다. 종종 어떤 이유로 스크립트가 실패하면 오류가 기본 오류 로그로 라우팅됩니다
DeveloperChris

1
PHP를 사용하면 구성된 아파치 오류 로그에 아무것도 없지만 grep PHP /var/log/syslog. 아마 내가했기 때문에 error_log = syslog에서 /etc/php5/apache2/php.ini.
mivk

145

500 개의 내부 서버 오류가 아파치 오류 로그에 기록되지 않는 이유는 무엇입니까?

500 내부 서버 오류를 일으키는 오류는 PHP 모듈에서 발생합니다. 기본적으로 PHP는 이러한 오류를 기록하지 않습니다. 웹 요청이 물리적으로 가능한 한 빨리 진행되기를 원하는 이유는 공격자가이를 관찰 할 수있는 화면에 오류를 기록하는 것이 보안 위험입니다.

내부 서버 오류 로깅을 활성화하기위한이 지침은 Ubuntu 12.10with PHP 5.3.10및에 대한 것 입니다 Apache/2.2.22.

PHP 로깅이 켜져 있는지 확인하십시오.

  1. php.ini 파일을 찾습니다.

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. 해당 파일을 루트로 편집하십시오.

    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
이것이이 질문에 대한 정식 답변이어야합니다.
David

9
@WanLiqun 꽤 좋은 정보이지만 PHP에만 적용되며 질문에서 언급되지도 않습니다.
Álvaro González

1
"500 내부 서버 오류를 일으키는 오류는 PHP 모듈에서 발생합니다. 기본적으로 PHP는 이러한 오류를 기록하지 않습니다." 누가 PHP를 언급 했습니까? PHP에서 서버 500 로깅이 비활성화되는 것은 가정이며 대부분 잘못된 가정입니다. Apache는 오류가있는 모듈 (이 경우 php)에서 서버 500 오류를 기록하지만 대부분 /var/log/apache2/error.log(debian 또는 이와 유사한 것으로 가정)로 이동합니다.
DeveloperChris

4
이 대답은 화면에 오류를 덤프하라는 나쁜 조언으로 시작됩니다.
luqo33

11

아파치 오류 로그와 별도의 파일 일 수있는 PHP 오류 로그를 확인하십시오.

찾아 가서 phpinfo()error_log 속성을 확인하십시오. 설정되지 않은 경우. 설정 : https://stackoverflow.com/a/12835262/445131

post_max_size가 게시하려는 항목에 비해 너무 작거나 다른 최대 메모리 설정 중 하나가 너무 낮을 수 있습니다.


1
질문은 "어떻게하면 Apache가 내부 500 오류를 오류 로그에 기록하게하나요?" 였습니다. 이것은 아마도 주석이어야합니다.
jww

11

나는 방금 이것을 만났고 그것은 내 .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 ).


1
질문은 "어떻게하면 Apache가 내부 500 오류를 오류 로그에 기록하게하나요?" 였습니다. 이것은 아마도 주석이어야합니다.
jww

좋은 관찰입니다. 이러한 오류를 기록하기위한 지침을 추가했습니다.
bmaupin

7

귀하의 경우 내부 서버 오류 정보가 로그 파일에 표시되지 않습니다, 당신은 아마 필요가 아파치 서비스를 다시 시작합니다 .

Apache 2.4 (적어도 Windows 플랫폼에서는)가 로그 파일 플러시를 완고하게 거부하는 경향이 있음을 발견했습니다. 대신 로그 된 데이터는 꽤 오랫동안 메모리에 남아 있습니다. 성능 측면에서 보면 좋은 생각이지만 개발할 때 혼란 스러울 수 있습니다.


이것은 Linux에서 저에게 정답이었습니다. 원래 error.log (문자 장치 파일)를 삭제하고 touch 777 error.log로 바꾼 후에도 Apache는 다시 시작될 때까지 기록하지 않습니다.
Adelmar

2

@ eric-leschinski의 답변이 정확합니다.

그러나 서버 API가 FPM / FastCGI 인 경우 다른 경우가 있습니다 (Centos 8의 기본값 또는 phpinfo () 함수 사용을 확인할 수 있음)

이 경우 :

  1. 운영 phpinfo()PHP 파일에서 .
  2. 찾고있는 Loaded Configuration FilePHP의 구성 파일이 어디에 있는지 확인 param을 십시오.
  3. @ eric-leschinski의 대답과 같은 구성 파일을 편집하십시오.
  4. Server API매개 변수를 확인하십시오 . 서버가 아파치 핸들 API 만 사용하는 경우-> 아파치를 다시 시작하십시오. 서버에서 php-fpm을 사용하는 경우 php-fpm 서비스를 다시 시작해야합니다.

    systemctl 다시 시작 php-fpm

    php-fpm 로그 폴더의 로그 파일을 확인하십시오. 예 :/var/log/php-fpm/www-error.log


1

제 경우에는 httpd.conf의 ErrorLog 지시문이었습니다. 내가 포기한 후 우연히 이미 그것을 발견했습니다. 발견을 공유하기로 결정했습니다.) 이제 500 오류를 찾을 수있는 위치를 알고 있습니다.


당신은 당신의 대답에 자세한 내용을 넣어 주실 래요
야야 후세인

Apache 용 Magento (CMS-Content Management System)를 사용하고 있습니다. Magento 코어 클래스를 사용하는 내 페이지에 500 오류가 발생했습니다. 오류 메시지를 볼 수있는 위치를 찾을 수 없습니다. 여기에 몇 가지 답변에 따르면 아파치 로그 / etc / httpd / logs / error_log에서 검색하려고했습니다. 그러나 거기에는 아무것도 없었습니다. 나중에 특정 웹 호스트에 대한 내 httpd.conf에 로그 경로를 정의하는 줄이 있음을 발견했습니다. <VirtualHost. ... ErrorLog / usr / www / log / error_log 그래서 저는 일반적인 아파치 로그가 아닌보다 구체적인 호스트 로그를 찾아야했습니다.
Eugene Lycenok

1

HttpProtocolOptions Unsafe아파치 구성 파일에 추가 하고 아파치 서버를 다시 시작하십시오. 오류 세부 정보를 보여줍니다.


0

실행중인 PHP 버전이 코드베이스와 일치하는지 확인하십시오. 예를 들어, 로컬 환경에서 php 5.4를 실행 중일 수 있으며 (그리고 모든 것이 잘 실행 됨) php 5.3이 설치된 새 컴퓨터에서 코드를 테스트하고있을 수 있습니다. array ()에 []와 같은 5.4 구문을 사용하는 경우 위에서 설명한 상황을 얻을 수 있습니다.


질문은 "어떻게하면 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.