> 백엔드 개발 > PHP 문제 > php-fpm의 설치 경로는 무엇입니까?

php-fpm의 설치 경로는 무엇입니까?

PHPz
풀어 주다: 2023-03-05 22:46:02
원래의
6091명이 탐색했습니다.

php-fpm 설치 경로: 1. centos와 같은 Linux 플랫폼에서는 "/usr/local/php/etc/" 및 "/usr/local/php/sbin/" 디렉토리에 있습니다. 2. Mac의 경우; 플랫폼의 경우 "/etc/" 및 "/usr/bin/" 디렉터리 아래에 있습니다.

php-fpm의 설치 경로는 무엇입니까?

1. PHP에서 fastcgi와 php-fpm은 무엇인가요?

최근에 php의 성능에 대해 연구하고 배우던 중에 사실cgi와 php-fpm을 보고 제가 아는 바가 거의 없었습니다. .. 거의 이해가 안 된다고 할 수 있는데, 생각해보면 꽤 무서운 일이다. 이 부분을 주의 깊게 연구하기로 결정했습니다.

다음 글을 참고하고 연구했습니다.
1. mod_php, mod_fastcgi 및 php-fpm 소개, 비교 및 ​​성능 데이터
2. 실제 Nginx_replacement

fastcgi 및 php-fpm을 단계별로 소개하기 위해 먼저 PHP 주변 환경에 대해 조금씩 이야기해 보세요. 왜. 갑자기 인생이 너무 피곤한 것 같아요!

먼저 웹 서버에 대해 이야기합시다

php는 웹용으로 탄생한 백엔드 언어입니다. 물론 우리 PHP 개들이 그것을 가장 잘 알고 있습니다. 따라서 PHP는 백엔드 언어일 뿐이므로 웹 기능을 제공하려면 웹 서버에 의존해야 합니다. 물론 웹 애플리케이션에 다른 백엔드 언어를 사용하는 경우에도 웹 서버에 의존해야 합니다. 좋아요, 웹 서버는 PHP에서 도입되었습니다. 좋습니다!

그럼 일반적인 웹 서버는 무엇인가요? PHP Dogs에서 가장 많이 사용하는 것은 Apache이고 다른 것들도 있습니다:

  • apache
  • nginx
  • IIS
  • lighttpd
  • tomcat

기본적으로 위의 것들은 PHP와 함께 사용됩니다. 가장 인기 있는 것 Apache와 Nginx가 있습니다.

완전한 PHP 액세스를 설명하기 위해 먼저 웹 서버로 Apache를 사용하겠습니다.

php-fpm의 설치 경로는 무엇입니까?

이 그림은 mysql 데이터베이스

mod_php 모드

와 결합된 PHP 및 Apache의 전체 웹 액세스 흐름 차트를 설명합니다. 위에서 PHP는 웹 기능 서비스를 제공하기 위해 웹 서버에 의존해야 한다고 명시했습니다. 이제 그들이 어떻게 친구가 되었는지 살펴보겠습니다.

우리가 가장 많이 사용하는 것은 Apache입니다. 그러면 아파치가 PHP 코드를 인식하도록 활성화하는 방법을 기억해 보세요. Apache 구성 파일 httpd.conf에 다음 문장을 추가하거나 수정해야 합니까?

//加入以下2句
LoadModule php5_module D:/php/php5apache2_2.dll
AddType application/x-httpd-php .php

//将下面的
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
//将其修改为:
<IfModule dir_module>
    DirectoryIndex index.html index.htm index.php index.phtml
</IfModule>
로그인 후 복사

위의 수동 구성은 Windows에서 php와 apache 환경을 설치한 후 Linux에서 소스 코드 설치는 대략 다음과 같이 구성됩니다.

./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars
로그인 후 복사

따라서 이러한 방식의 공통 본질은 LoadModule을 사용하여 php5_module을 로드하는 것입니다. 이는 PHP를 Apache의 하위 모듈로 실행하는 것입니다. 웹을 통해 PHP 파일에 액세스할 때 Apache는 php5_module을 호출하여 PHP 코드를 구문 분석합니다. LoadModule来加载php5_module,就是把php作为apache的一个子模块来运行。当通过web访问php文件时,apache就会调用php5_module来解析php代码。

那么php5_module是怎么来将数据传给php解析器来解析php代码的呢?

答案是通过sapi

我们再来看一张图,详细的说说apache 与 php 与 sapi的关系:

php-fpm의 설치 경로는 무엇입니까?

从上面图中,我们看出了sapi就是这样的一个中间过程,SAPI提供了一个和外部通信的接口,有点类似于socket,使得PHP可以和其他应用进行交互数据(apache,nginx,cli等)。php默认提供了很多种SAPI,常见的给apache和nginx的php5_module,CGI,给IIS的ISAPI,还有Shell的CLI。

所以,以上的apache调用php执行的过程如下:

apache -> httpd -> php5_module -> sapi -> php
로그인 후 복사

好了。apache与php通过php5_module的方式就搞清楚了吧!

我们把这种运行方式叫做mod_php模式

mod_fastcgi模式

上面我们仔细说了php与apache通过php5_module,php5_module通过sapi的方式访问php,来达到php web的整个流程。

上面也说到了sapi,sapi是php提供的统一接口,它提供给了php5_module和cgi等方式供web服务器来链接和解析php代码。上面讲到的php5_module加载模式,我们称之为mod_php

그럼 php5_module은 PHP 코드를 구문 분석하기 위해 어떻게 데이터를 PHP 파서에 전달합니까?

답은 sapi를 통해서입니다

apache, php, sapi의 관계를 자세히 이야기하기 위해 또 다른 그림을 살펴보겠습니다.

php-fpm의 설치 경로는 무엇입니까?

에서 위 그림에서 sapi는 중간 프로세스라는 것을 알 수 있습니다. SAPI는 socket과 다소 유사한 외부 통신용 인터페이스를 제공하여 PHP가 다른 애플리케이션과 통신할 수 있도록 해줍니다. 대화형 데이터(Apache, nginx, cli 등) PHP는 기본적으로 Apache 및 nginx용 공통 php5_module, IIS용 ISAPI, Shell CLI를 포함하여 다양한 종류의 SAPI를 제공합니다.

🎜그래서 위의 apache call php 실행 과정은 다음과 같습니다. 🎜
[root@localhost /]# cd /lamp/php-5.4.11 & vi config.nice
&#39;./configure&#39; \
&#39;--prefix=/usr/local/php&#39; \
&#39;--with-config-file-path=/usr/local/php/etc/&#39; \
&#39;--with-apxs2=/usr/local/apache/bin/apxs&#39; \
&#39;--with-mysql=/usr/local/mysql/&#39; \
&#39;--with-libxml-dir=/usr/local/libxml2/&#39; \
&#39;--with-png-dir=/usr/local/libpng/&#39; \
&#39;--with-jpeg-dir=/usr/local/jpeg8/&#39; \
&#39;--with-freetype-dir=/usr/local/freetype/&#39; \
&#39;--with-gd=/usr/local/gd/&#39; \
&#39;--with-zlib-dir=/usr/local/zlib/&#39; \
&#39;--with-mcrypt=/usr/local/libmcrypt/&#39; \
&#39;--with-mysqli=/usr/local/mysql/bin/mysql_config&#39; \
&#39;--enable-soap&#39; \
&#39;--enable-mbstring=all&#39; \
&#39;--enable-sockets&#39; \
로그인 후 복사
로그인 후 복사
🎜알겠습니다. php5_module을 통해 Apache와 PHP를 알아봅시다! 🎜🎜이 작업 모드를 mod_php 모드🎜

mod_fastcgi 모드🎜🎜우리는 위에서 php와 apache가 php5_module을 전달한다고 조심스럽게 언급했습니다. php5_module은 sapi를 통해 php에 액세스하여 php web의 전체 프로세스를 수행합니다. 🎜🎜Sapi도 위에서 언급했습니다. sapi는 PHP에서 제공하는 통합 인터페이스로, 웹 서버가 PHP 코드를 연결하고 구문 분석할 수 있도록 php5_module과 cgi를 제공합니다. 위에서 언급한 php5_module 로딩 모드를 mod_php 모드라고 합니다. 🎜🎜그럼! 댕댕댕! fastcgi 모드에 대해서는 곧 이야기하겠습니다. 하하하하하, 그건 너무 용납할 수 없는 일이에요. 🎜🎜그리고 php의 sapi의 또 다른 방법은 cgi 모드를 제공하는 것입니다. cgi가 상대적으로 오래되었기 때문에 이를 대체하기 위해 fastcgi가 등장했습니다. 🎜🎜그럼, 안녕하세요. 아니, CGI가 또 뭐야?🎜🎜🎜CGI(Common Gateway Interface). CGI는 외부 응용프로그램(CGI 프로그램)과 웹 서버 간의 인터페이스 표준입니다. CGI 프로그램과 웹 서버 간에 정보를 전송하는 절차입니다. CGI 사양을 사용하면 웹 서버가 외부 프로그램을 실행하고 그 출력을 웹 브라우저로 보낼 수 있습니다. CGI는 웹의 간단한 정적 하이퍼미디어 문서 세트를 완전히 새로운 대화형 미디어로 전환합니다. 🎜

공식적인 설명을 보니 마음이 아프네요. 간단히 말해서 CGI는 웹 서버를 다루는 데 특별히 사용됩니다. 웹 서버가 사용자 요청을 받으면 요청을 cgi 프로그램(php의 fastcgi)에 제출합니다. cgi 프로그램은 요청에 제출된 매개변수에 따라 처리(php 구문 분석)한 다음 표준 html 문을 출력하고 반환합니다. 웹 서버로 보낸 다음 클라이언트로 돌아갑니다. 이것이 일반적인 cgi 작동 방식입니다.

CGI의 장점은 서버와 완전히 독립적이며 중개자 역할만 한다는 것입니다. Apache 및 PHP에 대한 인터페이스를 제공합니다. 그들은 게이 액션을 완성하기 위해 CGI 배선을 사용했습니다. 이것의 장점은 둘 사이의 연관성을 최소화하고 더 독립적으로 만드는 것입니다.

하지만 CGI에는 문제가 있습니다. 즉, 모든 웹 요청에는 시작 및 종료 프로세스가 있는데, 이는 이러한 방식으로 가장 비판받는 fork-and-execute 모드입니다. -scale 동시성, 그것은 죽었습니다. fork-and-execute模式,这样一在大规模并发下,就死翘翘了。

所以。这个时候fastcgi运用而生了。它事先就早早的启动好了,而且可以启动多个cgi模块,在那里一直运行着等着,等着web发过来的请求,然后再给php解析运算完成生成html给web后,也不会退出,而且继续等着下一个web请求。而且这些cgi的模块启动是可控的,可监测的。这种技术还允许把web server和php运行在不同的主机上,以大规模扩展和改进安全性而不损失生产效率。

所以现在一般操作系统都是fastcgi模式。cig模式也慢慢退出了历史舞台!我们文章中说cgi一般也就指fastcgi。

所以把这种运行方式叫做mod_fastcgi模式

我会在接下来的段落讲如何使用fastcgi模式来连接php和apache(或者nginx)

总结一下:php 与 apache 或者 ngix 结合, 会用sapi 提供2种连接方法:mod_php和mod_fastcgimod_php 模式会将php模块安装到apache下面来运行,2者结合度较大。mod_fastcgi模式则是作为一个中间过程,apache介绍用户请求后,就发送给fastcgi, 再连接php来完成访问。

图形表示一下这2种模式

mod_php 模式

mod_php 模式是将php模块安装到apache中,所以每一次apache结束的请求呢,都会产生一条进程,这个进程就完整的包括php的各种运算计算等操作。

php-fpm의 설치 경로는 무엇입니까?

从图中我们很清晰的可以看到,apache每接收一个请求,都会产生一个进程来连接php通过sapi来完成请求,可想而知,如果一旦用户过多,并发数过多,服务器就会承受不住了。

而且,把mod_php编进apache时,出问题时很难定位是php的问题还是apache的问题。

mod_fastcgi 模式

mod_fastcgi模式则刚刚相反,fastcgi是一个独立与apache和php的独立个体,它随着apache一起启动,生成多个cig模块,等着apache的请求:

php-fpm의 설치 경로는 무엇입니까?

图中fastcgi早早的启动好了,静静的在哪里等着,已有apache发来的httpd请求就立马接收过来,通过调用sapi给php,完成运算。而且不会退出。这样就能应对大规模的并发请求,因为web server的要做的事情少了,所以就更快的去处理下一个请求,这样并发大大的。

由于apache 与 php 独立了。出问题,很好定位到底是哪里出问题了。这点也是这种模式受欢迎的原因之一。

php-fpm

我了个大操,终于要说到php-fpm了。^....^

先开门见山说php-fpm是干嘛好的了。它就是专门来辅助mode_fastcgi模式的。

嗯。很好,先知道它是干嘛的后,我们再回到mode_fastcgi模式。通过前面的瞎鸡巴一大堆的说明,我已经搞清楚了这种模式是怎么样子的一种状态了。

fastcgi 是一个与平台无关,与语言无关,任何语言只要按照它的接口来实现,就能实现自己语言的fastcgi能力和web server 通讯。

PHP-CGI就是PHP实现的自带的FastCGI管理器。

虽然是php官方出品,自带的,但是这丫的却一点也不给力,性能太差,而且也很麻烦不人性化,主要体现在:

  1. php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启。
  2. 直接杀死php-cgi进程,php就不能运行了。

上面2个问题,一直让很多人病垢了很久,所以很多人一直还是在用mode_php

그러니까. 이때 fastcgi 애플리케이션이 탄생했습니다. 미리 시작되어 여러 cgi 모듈을 시작할 수 있습니다. 계속 실행되어 웹의 요청을 기다린 다음 PHP의 구문 분석 작업을 완료하여 웹용 HTML을 생성하고 종료되지 않습니다. 다음 웹 요청을 기다리기 위해. 또한 이러한 CGI 모듈의 시작은 제어 및 모니터링이 가능합니다. 또한 이 기술을 사용하면 웹 서버와 PHP를 다른 호스트에서 실행할 수 있어 생산성 저하 없이 보안을 대규모로 확장하고 향상할 수 있습니다. 🎜🎜이제 대부분의 운영 체제는 fastcgi 모드입니다. 담배 모드도 서서히 역사의 무대에서 물러나고 있습니다! 우리 기사에서 cgi라고 하면 일반적으로 fastcgi를 의미합니다. 🎜🎜이 작업 모드를 mod_fastcgi 모드라고 합니다🎜🎜다음 단락에서 fastcgi 모드를 사용하여 php와 apache(또는 nginx)를 연결하는 방법에 대해 설명하겠습니다🎜 🎜 요약: PHP가 apache 또는 ngix와 결합되면 sapi는 mod_php 및 mod_fastcgi라는 두 가지 연결 방법을 제공하는 데 사용됩니다. mod_php 모드는 실행을 위해 Apache 아래에 PHP 모듈을 설치하며, 두 모듈은 더욱 긴밀하게 통합됩니다. mod_fastcgi 모드는 중간 프로세스입니다. Apache는 사용자 요청을 도입한 후 이를 fastcgi로 보낸 다음 PHP에 연결하여 액세스를 완료합니다. 🎜

이 두 모드의 그래픽 표현

mod_php 모드

🎜mod_php 모드는 PHP 모듈을 설치하는 것입니다. apache이므로 apache가 요청을 종료할 때마다 프로세스가 생성되며 이 프로세스에는 PHP의 다양한 계산과 계산이 완전히 포함됩니다. 🎜🎜php-fpm의 설치 경로는 무엇입니까?🎜🎜From Apache가 요청을 받을 때마다 PHP에 연결하여 sapi를 통해 요청을 완료하는 프로세스가 생성된다는 것을 그림에서 명확하게 볼 수 있습니다. 사용자가 너무 많고 동시 사용자가 너무 많으면 서버가 견디지 못하고 살았습니다. 🎜🎜게다가 mod_php를 apache로 컴파일할 때 뭔가 문제가 생겼을 때 php 문제인지 apache 문제인지 판단하기 어렵습니다. 🎜

mod_fastcgi 모드

🎜mod_fastcgi 모드는 정반대입니다. fastcgi는 Apache 및 PHP와 독립적인 독립 엔터티로, Apache로 시작하여 여러 CIG 모듈 등을 생성합니다. 아파치: 🎜🎜php-fpm의 설치 경로는 무엇입니까?🎜 🎜사진에서는 fastcgi가 일찍 시작되어 조용히 기다리고 있는 모습입니다. apache에서 보낸 httpd 요청을 바로 받고, sapi를 php로 호출하면 작업이 완료됩니다. 그리고 그만 두지 않을 것입니다. 이런 방식으로 대규모 동시 요청을 처리할 수 있습니다. 웹 서버가 수행할 작업이 적기 때문에 다음 요청을 더 빠르게 처리할 수 있어 동시성이 크게 향상됩니다. 🎜🎜아파치와 PHP는 독립적이기 때문입니다. 문제가 있는 경우 문제가 발생한 위치를 쉽게 찾을 수 있습니다. 이 모델이 인기 있는 이유 중 하나죠. 🎜

php-fpm

🎜저는 많은 일을 해왔고 마침내 php-fpm에 대해 이야기하고 싶습니다. ^....^🎜🎜🎜본론으로 가서 php-fpm이 어떤 용도에 좋은지 이야기해 보겠습니다. mode_fastcgi 모드를 지원하도록 특별히 설계되었습니다. 🎜🎜흠. 아주 좋습니다. 무엇을 하는지 알고 나면 mode_fastcgi 모드로 돌아가겠습니다. 이전 설명을 통해 이 모드가 어떤 모습인지 파악했습니다. 🎜🎜fastcgi는 플랫폼 독립적이고 언어 독립적입니다. 모든 언어가 인터페이스에 따라 구현되는 한 자체 언어의 fastcgi 기능을 실현하고 웹 서버와 통신할 수 있습니다. 🎜🎜PHP-CGI는 PHP로 구현된 FastCGI 관리자입니다. 🎜🎜PHP의 공식 제품이고 함께 제공되지만 전혀 강력하지 않고 성능이 너무 낮으며 또한 매우 번거롭고 비인격적입니다. 주로 다음과 같이 반영됩니다. 🎜
< ol>
  • php-cgi가 php.ini 구성을 변경한 후 새 php-ini를 적용하려면 php-cgi를 다시 시작해야 하며 원활한 다시 시작은 불가능합니다.
  • php-cgi 프로세스를 직접 종료하면 PHP가 실행될 수 없습니다.
  • 🎜🎜위의 두 가지 문제는 오랫동안 많은 사람들을 괴롭혀왔기 때문에 아직도 많은 사람들이 mode_php 방식을 사용하고 있습니다. 🎜

    直到 2004年(确定是这么早吗?)一个叫 Andrei Nigmatulin的屌丝发明了PHP-FPM ,这神器的出现就彻底打破了这种局面,这是一个PHP专用的fastcgi管理器,它很爽的克服了上面2个问题,而且,还表现在其他方面更表现强劲. 请戳官网

    我擦,这一篇貌似又瞎比比的说超时了啊。好吧。那windows和linux下安装配置php-fpm就下一节来说吧。反正我已经已经把php-fpm和fastcgi给讲清楚了。

    ===============================================================================

    2、php-fpm的安装和启动

    在前面我学习过了php中的mod_php模式mode_fastcgi和php-fpm模式:地址,中大致的讲述了几种模式的区别,也明白了php-fpm是fastcgi模式的管理器。今天就来看下php如何安装php-fpm,以及运行。

    安装 php-fpm

    我的机器是centos 6.2 之前就已经安装过了php 5.4.11,PHP在 5.3.3 之后已经讲php-fpm写入php源码核心了。所以已经不需要另外下载了。我这里是5.4.11所以就可以直接用。

    由于我php已经安装好了,而且之前编译的时候没有带上fpm模式,所以我必须找到源码重新编译一下:

    要想使php支持php-fpm,只需要在编译的时候带上 --enable-fpm 就可以了。

    所以,我需要找到之前的编译参数, 后面加上--enable-fpm ,重新编译下就可以了。之前就讲过,有2种方式可以找到之前的编译参数:

    1. 在源码 /lamp/php-5.4.11/中找到 config.nice,这个就是之前的编译参数
    2. 在php.ini配置文件中找到Configure相关的配置 :
      /usr/local/php/bin/php -i |grep &#39;Configure&#39;

    好,我们开始,找到之前的编译参数:

    [root@localhost /]# cd /lamp/php-5.4.11 & vi config.nice
    &#39;./configure&#39; \
    &#39;--prefix=/usr/local/php&#39; \
    &#39;--with-config-file-path=/usr/local/php/etc/&#39; \
    &#39;--with-apxs2=/usr/local/apache/bin/apxs&#39; \
    &#39;--with-mysql=/usr/local/mysql/&#39; \
    &#39;--with-libxml-dir=/usr/local/libxml2/&#39; \
    &#39;--with-png-dir=/usr/local/libpng/&#39; \
    &#39;--with-jpeg-dir=/usr/local/jpeg8/&#39; \
    &#39;--with-freetype-dir=/usr/local/freetype/&#39; \
    &#39;--with-gd=/usr/local/gd/&#39; \
    &#39;--with-zlib-dir=/usr/local/zlib/&#39; \
    &#39;--with-mcrypt=/usr/local/libmcrypt/&#39; \
    &#39;--with-mysqli=/usr/local/mysql/bin/mysql_config&#39; \
    &#39;--enable-soap&#39; \
    &#39;--enable-mbstring=all&#39; \
    &#39;--enable-sockets&#39; \
    로그인 후 복사
    로그인 후 복사

    加上--enable-fpm后,重新编译:

    [root@localhost /]# cd /lamp/php-5.4.11
    [root@localhost php-5.4.11]# &#39;./configure&#39; \
        &#39;--prefix=/usr/local/php&#39; \
        &#39;--with-config-file-path=/usr/local/php/etc/&#39; \
        &#39;--with-apxs2=/usr/local/apache/bin/apxs&#39; \
        &#39;--with-mysql=/usr/local/mysql/&#39; \
        &#39;--with-libxml-dir=/usr/local/libxml2/&#39; \
        &#39;--with-png-dir=/usr/local/libpng/&#39; \
        &#39;--with-jpeg-dir=/usr/local/jpeg8/&#39; \
        &#39;--with-freetype-dir=/usr/local/freetype/&#39; \
        &#39;--with-gd=/usr/local/gd/&#39; \
        &#39;--with-zlib-dir=/usr/local/zlib/&#39; \
        &#39;--with-mcrypt=/usr/local/libmcrypt/&#39; \
        &#39;--with-mysqli=/usr/local/mysql/bin/mysql_config&#39; \
        &#39;--enable-soap&#39; \
        &#39;--enable-mbstring=all&#39; \
        &#39;--enable-sockets&#39; \
        &#39;--enable-fpm&#39;
    [root@localhost php-5.4.11] make && make install
    로그인 후 복사

    启动 php-fpm

    安装完成之后,我们尝试着启动:

    启动命令是:

    /usr/local/php/sbin/php-fpm

    报错了:

    [26-Feb-2015 15:39:55] ERROR: failed to open configuration file &#39;/usr/local/php/etc/php-fpm.conf&#39;: No such file or directory (2)
    [26-Feb-2015 15:39:55] ERROR: failed to load configuration file &#39;/usr/local/php/etc/php-fpm.conf&#39;
    [26-Feb-2015 15:39:55] ERROR: FPM initialization failed
    로그인 후 복사

    错误信息说找不到 php-fpm.conf

    哦,原来是php-fpm.conf还没有,我们到 /usr/local/php/etc目录下将php-fpm.conf.default拷贝也一份成php-fpm.conf

     cd /usr/local/php/etc/cp php-fpm.conf.default php-fpm.conf
    로그인 후 복사

    编辑一下这个配置文件:

    vim php-fpm.conf
    
    pid = run/php-fpm.pid
    user = www
    group = www
    로그인 후 복사

    再次尝试启动:

    /usr/local/php/sbin/php-fpm

    再次报错说www 用户不存在:

    [26-Feb-2015 15:57:38] ERROR: [pool www] cannot get uid for user &#39;www&#39;
    [26-Feb-2015 15:57:38] ERROR: FPM initialization failed
    로그인 후 복사

    好,那我们新建www 用户组:

     groupadd wwwuseradd -g www www
    로그인 후 복사

    再次启动:

    /usr/local/php/sbin/php-fpm

    没有任何的输出,表示成功了!!!

    php-fpm占用的是9000端口,我们查看下进程:

    [root@localhost php-5.4.11]# ps -ef|grep php-fpm
    root      1377  1231  0 11:19 pts/1    00:00:00 grep php-fpm
    root     29249     1  0 06:22 ?        00:00:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
    www      29250 29249  0 06:22 ?        00:00:00 php-fpm: pool www
    www      29251 29249  0 06:22 ?        00:00:00 php-fpm: pool www
    root     32132  6158  0 08:25 pts/2    00:00:00 vi php-fpm.conf
    로그인 후 복사
    [root@localhost php-5.4.11]# netstat -tnl | grep 9000
    tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      
    [root@localhost php-5.4.11]#
    로그인 후 복사

    好,安装和启动都OK了。

    开机启动 php-fpm

    之前接说过php-fpm是独立于web服务器和php之前的一层服务器,所以,我们需要开机启动它

    开机启动的配置文件是:/etc/rc.local ,加入 /usr/local/php/sbin/php-fpm 即可

    [root@localhost init]# vi /etc/rc.local
    
          1 #!/bin/sh
          2 #
          3 # This script will be executed *after* all the other init scripts.
          4 # You can put your own initialization stuff in here if you don&#39;t
          5 # want to do the full Sys V style init stuff.
          6 
          7 touch /var/lock/subsys/local
          8 /usr/local/apache/bin/apachectl start
          9 /usr/local/bin/redis-server /etc/redis.conf
         10 /usr/local/php/sbin/php-fpm
    로그인 후 복사

    光安装好php-fpm也是没用的,得配合web服务器使用,下一节,我要学习nginx的安装,以及nginx连接php-fpm来使用php。

    重启 php-fpm

    我们在新安装扩展后,是需要重新php-fpm的,已使扩展生效。

    最简单粗暴的重新php-fpm的方式是:

    先找到php-fpm的进程号,kill 掉,再用/usr/local/php/sbin/php-fpm 这样启动。

    其实还有更多温和的方法,就是使用信号

    INT, TERM 立刻终止
    QUIT 平滑终止
    USR1 重新打开日志文件
    USR2 平滑重载所有worker进程并重新载入配置和二进制模块
    로그인 후 복사

    示例:

    php-fpm 关闭:

    kill -INT `cat /usr/local/php/var/run/php-fpm.pid`
    로그인 후 복사

    php-fpm 重启:

    kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
    로그인 후 복사

    ===============================================================================

    3、php-fpm的配置和优化

    我在前面几篇中,很详细的讲述了php-fpm的各种介绍,和安装。今天来看一下它的配置文件php-fpm的各种配置以及一些常见的优化。

    php-fpm的安装目录

    下面是我的平时的环境搭建php的各种安装目录,大家的基本也差不多。

    centos等linux平台

    /usr/local/php/php
    /usr/local/php/etc/php.ini
    /usr/local/php/sbin/php-fpm
    /usr/local/php/etc/php-fpm.conf
    로그인 후 복사

    mac平台

    /usr/bin/php
    /etc/php.ini
    /usr/bin/php-fpm
    /etc/php-fpm.conf
    로그인 후 복사

    由于我开发以Mac为主,所以就用Mac的环境配置来学习。

    php-fpm配置详解

    这是搜索的一份还算算比较详细的php-fpm.conf配置详解,我会针对性的修改下,当然php手册上也有详细的讲解:http://php.net/manual/zh/install.fpm.configuration.php

    pid = /usr/local/var/run/php-fpm.pid
    #pid设置,一定要开启,上面是Mac平台的。默认在php安装目录中的var/run/php-fpm.pid。比如centos的在: /usr/local/php/var/run/php-fpm.pid
    
    error_log  = /usr/local/var/log/php-fpm.log
    #错误日志,上面是Mac平台的,默认在php安装目录中的var/log/php-fpm.log,比如centos的在: /usr/local/php/var/log/php-fpm.log
    
    log_level = notice
    #错误级别. 上面的php-fpm.log纪录的登记。可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.
    
    emergency_restart_threshold = 60
    emergency_restart_interval = 60s
    #表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。0 表示 &#39;关闭该功能&#39;. 默认值: 0 (关闭).
    
    process_control_timeout = 0
    #设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.
    
    daemonize = yes
    #后台执行fpm,默认值为yes,如果为了调试可以改为no。在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。
    
    listen = 127.0.0.1:9000
    #fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: &#39;ip:port&#39;, &#39;port&#39;, &#39;/path/to/unix/socket&#39;. 每个进程池都需要设置。如果nginx和php在不同的机器上,分布式处理,就设置ip这里就可以了。
    
    listen.backlog = -1
    #backlog数,设置 listen 的半连接队列长度,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:http://www.3gyou.cc/?p=41
    
    listen.allowed_clients = 127.0.0.1
    #允许访问FastCGI进程的IP白名单,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接。
    
    listen.owner = www
    listen.group = www
    listen.mode = 0666
    #unix socket设置选项,如果使用tcp方式访问,这里注释即可。
    
    user = www
    group = www
    #启动进程的用户和用户组,FPM 进程运行的Unix用户, 必须要设置。用户组,如果没有设置,则默认用户的组被使用。
    
    pm = dynamic 
    #php-fpm进程启动模式,pm可以设置为static和dynamic和ondemand
    #如果选择static,则进程数就数固定的,由pm.max_children指定固定的子进程数。
    
    #如果选择dynamic,则进程数是动态变化的,由以下参数决定:
    pm.max_children = 50 #子进程最大数
    pm.start_servers = 2 #启动时的进程数,默认值为: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
    pm.min_spare_servers = 1 #保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
    pm.max_spare_servers = 3 #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
    
    pm.max_requests = 500
    #设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 &#39;0&#39; 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
    
    pm.status_path = /status
    #FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到
    
    ping.path = /ping
    #FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。
    
    ping.response = pong
    #用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.
    
    access.log = log/$pool.access.log
    #每一个请求的访问日志,默认是关闭的。
    
    access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
    #设定访问日志的格式。
    
    slowlog = log/$pool.log.slow
    #慢请求的记录日志,配合request_slowlog_timeout使用,默认关闭
    
    request_slowlog_timeout = 10s
    #当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 &#39;0&#39; 表示 &#39;Off&#39;
    
    request_terminate_timeout = 0
    #设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的&#39;max_execution_time&#39;因为某些特殊原因没有中止运行的脚本有用. 设置为 &#39;0&#39; 表示 &#39;Off&#39;.当经常出现502错误时可以尝试更改此选项。
    
    rlimit_files = 1024
    #设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。
    
    rlimit_core = 0
    #设置核心rlimit最大限制值. 可用值: &#39;unlimited&#39; 、0或者正整数. 默认值: 系统定义值.
    
    chroot =
    #启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.
    
    chdir =
    #设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时)
    
    catch_workers_output = yes
    #重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.
    로그인 후 복사

    当然还有一些无关紧要的设置,用到了再说吧。

    一些重要的设置

    php-fpm进程分配

    在之前的文章中就说过了。在fasgcgi模式下,php会启动多个php-fpm进程,来接收nginx发来的请求,那是不是进程越多,速度就越快呢?这可不一定!得根据我们的机器配置和业务量来决定。

    我们先来看下,设定进程的配置在哪里?

    pm = static | dynamic | ondemand
    로그인 후 복사

    pm可以设置成这样3种,我们用的最多的就上前面2种。

    pm = static 模式

    pm = static 表示我们创建的php-fpm子进程数量是固定的,那么就只有pm.max_children = 50这个参数生效。你启动php-fpm的时候就会一起全部启动51(1个主+50个子)个进程,颇为壮观。

    pm = dynamic 模式

    pm = dynamic模式,表示启动进程是动态分配的,随着请求量动态变化的。他由 pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers 这几个参数共同决定。

    上面已经讲过,这里再重申一下吧:

    pm.max_children = 50 是最大可创建的子进程的数量。必须设置。这里表示最多只能50个子进程。

    pm.start_servers = 20 随着php-fpm一起启动时创建的子进程数目。默认值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。这里表示,一起启动会有20个子进程。

    pm.min_spare_servers = 10
    设置服务器空闲时最小php-fpm进程数量。必须设置。如果空闲的时候,会检查如果少于10个,就会启动几个来补上。

    pm.max_spare_servers = 30
    设置服务器空闲时最大php-fpm进程数量。必须设置。如果空闲时,会检查进程数,多于30个了,就会关闭几个,达到30个的状态。

    到底选择static还数dynamic?

    很多人恐惧症来袭,不知道选什么好?

    一般原则是:动态适合小内存机器,灵活分配进程,省内存。静态适用于大内存机器,动态创建回收进程对服务器资源也是一种消耗。

    如果你的内存很大,有8-20G,按照一个php-fpm进程20M算,100个就2G内存了,那就可以开启static模式。如果你的内存很小,比如才256M,那就要小心设置了,因为你的机器里面的其他的进程也算需要占用内存的,所以设置成dynamic是最好的,比如:pm.max_chindren = 8, 占用内存160M左右,而且可以随时变化,对于一半访问量的网站足够了。

    慢日志查询

    我们有时候会经常饱受500,502问题困扰。当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时。

    这个时候,我们是可以开启慢日志功能的。

    slowlog = /usr/local/var/log/php-fpm.log.slow
    request_slowlog_timeout = 15s
    로그인 후 복사

    当一个请求该设置的超时时间15秒后,就会将对应的PHP调用堆栈信息完整写入到慢日志中。

    php-fpm慢日志会记录下进程号,脚本名称,具体哪个文件哪行代码的哪个函数执行时间过长:

    [21-Nov-2013 14:30:38] [pool www] pid 11877
    script_filename = /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php
    [0xb70fb88c] file_get_contents() /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php:2
    로그인 후 복사

    通过日志,我们就可以知道第2行的file_get_contents 函数有点问题,这样我们就能追踪问题了。

    위 내용은 php-fpm의 설치 경로는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:php.cn
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿