Nginx et la compréhension du mécanisme de travail de PHP-FPM communication? point d'inspection de l'entrevue (mise au point)

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.htmldos de fichier Browser.

Demande un script dynamique

BrowserDemande http://xxx.com/bb.php-> Web Server (Nginx / Apache ) distribution PHP解析器-> ( PHP-CGIprogramme) -> retourner les résultats au serveur Web -> les données de retour au navigateur.

Principe: Selon le serveur 配置文件, nous savons qu'il est un PHPfichier de script, vous devez aller PHP解析器à traiter.
PHP解析器Il analyse le php.inifichier 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

 

CGI (Common Gateway Interface)

CGILangue 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 forkun nouveau processus, ainsi que Webla 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-executemodèle, dans un tel concurrent à grande échelle, mort).
De cette façon, FastCGIil est né, CGI程序et bientôt retirer de la scène historique.


FastCGI (CGI rapide)

FastCGIPar 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.inifichier, 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 , FastCGIil est comment le faire?

Tout d' abord, FastCGInous 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, masterpassé à un worker, puis la requête suivante peut être acceptée immédiatement.
Cela évitera les doubles emplois, l' efficacité naturellement élevé.
Et quand workerle temps ne suffit pas, mastervous pouvez démarrer à l' avance selon la configuration de plusieurs workerautres.
Bien sûr, au repos le workertemps trop, a également arrêté un certain nombre, améliorant ainsi les performances, mais aussi d' économiser les ressources. Ceci est la FastCGIgestion du processus.

ps: il y a certains capables de 调度PHP-CGI进程programmes, tels que l' lighthttpdisolement spawn-fcgi. Eh bien, PHP-FPMest 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-FPMmauvaise stabilité), sont de plus en plus populaires.


 

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.
FPMLes 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 .

  • FPMIl est un PHP进程管理器contenant masteret workerdeux 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 FPMde 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 FPMréception de la demande, le traitement est terminé, le processus spécifique est la suivante:
  1. FPMLa master进程réception de la demande.
  2. master进程En fonction de la configuration spécifique attribué un worker进程traitement de la demande, si le processus n'est pas disponible, une erreur est renvoyée, ce qui est la raison pour laquelle nous travaillons Nginxrencontre 502plus des mauvaises raisons.
  3. workerProcessus pour traiter la demande, si le temps de départ, de retour d' 504erreur.
  4. Traitement des demandes extrémités et renvoie le résultat.
  • FPMDe recevoir le flux des demandes de traitement est le cas, alors Nginxil est de savoir comment envoyer des requêtes à FPMelle?

Cela nécessite de Nginxniveau simple ,.

Nous le savons, Nginxil 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 FPMpertinents FastCGI协议. Afin de rendre la Nginxcompréhension FastCGI协议, Nginxil est prévu FastCGI模块d'être http请求mis en correspondance avec une correspondante FastCGIdemande.

NginxEst FastCGI模块fourni fastcgi_param指令au traitement principal 映射关系, ce qui suit est Nginxun exemple d'un fichier de configuration, qui est le principal travail des Nginxvariables traduites en PHPvariables 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, Nginxseront 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 FPMtraitement, complétant ainsi Nginxla FPMboucle fermée.
Donc , puisque Nginxl' FPMensemble du processus de communication devrait être plus clair.

 
image
  • Modifier php.inile fichier de configuration, utilisez PHP-FPMPourquoi peut lisser redémarrer?

Modification php.iniaprès, PHP-CGI进程il n'y a aucun moyen d' un redémarrage en douceur.
PHP-FPMLe 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 平滑过渡.

Je suppose que tu aimes

Origine www.cnblogs.com/beyond-succeed/p/12615059.html
conseillé
Classement