이 기사에서는 Nginx와 php-fpm 간의 통신 메커니즘에 대해 설명하고, 두 통신 방법의 차이점을 소개하고, Nginx와 php-fpm의 조합을 구성하는 방법을 알아보고, 애플리케이션에서 통신 방법을 선택하는 방법을 분석합니다. 모두에게 도움이 되기를 바랍니다!
각 동적 언어(PHP, Python 등)의 코드 파일은 해당 파서를 통과해야 서버에서 인식할 수 있으며, CGI 프로토콜이 사용됩니다. 인터프리터와 서버가 서로 통신할 수 있도록 합니다. 서버에서 PHP 파일을 구문 분석하려면 서버가 PHP 파일을 구문 분석할 수 있도록 해당 CGI 프로토콜과 결합된 PHP 인터프리터를 사용해야 합니다.
CGI의 메커니즘은 요청이 처리될 때마다 CGI 프로세스를 포크하고 요청이 완료된 후 프로세스를 종료해야 하는데 이는 실제 응용 프로그램에서는 자원 낭비이기 때문에 CGI의 향상된 버전인 FastCGI가 등장했습니다. 요청이 처리된 후 FastCGI 프로세스는 종료되지 않지만 계속해서 여러 요청을 처리하므로 효율성이 크게 향상됩니다.
PHP-FPM은 PHP-FastCGI 프로세스 관리자이며 FastCGI를 구현한 것이며 프로세스 관리 기능을 제공합니다. 프로세스에는 마스터 프로세스와 작업자 프로세스의 두 가지 유형이 포함됩니다. 포트를 수신하고 서버에서 요청을 수신하는 마스터 프로세스는 하나만 있지만 일반적으로 여러 작업자 프로세스가 있습니다(특정 개수는 실제 프로세스에 따라 구성됩니다). 필요), 각 프로세스에는 코드가 실제로 실행되는 곳이 하나 포함되어 있습니다.
웹사이트(예: 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 | | 等待处理...
on Linux, nginx는 tcp 소켓과 unix 소켓의 두 가지 방법으로 php-fpm과 통신합니다.
TCP 소켓의 장점은 서버 전반에 걸쳐 사용할 수 있다는 것입니다. 이 방법은 nginx와 php-fpm이 동일한 시스템에 있지 않은 경우에만 사용할 수 있습니다.
IPC(프로세스 간 통신) 소켓이라고도 하는 Unix 소켓은 동일한 호스트에서 프로세스 간 통신을 구현하는 데 사용됩니다. 이 방법을 사용하려면 nginx 구성 파일에 php-fpm의 소켓 파일 위치를 채워야 합니다.
두 가지 방법의 데이터 전송 과정은 아래 그림과 같습니다.
두 방법의 차이점:
유닉스 소켓은 네트워크 프로토콜 스택을 거치지 않기 때문에, 그럴 필요가 없습니다. 압축 및 압축 풀기, 체크섬 계산, 시퀀스 번호 및 응답 유지 관리 등을 수행하고 한 프로세스에서 다른 프로세스로 애플리케이션 계층 데이터를 복사하기만 하면 됩니다. 따라서 tcp 소켓보다 효율성이 높아 불필요한 tcp 오버헤드를 줄일 수 있습니다. 그러나 동시성이 높을 때 Unix 소켓은 불안정하며 연결 지향 프로토콜을 지원하지 않으면 대량의 장기 캐시가 생성됩니다. 예외. TCP와 같은 연결 지향 프로토콜은 통신의 정확성과 무결성을 더 잘 보장할 수 있습니다.
Nginx와 php-fpm을 결합하려면 해당 구성 파일에서만 설정을 지정하면 됩니다.
1) Nginx의 구성
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
유닉스 소켓 방식을 사용하여 연결하는 경우 소켓 파일은 본질적으로 파일이므로 권한 제어 문제가 있으므로 nginx 프로세스의 권한과 php-fpm의 권한에 주의해야 합니다. 그렇지 않으면 허가 없이 접근하라는 메시지가 표시됩니다. (해당 구성 파일에 사용자를 설정하세요.)
위 구성을 통해 php-fpm과 nginx 간의 통신을 완료할 수 있습니다.
nginx와 php-fpm이 동일한 서버에서 실행 중이고 동시성이 높지 않은 경우(1000 이하) nginx와 php-fpm의 통신 효율성을 향상시키려면 unix 소켓을 선택하세요.
동시 업무가 많은 경우에는 로드 밸런싱, 커널 최적화 등 운영 및 유지 관리 방법을 통해 효율성을 유지하기 위해 보다 안정적인 TCP 소켓을 사용하는 것을 고려해 보세요.
동시성이 높지만 여전히 Unix 소켓을 사용하고 싶다면 다음 방법을 통해 Unix 소켓의 안정성을 향상시킬 수 있습니다.
1) sock 파일을 /dev/shm 디렉터리에 넣습니다. 메모리를 더 빠르게 읽고 쓸 수 있도록 이 디렉터리의 메모리에 sock 파일을 넣습니다.
2) 백로그 개선
기본 백로그 비트는 128, 1024입니다. 이 값은 자신의 일반 QPS로 변환하는 것이 가장 좋으며 구성은 다음과 같습니다.
nginx.conf 파일에서
server { listen 80 default backlog = 1024; }
php-fpm.conf 파일에서
listen.backlog = 1024
3) sock 파일과 php-fpm 인스턴스를 추가하세요
/dev/shm에 새 sock 파일을 생성하고 요청을 전달하세요. nginx의 업스트림 모듈을 통해 로드는 두 개의 sock 파일로 균형을 이루고 두 개의 sock 파일은 두 세트의 php-fpm 인스턴스에 매핑됩니다.
추천 학습: "PHP 비디오 튜토리얼"
위 내용은 Nginx와 php-fpm 간의 통신 메커니즘에 대해 이야기하고 이를 구성하는 방법을 살펴보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!