Heim >Backend-Entwicklung >PHP-Problem >Was ist der Installationspfad von php-fpm?

Was ist der Installationspfad von php-fpm?

PHPz
PHPzOriginal
2020-09-25 16:00:256093Durchsuche

php-fpm-Installationspfad: 1. Auf Linux-Plattformen wie Centos befindet es sich in den Verzeichnissen „/usr/local/php/etc/“ und „/usr/local/php/sbin/“. 2. Auf Mac Plattformen befindet es sich in den Verzeichnissen „/etc/“ und „/usr/bin/“.

Was ist der Installationspfad von php-fpm?

1. Was sind Fastcgi und PHP-FPM in PHP?

Kürzlich habe ich über die Leistung von PHP recherchiert und festgestellt, dass ich sehr wenig darüber weiß Man kann sagen, dass ich fast kein Verständnis dafür habe, was ziemlich beängstigend ist, wenn man darüber nachdenkt. Ich beschloss, diesen Aspekt sorgfältig zu studieren.

Die folgenden Artikel referenziert und studiert:
1. Einführung, Vergleich und Leistungsdaten von mod_php, mod_fastcgi und php-fpm
2. Tatsächlicher Nginx_replacement

Um fastcgi und php-fpm Schritt für Schritt einzuführen, habe ich zuerst Let's Sprechen Sie Stück für Stück über die Umgebung von PHP. Warum. Plötzlich habe ich das Gefühl, dass das Leben so anstrengend ist!

Lassen Sie uns zuerst über den Webserver sprechen. PHP ist eine Back-End-Sprache, die für das Web entwickelt wurde. Natürlich wissen wir PHP-Hunde am besten. Daher ist PHP nur eine Back-End-Sprache und muss daher auf einen Webserver angewiesen sein, um Webfunktionen bereitzustellen. Wenn für Webanwendungen andere Back-End-Sprachen verwendet werden, müssen diese natürlich auch auf Webserver angewiesen sein. Okay, der Webserver wird von PHP eingeführt, gut!

Was sind also die gängigen Webserver? Der von PHP-Hunden am häufigsten verwendete ist Apache, und es gibt noch andere:

apache
  • nginx
  • IIS
  • lighttpd
  • tomcat
Grundsätzlich die oben genannten, die in Verbindung mit PHP verwendet werden. Die beliebtesten sind Apache und Nginx.

Lassen Sie uns zunächst Apache als Webserver als Beispiel verwenden, um einen vollständigen PHP-Zugriff zu veranschaulichen:

Was ist der Installationspfad von php-fpm?Das Bild erklärt ein vollständiges Webzugriffs-Flussdiagramm von PHP und Apache in Kombination mit einer MySQL-Datenbank.

mod_php-Modus

Das Obige macht deutlich, dass PHP auf einen Webserver angewiesen ist, um Web-Funktionsdienste bereitzustellen. Sehen wir uns nun an, wie sie Freunde geworden sind.

Am häufigsten verwenden wir Apache. Erinnern Sie sich also daran, wie man Apache in die Lage versetzt, PHP-Code zu erkennen? Ist es notwendig, die folgenden Sätze in der Apache-Konfigurationsdatei httpd.conf hinzuzufügen oder zu ändern:

//加入以下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>

Die obige manuelle Konfiguration nach der Installation der PHP- und Apache-Umgebung unter Windows, die Quellcode-Installation unter Linux ist grob wie folgt konfiguriert:

./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars

Auf diese Weise besteht ihr gemeinsames Wesen darin, LoadModule zum Laden von php5_module zu verwenden, was bedeutet, PHP als Untermodul von Apache auszuführen. Beim Zugriff auf eine PHP-Datei über das Web ruft Apache php5_module auf, um den PHP-Code zu analysieren.

Wie übergibt php5_module Daten an den PHP-Parser, um den PHP-Code zu analysieren? LoadModule来加载php5_module,就是把php作为apache的一个子模块来运行。当通过web访问php文件时,apache就会调用php5_module来解析php代码。

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

答案是通过sapi

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

Was ist der Installationspfad von 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

Die Antwort ist durch sapi

Schauen wir uns ein weiteres Bild an, um ausführlich über die Beziehung zwischen Apache, PHP und Sapi zu sprechen:

Was ist der Installationspfad von php-fpm?

Von der Im Bild oben sehen wir, dass sapi ein solcher Zwischenprozess ist, der eine Schnittstelle für die externe Kommunikation bereitstellt, die in gewisser Weise dem socket ähnelt und es PHP ermöglicht, mit anderen Anwendungen zu kommunizieren. Interaktive Daten (Apache, Nginx, CLI usw.). PHP stellt standardmäßig viele Arten von SAPI bereit, darunter das gemeinsame php5_module für Apache und Nginx, CGI, ISAPI für IIS und Shell CLI.

Der obige Apache-Aufruf-PHP-Ausführungsprozess ist also wie folgt:

[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; \
🎜Okay. Lassen Sie uns Apache und PHP über php5_module herausfinden! 🎜🎜Wir nennen diesen Betriebsmodus mod_php-Modus🎜

mod_fastcgi-Modus🎜🎜Wir haben oben sorgfältig erwähnt, dass PHP und Apache php5_module übergeben, php5_module greift über Sapi auf PHP zu, um den gesamten PHP-Webprozess zu realisieren. 🎜🎜Sapi ist auch eine von PHP bereitgestellte einheitliche Schnittstelle. Sie stellt php5_module und cgi für Webserver zum Verknüpfen und Analysieren von PHP-Code bereit. Der oben erwähnte php5_module-Lademodus wird als mod_php-Modus bezeichnet. 🎜🎜Dann! Verdammt, verdammt! Lassen Sie uns bald über den FastCGI-Modus sprechen. Hahahahaha, das ist zu inakzeptabel. 🎜🎜Dann besteht eine andere Möglichkeit von PHPs Sapi darin, den CGI-Modus bereitzustellen. Da CGI relativ alt ist, scheint FastCGI ihn zu ersetzen. 🎜🎜Also, hey. Auf keinen Fall, was ist schon wieder CGI?🎜🎜🎜CGI (Common Gateway Interface). CGI ist ein Schnittstellenstandard zwischen externen Anwendungen (CGI-Programmen) und Webservern. Es handelt sich um ein Verfahren zur Übertragung von Informationen zwischen CGI-Programmen und Webservern. Die CGI-Spezifikation ermöglicht es Webservern, externe Programme auszuführen und ihre Ausgabe an Webbrowser zu senden. CGI verwandelt den Satz einfacher statischer Hypermedia-Dokumente in ein völlig neues interaktives Medium. 🎜

Es tut weh, die offizielle Erklärung zu sehen. Um es einfach auszudrücken: CGI wird speziell für den Umgang mit Webservern verwendet. Wenn der Webserver eine Benutzeranforderung empfängt, sendet er die Anforderung an das CGI-Programm (FastCGI von PHP). Das CGI-Programm verarbeitet (PHP) gemäß den in der Anforderung übermittelten Parametern und gibt dann eine Standard-HTML-Anweisung aus und gibt sie zurück Senden Sie es an den Webserver und kehren Sie dann zum Client zurück. So funktioniert normales CGI.

Der Vorteil von CGI besteht darin, dass es völlig unabhängig von jedem Server ist und nur als Vermittler fungiert. Bietet Schnittstellen zu Apache und PHP. Sie nutzten CGI-Verkabelung, um die Schwulenaktion zu vervollständigen. Dies hat den Vorteil, dass die Assoziation zwischen den beiden minimiert und sie unabhängiger werden.

Aber es gibt eine problematische Sache bei CGI, nämlich, dass jede Webanforderung einen Start- und Beendigungsprozess hat, was der am meisten kritisierte fork-and-execute-Modus ist -skalierte Parallelität, es ist tot. 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的各种运算计算等操作。

Was ist der Installationspfad von php-fpm?

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

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

mod_fastcgi 模式

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

Was ist der Installationspfad von 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

Also. Zu diesem Zeitpunkt wurde die Anwendung fastcgi geboren. Es wird früh im Voraus gestartet und kann mehrere CGI-Module starten, wartet auf Anfragen aus dem Web und schließt dann den Parsing-Vorgang von PHP ab, um HTML für das Web zu generieren, und wird nicht beendet um auf die nächste Webanfrage zu warten. Darüber hinaus ist der Start dieser CGI-Module steuer- und überwachbar. Diese Technologie ermöglicht es auch, den Webserver und PHP auf verschiedenen Hosts auszuführen, um die Sicherheit massiv zu skalieren und zu verbessern, ohne die Produktivität zu verlieren. 🎜🎜Jetzt befinden sich die meisten Betriebssysteme also im FastCGI-Modus. Auch der Zigarettenkonsum hat sich langsam von der Bühne der Geschichte zurückgezogen! Wenn wir in unserem Artikel von CGI sprechen, beziehen wir uns im Allgemeinen auf FastCGI. 🎜🎜Dieser Betriebsmodus heißt also mod_fastcgi-Modus🎜🎜Ich werde im nächsten Absatz darüber sprechen, wie man den Fastcgi-Modus verwendet, um PHP und Apache (oder Nginx) zu verbinden🎜 🎜 Zusammenfassend: Wenn PHP mit Apache oder Ngix kombiniert wird, wird Sapi verwendet, um zwei Verbindungsmethoden bereitzustellen: mod_php und mod_fastcgi. Der mod_php-Modus installiert das PHP-Modul zur Ausführung unter Apache, und die beiden sind enger integriert. Der mod_fastcgi-Modus ist ein Zwischenprozess. Nachdem Apache die Benutzeranforderung eingegeben hat, sendet er sie an fastcgi und stellt dann eine Verbindung zu PHP her, um den Zugriff abzuschließen. 🎜

Grafische Darstellung dieser beiden Modi

mod_php-Modus

🎜im mod_php-Modus wird das PHP-Modul installiert Apache, also wird jedes Mal, wenn Apache eine Anfrage beendet, ein Prozess generiert, und dieser Prozess umfasst vollständig verschiedene Berechnungen und Berechnungen von PHP. 🎜🎜Was ist der Installationspfad von php-fpm?🎜🎜Von Auf dem Bild können wir deutlich sehen, dass jedes Mal, wenn Apache eine Anfrage erhält, ein Prozess generiert wird, um eine Verbindung zu PHP herzustellen und die Anfrage über Sapi abzuschließen. Es ist denkbar, dass der Server dies tut, wenn zu viele Benutzer und zu viele gleichzeitige Benutzer vorhanden sind Ich kann es nicht ertragen. 🎜🎜Darüber hinaus ist es beim Kompilieren von mod_php in Apache schwierig festzustellen, ob es sich um ein PHP-Problem oder ein Apache-Problem handelt, wenn etwas schief geht. 🎜

mod_fastcgi-Modus

🎜mod_fastcgi-Modus ist genau das Gegenteil. Es beginnt mit Apache und generiert mehrere CIG-Module usw. Mit Apache: 🎜🎜Was ist der Installationspfad von php-fpm?🎜 🎜Im Bild wurde fastcgi früh gestartet und wartet ruhig. Die von Apache gesendete httpd-Anfrage wird sofort empfangen und der Vorgang wird durch den Aufruf von sapi an PHP abgeschlossen. Und werde nicht aufgeben. Dadurch können große gleichzeitige Anfragen verarbeitet werden, da der Webserver weniger Arbeit zu erledigen hat und die nächste Anfrage schneller verarbeiten kann, was die Parallelität erheblich verbessert. 🎜🎜Da Apache und PHP unabhängig sind. Wenn es ein Problem gibt, lässt sich leicht lokalisieren, wo das Problem liegt. Dies ist einer der Gründe, warum dieses Modell beliebt ist. 🎜

php-fpm

🎜Ich habe viel getan und möchte endlich über php-fpm sprechen. ^....^🎜🎜🎜Kommen wir gleich zur Sache und sprechen darüber, wofür PHP-FPM gut ist. Es wurde speziell zur Unterstützung des mode_fastcgi-Modus entwickelt. 🎜🎜Hmm. Sehr gut, kehren wir zum mode_fastcgi-Modus zurück, nachdem wir wissen, was er tut. Durch die bisherigen Erläuterungen habe ich bereits herausgefunden, wie dieser Modus aussieht. 🎜🎜Fastcgi ist plattformunabhängig und sprachunabhängig. Solange eine Sprache entsprechend ihrer Schnittstelle implementiert ist, kann sie die Fastcgi-Fähigkeit ihrer eigenen Sprache realisieren und mit dem Webserver kommunizieren. 🎜🎜PHP-CGI ist der von PHP implementierte FastCGI-Manager. 🎜🎜Obwohl es ein offizielles PHP-Produkt ist und mitgeliefert wird, ist es überhaupt nicht leistungsstark, die Leistung ist zu schlecht und es ist auch sehr mühsam und unpersönlich, was sich hauptsächlich in Folgendem widerspiegelt: 🎜
  • Nachdem php-cgi die php.ini-Konfiguration geändert hat, müssen Sie php-cgi neu starten, damit die neue php-ini wirksam wird, und ein reibungsloser Neustart ist nicht möglich.
  • Beenden Sie den PHP-CGI-Prozess direkt und PHP kann nicht ausgeführt werden.
  • 🎜🎜Die beiden oben genannten Probleme haben viele Menschen schon seit langem beunruhigt, so dass viele Menschen immer noch die Methode mode_php verwenden. 🎜

    直到 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 'Configure'

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

    [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 函数有点问题,这样我们就能追踪问题了。

    Das obige ist der detaillierte Inhalt vonWas ist der Installationspfad von php-fpm?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn