Maison > développement back-end > tutoriel php > Installez et configurez php-fpm pour créer un environnement de production Nginx+PHP

Installez et configurez php-fpm pour créer un environnement de production Nginx+PHP

不言
Libérer: 2023-03-29 12:42:01
original
12973 Les gens l'ont consulté

Cet article présente principalement comment installer et configurer php-fpm pour créer un environnement de production Nginx+PHP. La fonction de php-fpm est d'intégrer la gestion des processus FastCGI dans le package PHP. Les amis qui en ont besoin peuvent s'y référer. 🎜>

nginx lui-même ne peut pas gérer PHP. Il s'agit simplement d'un serveur Web. Lorsqu'une requête est reçue, s'il s'agit d'une requête PHP, elle sera envoyée à l'interpréteur PHP pour traitement et le résultat sera renvoyé au client. .

nginx envoie généralement la demande au processus de gestion fastcgi pour traitement. Le processus de gestion fascgi sélectionne le résultat du traitement du sous-processus cgi et le renvoie à nginx

Cet article utilise php-fpm comme paramètre. exemple pour présenter comment faire en sorte que nginx prenne en charge PHP

1 Compiler et installer php-fpm

Qu'est-ce que PHP-FPM

C'est PHP-FPM. un gestionnaire PHP FastCGI, qui n'est utilisé que pour PHP. Il peut être téléchargé sur http://php-fpm.org/download

PHP-FPM est en fait un patch de code source PHP, visant à intégrer FastCGI. gestion des processus dans le package PHP. Il doit être corrigé dans votre code source PHP et peut être utilisé après la compilation et l'installation de PHP.

La nouvelle version de PHP a intégré php-fpm, qui n'est plus un package tiers, il est recommandé de l'utiliser. PHP-FPM fournit une meilleure méthode de gestion des processus PHP, peut contrôler efficacement la mémoire et les processus et recharger en douceur la configuration PHP. Il présente plus d'avantages que spawn-fcgi, il est donc officiellement inclus dans PHP. Vous pouvez activer PHP-FPM avec le paramètre –enable-fpm dans ./configure. D'autres paramètres sont configurés pour php. La signification spécifique des options peut être trouvée ici.

Préparation avant installation

Exécuter sous centos

yum -y install gcc automake autoconf libtool make

yum -y install gcc gcc-c++ glibc

yum -y install libmcrypt-devel mhash-devel libxslt-devel
Copier après la connexion

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
Copier après la connexion

Nouvelle version d'installation de php-fpm (méthode d'installation recommandée)

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
Copier après la connexion

--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
Copier après la connexion

make all install
Copier après la connexion

Les deux méthodes ci-dessus peuvent être utilisées pour installer php-fpm Après l'installation, le contenu est placé dans le répertoire /usr/local/php


.

201615100155789.png (300×41)

Ce qui précède termine l'installation de php-fpm.

Ce qui suit consiste à définir l'utilisateur exécutant php-fpm

cd /usr/local/php
cp etc/php-fpm.conf.default etc/php-fpm.conf
vi etc/php-fpm.conf
Copier après la connexion

Modifier


user = www-data
group = www-data
Copier après la connexion

Si l'utilisateur www-data n'existe pas, ajoutez d'abord l'utilisateur www-data


groupadd www-data
useradd -g www-data www-data
Copier après la connexion

2. Compilez et installez nginx

3. Modifiez le fichier de configuration nginx pour prendre en charge php-fpm

Après l'installation de nginx. est terminé, modifiez le fichier de configuration nginx Ajoutez la configuration suivante à la section serveur de nginx.conf

Faites attention à la configuration du contenu rouge, sinon l'erreur Aucun fichier d'entrée spécifié apparaîtra

<🎜. >

# 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;
}
Copier après la connexion

4. Créez un fichier php de test

Créez un fichier php

Créez le fichier index.php sous /usr/local/nginx/html et entrez le contenu suivant

<?php
  echo phpinfo();
?>
Copier après la connexion

5. Démarrez le service

<🎜. >Démarrez php-fpm et nginx

/usr/local/php/sbin/php-fpm 
#手动打补丁的启动方式/usr/local/php/sbin/php-fpm start

sudo /usr/local/nginx/nginx
Copier après la connexion
Fermez et redémarrez php-fpm, voir la fin de l'article

6. Accès au navigateur

Visitez http:// Vous pouvez voir les informations php sur votre serveur ip/index.php.


201615100326710.png (300×120)


7. Résolution d'erreur

Lorsque vous utilisez Nginx, vous rencontrez souvent 502 Bad Gateway. et 504 erreurs de délai d'attente de passerelle. Utilisons Nginx+PHP-FPM pour analyser les causes et les solutions de ces deux erreurs courantes.
Erreur 1.502 Bad Gateway

Il y a deux éléments de configuration respectivement dans php.ini et php-fpm.conf : max_execution_time et request_terminate_timeout. Ces deux éléments permettent de configurer le temps d'exécution maximum d'un script PHP. Lorsque ce délai est dépassé, PHP-FPM mettra non seulement fin à l'exécution du script,

mettra également fin au processus Worker exécutant le script. Par conséquent, Nginx constatera que la connexion pour communiquer avec lui-même est rompue et renverra une erreur 502 au client.


En prenant comme exemple request_terminate_timeout=30 secondes de PHP-FPM, les informations spécifiques de l'erreur 502 Bad Gateway sont les suivantes :
1) Journal d'accès aux erreurs Nginx :



   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"
Copier après la connexion
2) Journal des erreurs PHP-FPM :


   WARNING: child 25708 exited on signal 15 (SIGTERM) after 21008.883410 seconds from start
Copier après la connexion
Alors ajoutez simplement Ceci En augmentant les valeurs de ces deux éléments, le script PHP ne sera pas terminé en raison d'un temps d'exécution long. request_terminate_timeout peut remplacer max_execution_time,

donc si vous ne souhaitez pas modifier le php.ini global, modifiez simplement la configuration de PHP-FPM.

De plus, veuillez noter les éléments max_fail et fail_timeout dans le module en amont de Nginx. Parfois, la communication entre Nginx et le serveur en amont (tel que Tomcat, FastCGI) n'est interrompue qu'accidentellement
Mais si max_fail est défini sur une valeur relativement petite, alors dans le prochain délai d'échec, Nginx pensera que le serveur en amont est. vers le bas, et il renvoie une erreur 502.

Vous pouvez donc augmenter max_fail et diminuer fail_timeout.



2.504 Erreur d'expiration du délai de passerelle

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"
Copier après la connexion

调高这三项的值(主要是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;
   }
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal