해결: LNMP 구조 에서 php 페이지 에 접근 하 는 중 500 오류 발생

3885 단어 PHPnginxcgi500fastcgi
현재 LNMP 구조 가 유행 하고 있 습 니 다.
그러나 때때로 우 리 는 영문 도 모 르 는 문제 에 부 딪 힐 때 가 있다.
바로 우리 가 php 페이지 를 방 문 했 을 때 서버 가 "HTTP / 1.1 500 내부 서버 오류" 를 되 돌려 주 는 오류 입 니 다.
이 잘못 은 사람 으로 하여 금 상상 할 수 없 게 하 는데, nginx 에 문제 가 생 긴 줄 알 았 습 니까?
사실은 phop 코드 문법 오류 로 인 한 것 입 니 다.
기본적으로 방문 한 phop 스 크 립 트 에 문법 오류 가 포함 되 어 있 으 면 서버 는 빈 '200 ok' 페이지 로 돌아 갑 니 다.
php. ini 에 있 는 fastcgi. errorheader 옵션 은 이 경우 HTTP 오류 코드 를 만 들 수 있 습 니 다.
웹 서버 가 이 오류 코드 를 정확하게 차단 하고 처리 할 수 있 도록 합 니 다. 예 를 들 어 phop 코드 에서 header () 를 직접 호출 하여 500 상태 코드 를 되 돌려 주 는 것 과 같 습 니 다.
header("HTTP/1.1 500 Internal Server Error");
phop 소스 코드 를 통 해 알 수 있 듯 이 이번 phop 버 전 은 phop - 5.3.26 입 니 다.
원본 파일: php - 5.3.26 / main / main. c
1110 줄 은 다음 과 같다.
if(!PG(display_errors) && !SG(headers_sent) && SG(sapi_headers).http_response_code == 200){
sapi_header_line ctr = {0};
ctr.line = "HTTP/1.0 500 Internal Server Error";
ctr.line_len = strlen(ctr.line);
sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC);
}

if 조건 을 통 해 알 수 있 듯 이 display 를 만족 시 키 고 있 습 니 다.errors = 0 과 headerssent = 0 즉 공백 페이지 와
http_response_code = 200 의 조건 에서 500 오 류 를 되 돌려 줍 니 다.
이 500 오 류 를 처음 보면 nginx 가 잘못 되 었 다 고 착각 하기 쉬 우 므 로 다른 응답 코드 로 적당 하 게 조정 할 수 있 습 니 다.
php. ini 에 fastcgi. error 만 설정 하면header 옵션 을 사용 하면 503 을 되 돌려 줍 니 다.
fastcgi.error_header = "HTTP/1.1 503 PHP Parse Error"
이렇게 하면 잘못된 근본 원인 을 나 타 낼 수 있 고 LNMP 를 배치 할 때 추가 할 수 있다.
이 옵션 을 추가 하지 않 았 을 때 다음 방법 으로 디 버 깅 할 수 있 습 니 다.
방문 오류 페이지 를 테스트 파일 로 복사 하여 온라인 업무 와 안전 문제 에 영향 을 주지 않도록 합 니 다.
예: cp index. php index. test. php
display 열기errors 옵션 을 선택 하면 파일 시작 에 다음 과 같은 내용 을 추가 합 니 다.
ini_set('display_errors','1');
error_reporting(E_ALL);

이렇게 하면 잘못 을 드 러 낼 수 있다. 이상!
며칠 전에 이 500 오류 문 제 를 만 났 는데 상황 은 이 렇 습 니 다.
어떤 개발 자 는 사이트 방문 에 500 오류 가 발생 했다 고 말 했다. 그 는 ie 와 chrome 도 방문 할 수 없고 fireforx 만 방문 할 수 있다 고 말 했다. 나 도 직접 시도 해 보 았 다. ie 와 chrome 은 확실히 방문 할 수 없다. 내 기 계 는 fireforx 를 설치 하지 않 았 기 때문에 시도 하지 않 았 다. 나 는 예전 에 회사 에서 도 이 문 제 를 만난 적 이 있다 는 것 이 생각 나 쿠키 문 제 를 생각 하고 서버 에 올 라 가서 phop 프로그램 코드 를 검사 했다.마지막 으로 이 코드 를 발 견 했 습 니 다.
protected function __construct($domain){
    ...
    session_name(self::sess_name);
    $this->sess_id = empty($_COOKIE[session_name()]) ? $this->gen_sid() : $_COOKIE[session_name()];
    ...
}
private function gen_sid(){
    return md5(uniqid(microtime() . getClientIP(), true));
}

프로그램 이 9 줄 까지 실 행 될 때 500 오류 가 발생 합 니 다. 가장 큰 가능성 은 getClient IP 함수 로 인 한 것 입 니 다. 이 함 수 를 직접 호출 하면 500 오 류 를 되 돌려 줍 니 다. vardump (function exists (getClient IP) 디 버 깅, false 출력, 문 제 는 여기 있 습 니 다. 이 함 수 를 정의 하면 해 결 됩 니 다.그런데 왜 fireforx 는 방문 할 수 있 고 ie 와 chrome 은 방문 할 수 없 습 니까?이것 은 fireforx 에 쿠키 가 존재 하기 때 문 입 니 다. ie 와 chrome 은 모두 첫 번 째 방문 입 니 다. 쿠키 가 없 는데 왜 쿠키 가 없 으 면 이 문제 가 발생 합 니까?이것 은 책임 으로 돌려 야 한다.
$this->sess_id = empty($_COOKIE[session_name()]) ? $this->gen_sid() : $_COOKIE[session_name()];

처음 방문 할 때 쿠키 가 없어 서 empty ($ COOKIE [session name ()] 는 true 입 니 다.
$this - > gensid (), getClient IP 함 수 를 찾 을 수 없 는 오류 가 발생 합 니 다. 쿠키 가 존재 하면 $this - > gen 을 호출 하지 않 습 니 다.sid () 가 아 닌 사칭 뒤에 있 는 $COOKIE [session name ()], 문제 없어, 하하!사실 이렇게 조사 하 는 것 은 좀 부자연스럽다. 바로 오류 보 고 를 열 면 오류 가 나타난다. 예 를 들 어:
ini_set('display_errors','1');
error_reporting(E_ALL);

다음 오류 정 보 를 표시 하면 문 제 를 쉽게 발견 할 수 있 습 니 다. good
Fatal error: Call to undefined function getClientIP()

또한 php - fpm. conf 에 설 치 된 php. ini 옵션 은 php. ini 에 설 치 된 옵션 보다 우선 합 니 다. 예 를 들 어
php. ini 에 display 설정errors = on
php - fpm. conf 에 php 설정flag[display_errors] = off
그러면 결국 오 프.

좋은 웹페이지 즐겨찾기