In diesem Artikel wird hauptsächlich die Installation und Konfiguration von PHP-FPM zum Aufbau einer Nginx+PHP-Produktionsumgebung beschrieben. Die Funktion von PHP-FPM besteht darin, die FastCGI-Prozessverwaltung in das PHP-Paket zu integrieren
nginx selbst kann PHP nicht verarbeiten. Es ist nur ein Webserver. Wenn eine Anfrage eingeht, wird sie zur Verarbeitung an den PHP-Interpreter gesendet und das Ergebnis wird an den Client zurückgegeben .
nginx sendet die Anfrage normalerweise zur Verarbeitung an den Fastcgi-Verwaltungsprozess. Der Fascgi-Verwaltungsprozess wählt das Verarbeitungsergebnis des CGI-Unterprozesses aus und gibt es an nginx zurück
Dieser Artikel verwendet PHP-FPM als Beispiel zur Einführung, wie Nginx PHP unterstützt ein PHP-FastCGI-Manager, der nur für PHP verwendet wird. Er kann unter http://php-fpm.org/download heruntergeladen werden.
PHP-FPM ist eigentlich ein Patch des PHP-Quellcodes, der darauf abzielt, FastCGI zu integrieren Prozessverwaltung in das PHP-Paket. Es muss in Ihren PHP-Quellcode gepatcht werden und kann nach dem Kompilieren und Installieren von PHP verwendet werden. Die neue Version von PHP hat php-fpm integriert, das kein Paket eines Drittanbieters mehr ist. Es wird empfohlen, es zu verwenden. PHP-FPM bietet eine bessere PHP-Prozessverwaltungsmethode, kann Speicher und Prozesse effektiv steuern und die PHP-Konfiguration reibungslos neu laden. Es bietet mehr Vorteile als spawn-fcgi und ist daher offiziell in PHP enthalten. Sie können PHP-FPM mit dem Parameter –enable-fpm in ./configure aktivieren. Die spezifische Bedeutung der Optionen finden Sie hier.
Vorbereitung vor der Installation
Ausführung unter Centosyum -y install gcc automake autoconf libtool make yum -y install gcc gcc-c++ glibc yum -y install libmcrypt-devel mhash-devel libxslt-devel
libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel
Neue Version von PHP-FPM-Installation (empfohlene Installationsmethode)
wget http://cn2.php.net/distributions/php-5.4.7.tar.gz tar zvxf php-5.4.7.tar.gz cd php-5.4.7 ./configure --prefix=/usr/local/php --enable-fpm --with-mcrypt
--enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli --with-gd --with-jpeg-dir
make all install
Beide der oben genannten Methoden können zur Installation von php-fpm verwendet werden. Nach der Installation wird der Inhalt im Verzeichnis /usr/local/php abgelegt
Damit ist die PHP-Installation von FPM abgeschlossen.
Im Folgenden wird der php-fpm-laufende Benutzer
cd /usr/local/php cp etc/php-fpm.conf.default etc/php-fpm.conf vi etc/php-fpm.conf
Ändern
user = www-data group = www-data
groupadd www-data useradd -g www-data www-data
2. Kompilieren und installieren Sie Nginx
Nachdem die Nginx-Installation abgeschlossen ist, ändern Sie die Nginx-Konfigurationsdatei zu,nginx.confFügen Sie die folgende Konfiguration zum Serverabschnitt hinzu, achten Sie auf die rote Inhaltskonfiguration, andernfalls wird der Fehler „Keine Eingabedatei angegeben“ angezeigt
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
PHP-Datei erstellen
index.php-Datei unter /usr/local/nginx/ erstellen html, geben Sie den folgenden Inhalt ein:
<?php
echo phpinfo();
?>
Starten Sie php-fpm und nginx
/usr/local/php/sbin/php-fpm #手动打补丁的启动方式/usr/local/php/sbin/php-fpm start sudo /usr/local/nginx/nginx
php-fpm schließen und neu starten, siehe Ende des Artikels
6. BrowserzugriffBesuchen Sie http://Ihre Server-IP/index.php, dort können Sie alles zu den PHP-Informationen sehen.
Bei der Verwendung von Nginx tritt häufig 502 Bad Gateway auf und 504 Gateway-Timeout-Fehler. Lassen Sie uns Nginx+PHP-FPM verwenden, um die Ursachen und Lösungen dieser beiden häufigen Fehler zu analysieren.
1.502 Bad Gateway-Fehler
Es gibt zwei Konfigurationselemente in php.ini bzw. php-fpm.conf: max_execution_time und request_terminate_timeout.
Mit diesen beiden Elementen wird die maximale Ausführungszeit eines PHP-Skripts konfiguriert. Wenn diese Zeit überschritten wird, beendet PHP-FPM nicht nur die Ausführung des Skripts, beendet auch den Worker-Prozess, der das Skript ausführt. Daher stellt Nginx fest, dass die Verbindung zur Kommunikation mit sich selbst unterbrochen ist, und gibt einen 502-Fehler an den Client zurück.
Am Beispiel von request_terminate_timeout=30 Sekunden von PHP-FPM lauten die spezifischen Informationen des 502 Bad Gateway-Fehlers wie folgt: 1) Nginx-Fehlerzugriffsprotokoll:
2013/09/19 01:09:00 [error] 27600#0: *78887 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.1.101, server: test.com, request: "POST /index.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:", host: "test.com", referrer: "http://test.com/index.php"
2) PHP-FPM-Fehlerprotokoll:
WARNING: child 25708 exited on signal 15 (SIGTERM) after 21008.883410 seconds from start
wenn Sie also die globale php.ini nicht ändern möchten, ändern Sie einfach die Konfiguration von PHP-FPM.
Wenn max_fail jedoch auf einen relativ kleinen Wert eingestellt ist, geht Nginx beim nächsten fail_timeout davon aus, dass der Upstream-Server dies tut unten, und es wird der Fehler 502 zurückgegeben.
So können Sie max_fail erhöhen und fail_timeout verringern.2.504 Gateway-Timeout-Fehler
PHP-FPM设置的脚本最大执行时间已经够长了,但执行耗时PHP脚本时,发现Nginx报错从502变为504了。这是为什么呢?
因为我们修改的只是PHP的配置,Nginx中也有关于与上游服务器通信超时时间的配置factcgi_connect/read/send_timeout。
以Nginx超时时间为90秒,PHP-FPM超时时间为300秒为例,报504 Gateway Timeout错误时的Nginx错误访问日志如下:
2013/09/19 00:55:51 [error] 27600#0: *78877 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.1.101, server: test.com, request: "POST /index.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:", host: "test.com", referrer: "http://test.com/index.php"
调高这三项的值(主要是read和send两项,默认不配置的话Nginx会将超时时间设为60秒)之后,504错误也解决了。
而且这三项配置可以配置在http、server级别,也可以配置在location级别。担心影响其他应用的话,就配置在自己应用的location中吧。
要注意的是factcgi_connect/read/send_timeout是对FastCGI生效的,而proxy_connect/read/send_timeout是对proxy_pass生效的。
配置举例:
location ~ \.php$ { root /home/cdai/test.com; include fastcgi_params; fastcgi_connect_timeout 180; fastcgi_read_timeout 600; fastcgi_send_timeout 600; fastcgi_pass unix:/dev/shm/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/cdai/test.com$fastcgi_script_name; }
Das obige ist der detaillierte Inhalt vonInstallieren und konfigurieren Sie php-fpm, um eine Nginx+PHP-Produktionsumgebung aufzubauen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!