PHP-FPM 소개
CGI 프로토콜 및 FastCGI 프로토콜
각 동적 언어( PHP , Python 등) 코드 파일은 해당 파서를 통과해야 서버가 인식할 수 있으며 CGI 프로토콜을 사용하여 인터프리터와 서버가 서로 통신할 수 있습니다. 서버에서 PHP 파일을 구문 분석하려면 서버가 PHP 파일을 구문 분석할 수 있도록 해당 CGI 프로토콜과 결합된 PHP 인터프리터를 사용해야 합니다.
CGI 메커니즘은 각 요청에 대해 CGI 프로세스를 포크하고 요청이 완료된 후 프로세스를 종료해야 하므로 실제 응용 프로그램에서는 리소스 낭비이므로 CGI의 향상된 버전인 FastCGI , FastCGI는 요청이 처리된 후 프로세스가 종료되지 않지만 여러 요청이 계속 처리되므로 효율성이 크게 향상됩니다.
PHP-FPM이란
PHP-FPM은 FastCGI를 구현하고 프로세스 관리를 제공하는 PHP-FastCGI 프로세스 관리자입니다. 기능. 프로세스에는 마스터 프로세스와 작업자 프로세스의 두 가지 유형이 포함됩니다. 포트를 수신하고 서버에서 요청을 수신하는 마스터 프로세스는 하나만 있지만 일반적으로 여러 작업자 프로세스가 있습니다(특정 개수는 실제 프로세스에 따라 구성됩니다). 필요), 각 프로세스에는 내부에 하나의 코드가 내장되어 있습니다. PHP 인터프리터는 코드가 실제로 실행되는 곳입니다.
Nginx 및 php-fpm 통신 메커니즘
웹사이트(예: www.test.com)를 방문할 때 처리 흐름은 다음과 같습니다. 다음과 같습니다:
www.test.com | | Nginx | | 路由到 www.test.com/index.php | | 加载 nginx 的 fast-cgi 模块 | | fast-cgi 监听 127.0.0.1:9000 地址 | | www.test.com/index.php 请求到达 127.0.0.1:9000 | | 等待处理...
Nginx와 php-fpm의 조합
Linux에서 nginx와 php-fpm 간의 통신에는 TCP 소켓이 포함됩니다. Unix 소켓은 두 가지 방법으로 가능합니다.
tcp 소켓의 장점은 서버를 교차할 수 있다는 것입니다. 이 방법은 nginx와 php-fpm이 동일한 시스템에 있지 않을 때만 사용할 수 있습니다.
IPC(프로세스 간 통신) 소켓이라고도 하는 Unix 소켓은 동일한 호스트에서 프로세스 간 통신을 구현하는 데 사용됩니다. 이 방법을 사용하려면 nginx 구성 파일에 php-fpm 소켓을 채워야 합니다. . 파일 위치.
두 가지 방법의 데이터 전송 과정은 아래 그림과 같습니다.
두 가지 방법의 차이점: # 🎜🎜## 🎜🎜#Unix 소켓은 네트워크 프로토콜 스택을 통과할 필요가 없으므로 패키징 및 언패킹, 체크섬 계산, 시퀀스 번호 및 응답 유지 등의 작업이 필요하지 않습니다. 단지 하나의 프로세스에서 애플리케이션 계층 데이터를 복사할 뿐입니다. 다른 사람에게. 따라서 tcp 소켓보다 효율성이 높아 불필요한 tcp 오버헤드를 줄일 수 있습니다. 그러나 동시성이 높을 때 Unix 소켓은 불안정하며 연결 지향 프로토콜을 지원하지 않으면 대량의 장기 캐시가 생성됩니다. 예외. TCP와 같은 연결 지향 프로토콜은 통신의 정확성과 무결성을 더 잘 보장할 수 있습니다.
Nginx와 php-fpm의 조합에는 해당 구성 파일의 설정만 필요합니다.
1) Nginx의 구성
은 Take로 시작합니다. tcp 소켓 통신 예시
server { listen 80; #监听 80 端口,接收http请求 server_name www.test.com; #就是网站地址 root /usr/local/etc/nginx/www/huxintong_admin; # 准备存放代码工程的路径 #路由到网站根目录 www.test.com 时候的处理 location / { index index.php; #跳转到 www.test.com/index.php autoindex on; } #当请求网站下 php 文件的时候,反向代理到 php-fpm location ~ \.php$ { include /usr/local/etc/nginx/fastcgi.conf; #加载 nginx 的 fastcgi 模块 fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; # tcp 方式,php-fpm 监听的 IP 地址和端口 # fasrcgi_pass /usr/run/php-fpm.sock # unix socket 连接方式 } }
2) php-fpm 구성
listen = 127.0.0.1:9000 # 或者下面这样 listen = /var/run/php-fpm.sock
is in use 유닉스 소켓 모드로 접속 시 소켓 파일은 본질적으로 파일이기 때문에 권한 제어에 문제가 있으므로 nginx 프로세스의 권한과 php-fpm의 권한에 주의해야 합니다. 허가 없이 접근하라는 메시지가 표시됩니다. (해당 구성 파일에 사용자를 설정합니다.) 위 구성을 통해 php-fpm과 nginx 간의 통신을 완료할 수 있습니다.
애플리케이션에서 선택nginx와 php-fpm이 동일한 서버에서 실행되고 동시성이 높지 않은 경우(더 이상 1000 이상), nginx와 php-fpm 간의 통신 효율성을 향상시키려면 unix 소켓을 선택하십시오.
동시 업무가 많은 경우, 보다 안정적인 TCP 소켓을 사용하여 로드 밸런싱, 커널 최적화 등 운영 및 유지 관리 방법을 통해 효율성을 유지하는 것을 고려해 보세요.
동시성이 높지만 여전히 유닉스 소켓을 사용하고 싶다면 다음 방법을 통해 유닉스 소켓의 안정성을 향상시킬 수 있습니다.
1) sock 파일을 /dev/shm 디렉토리에 저장하세요. 메모리를 더 빠르게 읽고 쓸 수 있도록 이 디렉토리에 sock 파일을 저장하세요.
2) 백로그 개선
backlog 기본 비트 128, 1024. 이 값은 일반 QPS로 대체되며 구성은 다음과 같습니다.
nginx.conf 파일
server { listen 80 default backlog = 1024; }
listen.backlog = 1024
/dev/shm에 새 양말 파일을 생성하고, nginx의 업스트림 모듈을 통해 두 양말 파일에 대한 요청을 로드 밸런싱하고, 두 양말 파일을 php-의 두 세트에 매핑합니다. fpm 인스턴스.
개인 요약, 틀린 내용이 있으면 정정해주세요~
관련 추천: "
PHP 튜토리얼위 내용은 PHP-FPM과 Nginx 간의 통신 메커니즘 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!