justification:
navigateur processus pour accéder au Web
Les demandes de pages statiques
Browser(浏览器)
Demande http://xxx.com/aa.html
-> Web Server (Nginx / Apache ) Distribution -> trouver le aa.html
dos de fichier Browser
.
Demande un script dynamique
Browser
Demande http://xxx.com/bb.php
-> Web Server (Nginx / Apache ) distribution PHP解析器
-> ( PHP-CGI
programme) -> retourner les résultats au serveur Web -> les données de retour au navigateur.
Principe: Selon le serveur 配置文件
, nous savons qu'il est un PHP
fichier de script, vous devez aller PHP解析器
à traiter.
PHP解析器
Il analyse le php.ini
fichier pour initialiser l'environnement d'exécution, et traite ensuite la demande, puis retourner les résultats au format de données standard, et enfin quitter le processus.
programmes CGI à l'histoire de l'évolution de la FPM
![](https://upload-images.jianshu.io/upload_images/5069668-0e999574da686fb6.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/550/format/webp)
CGI (Common Gateway Interface)
CGI
Langue pour interagir avec le protocole serveur dorsal, avec ce protocole, les développeurs peuvent utiliser un serveur de traitement de langage transmet la requête sur le contenu généré dynamiquement, de sorte que les données sont transmises sur 标准格式
le (spécifiée 以什么样的格式传哪些数据(URL、查询字符串、POST数据、HTTP header等等
)) pour faciliter le développeur .
PHP-CGI (CGI PHP)
PHP语言
Correspondant à l'interaction avec le serveur CGI程序
est PHP-CGI
.
CGI程序
Lui - même que 解析请求
, et 返回结果
sera pas 进程管理
, donc il y a une erreur fatale, qui est, traitant chacun d'une demande nécessite fork
un nouveau processus, ainsi que Web
la montée de plus en plus forte concurrence de la norme, de telle manière inefficace évidemment ne peut pas répondre à la demande (chaque fois , web请求
il y aura 启动和退出进程
, qui est le plus critiqué fork-and-execute
modèle, dans un tel concurrent à grande échelle, mort).
De cette façon, FastCGI
il est né, CGI程序
et bientôt retirer de la scène historique.
FastCGI (CGI rapide)
FastCGI
Par définition , il est plus rapide CGI程序
, d'améliorer les CGI程序
performances, ce qui permet 在一个进程内处理多个请求
, au lieu d'une demande est traitée directement à la fin du processus a été grandement amélioré les performances.
- Améliorer la performance? Ensuite , les
CGI程序
problèmes de performance se trouvent?
PHP解析器
Parse le php.ini
fichier, l' initialisation de l'environnement d'exécution, il est ici.
Standard CGI程序
ces étapes pour chaque demande (non Leia occupé! Commencez le processus très fatigué pour dire!), La poignée Donc , chaque fois de la demande sera plus longue. Ceci est évidemment chose déraisonnable!
- Alors ,
FastCGI
il est comment le faire?
Tout d' abord, FastCGI
nous allons d' abord commencer un master进程
fichier de configuration d' analyse syntaxique, initialiser l'environnement d'exécution, puis commencer plus worker进程
. Lorsqu'une demande est venue, master
passé à un worker
, puis la requête suivante peut être acceptée immédiatement.
Cela évitera les doubles emplois, l' efficacité naturellement élevé.
Et quand worker
le temps ne suffit pas, master
vous pouvez démarrer à l' avance selon la configuration de plusieurs worker
autres.
Bien sûr, au repos le worker
temps trop, a également arrêté un certain nombre, améliorant ainsi les performances, mais aussi d' économiser les ressources. Ceci est la FastCGI
gestion du processus.
ps: il y a certains capables de 调度PHP-CGI进程
programmes, tels que l' lighthttpd
isolement spawn-fcgi
. Eh bien, PHP-FPM
est une substance, après une longue période de développement, a été progressivement reconnu par tout le monde (mais vous devez savoir il y a quelques années pour se plaindre de PHP-FPM
mauvaise stabilité), sont de plus en plus populaires.
![](https://upload-images.jianshu.io/upload_images/5069668-4cf54254181a7d0b.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/599/format/webp)
PHP-FPM (FastCGI gestionnaire de processus)
Il est FastCGI协议
une mise en œuvre de toute mise en œuvre des FastCGI协议
serveurs sont en mesure de communiquer.
FPM
Les fondé sur des normes FastCGI程序
, fournit également des fonctionnalités améliorées, se référer spécifiquement à la documentation officielle: PHP: Installation FPM .
-
FPM
Il est unPHP进程管理器
contenantmaster
etworker
deux types de processus.
master进程
Un seul, responsable du port de surveillance, la réception d' une demande du serveur, et worker进程
alors généralement multiples (basé sur le besoin réel de nombre spécifique de configuration), sont intégrés dans chaque un processus PHP解释器
, il est PHP代码
où l'exécution réelle, ce qui suit est mon pays natal FPM
de conditions opératoires: 1 master进程
, 2 worker进程
.
$ ps -ef | grep fpm
root 130 1 0 01:37 ? 00:00:01 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
php-fpm 131 130 0 01:37 ? 00:00:00 php-fpm: pool www
php-fpm 133 130 0 01:43 ? 00:00:00 php-fpm: pool www
- De la
FPM
réception de la demande, le traitement est terminé, le processus spécifique est la suivante:
FPM
Lamaster进程
réception de la demande.master进程
En fonction de la configuration spécifique attribué unworker进程
traitement de la demande, si le processus n'est pas disponible, une erreur est renvoyée, ce qui est la raison pour laquelle nous travaillonsNginx
rencontre502
plus des mauvaises raisons.worker
Processus pour traiter la demande, si le temps de départ, de retour d'504
erreur.- Traitement des demandes extrémités et renvoie le résultat.
FPM
De recevoir le flux des demandes de traitement est le cas, alorsNginx
il est de savoir comment envoyer des requêtes àFPM
elle?
Cela nécessite de Nginx
niveau simple ,.
Nous le savons, Nginx
il pas seulement un Web服务器
, est une fonctionnalité puissante Proxy服务器
, en plus de http请求
l'agent, l'agent peut également être beaucoup d' autres demandes de protocole, y compris le papier et FPM
pertinents FastCGI协议
. Afin de rendre la Nginx
compréhension FastCGI协议
, Nginx
il est prévu FastCGI模块
d'être http请求
mis en correspondance avec une correspondante FastCGI
demande.
Nginx
Est FastCGI模块
fourni fastcgi_param指令
au traitement principal 映射关系
, ce qui suit est Nginx
un exemple d'un fichier de configuration, qui est le principal travail des Nginx
variables traduites en PHP
variables peuvent être appréciées.
$ cat /usr/local/nginx/conf/fastcgi.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
En outre, la chose est très important fastcgi_pass指令
, cette commande permet de spécifier FPM进程
l'adresse de l'auditeur, Nginx
seront tous PHP请求
traduits FastCGI请求
et envoyés à cette adresse plus tard. Voici un travail simple peut Nginx配置文件
:
server {
listen 80;
server_name test.me;
root /usr/local/web/myproject/public;
index index.php index.html index.htm;
access_log /usr/local/nginx/logs/test-access.log;
error_log /usr/local/nginx/logs/test-error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~\.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/local/web/myproject/public/$fastcgi_script_name;
fastcgi_pass unix:/usr/local/php/var/run/php-fpm.sock;
fastcgi_index index.php;
}
}
Dans ce profil, nous avons créé une nouvelle 虚拟主机
, l' écoute 80端口
, 项目根目录
comme /usr/local/web/myproject/public
. D' ici là , nous location指令
allons tous .php结尾
les demandes de FastCGI模块
processus, ce qui porte tous PHP请求
sont livrés à un FPM
traitement, complétant ainsi Nginx
la FPM
boucle fermée.
Donc , puisque Nginx
l' FPM
ensemble du processus de communication devrait être plus clair.
![](http://upload-images.jianshu.io/upload_images/5069668-cbd0b7e1372f8433.png?imageMogr2/auto-orient/strip|imageView2/2/w/559/format/webp)
- Modifier
php.ini
le fichier de configuration, utilisezPHP-FPM
Pourquoi peut lisser redémarrer?
Modification php.ini
après, PHP-CGI进程
il n'y a aucun moyen d' un redémarrage en douceur.
PHP-FPM
Le mécanisme de ce processus est nouveau worker进程
avec la nouvelle configuration, existant worker进程
traitée peut récupérer des mains des vivants, et à travers ce mécanisme 平滑过渡
.