Nginx + PHP FPM의 작동 방식

6046 단어 php-fpmnginxPHP

Nginx의 기본 지식



Nginx란?



· 단일 스레드, 비동기, 이벤트 기반 웹 서버
・스레드는 프로세스로서 독립적이며 멀티 프로세스로 동작 가능
・경량적인 실장
・로드 밸런싱, 캐시 등 프록시로서의 이용도 가능

Nginx의 라이프 사이클



· 마스터 프로세스가 구성을 읽고 포트를 바인딩합니다.
· 마스터 프로세스가 작업자 프로세스를 시작합니다.
· 작업자가 청취를 시작하고 요청을 처리합니다.
· config가 다시로드되면 새로운 작업자를 만들고 이전 작업자로 바꿉니다.
· 마스터 프로세스가 떨어지고 처리가 종료됩니다.



Nginx worker



· 웹 서버로서의 모든 처리를 담당합니다.
・worker는 싱글스레드로 동작한다
・IO 이벤트의 시스템 콜로서 epoll , kqueue 등을 이용한다
events {
    use epoll;
}



프록시로 Nginx



클라이언트 요청을 upstream으로 릴레이
・Reverse Proxy(Ruby on Rails 등)
· FastCGI Proxy (PHP FPM 등)

Nginx의 FastCGI Proxing





PHP FPM의 기본 지식



PHP FPM이란?



· PHP FastCGI Proccess Manager
· FastCGI 인터페이스가있는 PHP 실행 환경
· Nginx에서 본 PHP 실행 서버



Nginx와 PHP FPM 연결



Nginx 설정


location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
}



정적 파일 검색 흐름





PHP 파일 검색 흐름





자세히 보기 Nginx 오류



"Primary script unknown" while reading response header from upstream



· PHP FPM이 지정된 PHP 파일을 찾을 수 없음



-> 존재하지 않는 경로가 지정되지 않았는지 확인

client intended to send too large body



· 클라이언트에서 POST 된 데이터가 너무 큽니다.



-> Nginx upload_max_filesize 조정
-> php.ini의 post_max_size 조정
-> php.ini의 upload_max_filesize 조정

-> Nginx의 client_body_buffer_size는 중요하지 않습니다.
-> Nginx의 fastcgi_buffer_size는 중요하지 않습니다.

a client request body is buffered to a temporary file



· 클라이언트의 요청 본문이 메모리 버퍼의 용량을 초과했기 때문에 임시 파일에 씁니다.

-> 상황은 "client intended to send too large body"와 비슷하고 클라이언트에서 보낸 데이터 크기 문제
-> Nginx의 client_body_buffer_size 조정

upstream sent too big header while reading response header from upstream



· PHP FPM 응답 헤더가 너무 큽니다.



-> Nginx의 fastcgi_buffer_size 조정
-> PHP 앱이 큰 응답 헤더 (쿠키 등)를 반환하지 않는지 확인

upstream timed out



· PHP FPM에서 회신이 반환되지 않습니다.
<?php
  sleep(100000000000000);
?>



-> Nginx의 fastcgi_read_timeout 조정
-> AWS의 ELB를 사용하는 경우는 ELB의 Idle Timeout도 확인하는 것이 좋을지도

-> php.ini의 max_execution_time은 중요하지 않습니다.
 * 위와 관련된 오류는 "Fatal error: Maximum execution time of 60 seconds exceeded"

참고



· Inside NGINX: How We Designed for Performance & Scale
· The Architecture of Open Source Applications (Volume 2): nginx
· Understanding and Implementing FastCGI Proxying in Nginx
· PHP와 SAPI와 ZendEngine3 - SlideShare
· nginx로 역방향 프록시 할 때 HTTP 응답 헤더의 크기에주의
· nginx 요청 본문 버퍼링 문제와 개선 방법
· PHP 스크립트 실행 시간 제어 (max_execution_time) - hogehoge foobar Blog Style5
· PHP로 파일을 업로드 할 때 설정 | maidsphere

좋은 웹페이지 즐겨찾기