Всесторонний анализ принципа взаимодействия PHP-FPM+Nginx

PHP
Всесторонний анализ принципа взаимодействия PHP-FPM+Nginx

введение

Я так давно использую PHP+Nginx, вы понимаете принцип связи между ними? На этот раз сделайте настоящего PHP-программиста (вПредыдущийВ статье полностью представлены CGI, FastCGI, PHP-FPM, поэтому в этой статье эти понятия подробно не представлены)

PHP-FPM

Полное название PHP-FPM:PHP FastCGI Process Manager, PHP-FPM является реализацией FastCGI и обеспечивает функцию управления процессами. Процесс FastCGI включает в себя два процесса: главный процесс и рабочий процесс. Существует только один главный процесс, который отвечает за прослушивание портов и получение запросов от Nginx, в то время как рабочих процессов, как правило, несколько (настраиваемых) Каждый процесс имеет встроенный интерпретатор PHP, в котором фактически выполняется код PHP. .

Nginx

Nginx («engine x») — это высокопроизводительный HTTP и обратный прокси-сервер, а также сервер IMAP/POP3/SMTP. Вот введение в то, что такое прямой прокси и обратный прокси, что очень важно для нас, чтобы понять Nginx.

прямой прокси

Например, мы посещаем иностранные веб-сайты, такие как посещение Google и Facebook. Нам нужно использовать vpn для доступа.Мы используем vpn для доступа к иностранным веб-сайтам, что на самом деле является прямым прокси-процессом.Рисунок выше:

VPN воспринимается пользователем (поскольку пользователю необходимо настроить соединение), а vpn незаметен для сервера google (сервер google знает только о том, что идет HTTP-запрос). Следовательно, сервер, который может быть воспринят пользователем, но не может быть воспринят сервером, является прямым прокси-сервером (vpn).

обратный прокси

В качестве примера возьмем Nginx в качестве обратного прокси-сервера для достижения балансировки нагрузки.Предположим, мы в это время заходим в Baidu и видим картину:

Когда пользователь посещает Baidu, все запросы поступают на обратный прокси-сервер, который передает запрос на более поздний сервер для обработки. В это время прокси-сервер фактически незаметен для пользователя.Пользователь воспринимает то, что сервер Baidu вернул результат самому себе, и он не знает о существовании прокси-сервера. То есть незаметно для пользователя и ощутимо для сервера, который называется обратным прокси-сервером (Nginx).

Связь PHP-FPM+Nginx

FastCGI стремится уменьшить нагрузку на взаимодействие между веб-сервером и программами CGI, чтобы сервер мог обрабатывать больше веб-запросов одновременно. В отличие от CGI, который создает новый процесс для каждого запроса, FastCGI использует постоянные процессы для обработки серии запросов.Эти процессы управляются менеджером процессов FastCGI, а не веб-сервером..

Понимание связи между PHP-FPM и Nginx с помощью диаграмм(1) Когда Nginx получает HTTP-запрос (динамический запрос), он инициализирует среду FastCGI. (Если это сервер Apache, инициализируйте модуль mode_fastcgi, а если это сервер Nginx, инициализируйте модуль ngx_http_fastcgi_module)

(2) Когда мы настраиваем nginx для разбора php-запросов, обычно есть такая строка конфигурации:

fastcgi_pass   127.0.0.1:9000;

Или выглядеть так:

fastcgi_pass  unix:/tmp/php-cgi.sock;

На самом деле это коммуникационный носитель (или метод связи) между Nginx и PHP-FPM, цель которого — сообщить Nginx, куда отправлять динамические запросы после их получения. (Разница между этими двумя конфигурациями будет представлена ​​позже)

(3) Nginx передает запрос основному процессу FastCGI по сокету

(4) Основной процесс FastCGI выбирает подключение к незанятому рабочему процессу, а затем Nginx отправляет переменные среды CGI и стандартный ввод рабочему процессу (php-cgi).

(5) После того, как рабочий процесс завершает обработку, стандартный вывод и информация об ошибках отправляются изтакое же подключение к розеткеВернуться к Nginx

(6) Рабочий процесс закрывает соединение и ожидает следующего соединения.

Не с точки зрения конфигурации, опишите связь между PHP и Nginx.

  • Мы знаем, что в Nginx также есть главный и рабочий процессы, и рабочий процесс напрямую обрабатывает каждый сетевой запрос.
  • На самом деле, в архитектуре Nginx+PHP php можно рассматривать как роль cgi-программы, поэтому менеджер процессов php-fpm обрабатывает эти php-запросы. Как и nginx, php-fpm также прослушивает порты (из конфигурации в nginx.conf мы знаем, что nginx по умолчанию прослушивает порт 8080, а php-fpm по умолчанию прослушивает порт 9000) и имеет главные и рабочие процессы, и worker отвечает за обработку каждого запроса php
  • О fastcgi: fastcgi — это протокол. На рынке существует множество менеджеров процессов, реализующих протокол fastcgi, и php-fpm — один из них. Как служба управления процессами fastcgi, php-fpm будет прослушивать порты.Как правило, по умолчанию он прослушивает порт 9000 и слушает эту машину, то есть получает запросы портов только от этой машины.
  • Что касается файла конфигурации fastcgi, в настоящее время файл конфигурации fastcgi обычно размещается в том же каталоге, что и nginx.conf.Как правило, существует два типа файлов конфигурации:
fastcgi.conf和 fastcgi_params。
不同的nginx版本会有不同的配置文件,这两个配置文件有一个非常重要的区别:fastcgi_parames文件中缺少下列配置:
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

Мы можем открыть файл fastcgi_params и добавить указанную выше строку или добавить ее динамически там, где мы хотим использовать конфигурацию. сделать так, чтобы конфигурация вступила в силу

  • Когда необходимо обработать php-запрос, рабочий процесс nginx передаст запрос рабочему процессу php-fpm для обработки, то есть nginx вызывает php, как упоминалось в начале.На самом деле, строго говоря, nginx косвенно вызывает php (обратный прокси).Кстати)

Я настроил конфигурацию nginx, которая может нормально анализировать программу php, и представил значение каждой строки конфигурации.

server{
 listen 8080;
 index index.php
 root /work/html/;

 location ~ [^/]\.php(/|$)
 {
      root         /work/html/;  
        fastcgi_pass   127.0.0.1:9000;  
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;  
        include        fastcgi_params;   
 }
 access_log /work/html/logs/test.log;
}
  1. Сервер первой фигурной скобки{ }: представляет собой независимый сервер
  2. listen 8080: представляет сервер, прослушивающий порт 8080.
  3. location ~ [^/].php(/|$){ }: представляет расположение, которое может соответствовать соответствующему uri, которое используется для сопоставления типа uri и настройки логики и конфигурации для соответствующего запроса uri. Местоположение здесь соответствует всем запросам uri с .php, например: http://192.168.244.128:8011/test.php/asdasd http://192.168.244.128:8011/index.php и т. д.
  4. root /work/html/: запросите корневой каталог ресурса, укажите uri, соответствующий местоположению, чтобы перейти в папку /work/html/, чтобы найти ресурс с тем же именем.
  5. fastcgi_pass 127.0.0.1:9000: эта строка кода означает, что запрос uri, входящий в местоположение, рассматривается как программа cgi, и запрос отправляется на порт 9000 для обработки php-fpm (конфигурация php-fpm увидит, что он прослушивает на этом порту)
  6. fastcgi_param SCRIPT_FILENAME fastcgi_script_name; : Эта строка конфигурации означает: строка конфигурации fastcgi добавляется динамически, а содержимое конфигурации — SCRIPT_FILENAME, которое указывает процесс управления и имя сценария cgi. Поскольку в моем nginx есть только файл fastcgi_params, файла fastcgi.conf нет, поэтому, чтобы php-fpm знал конкретное значение SCRIPT_FILENAME, мы должны динамически добавить эту строку конфигурации.
  7. включить fastcgi_params; ввести файл конфигурации fastcgi

fastcgi_pass

Существует два способа межпроцессного взаимодействия между Nginx и PHP-FPM.TCP Socket, одинUnix Socket.

Метод Tcp Socket — это IP плюс порт, который может пересекать серверы. Сокет UNIX не проходит через сеть и может использоваться только в сценарии, когда Nginx и PHP-FPM находятся на одном сервере. Какой из них используется, зависит от вашего Конфигурация PHP-FPM.

Режим TCP-сокета:Конфигурация в nginx.conf: fastcgi_pass 127.0.0.1:9000; Конфигурация в php-fpm.conf: listen=127.0.0.1:9000;

Режим сокета домена Unix:Конфигурация в nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock; Конфигурация в php-fpm: listen = /tmp/php-fpm.sock; (php-fpm.sock — это файл, сгенерированный php-fpm)

Пример:Два метода настройки связи, процесс связи между Nginx и PHP-FPM выглядит следующим образом:TCP-сокет:

Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM

(Это то, как мы рисовали выше изображение связи Nginx и PHP-FPM,В этом случае Nginx и PHP-FPM на одной машине.) Взгляните на ситуацию, когда Nginx и PHP-FPM находятся на разных машинах:

Nginx <=> socket <=> TCP/IP <=> 物理层 <=> 路由器 <=> 物理层 <=> TCP/IP <=> socket <=> PHP-FPM

Unix-сокеты:

Nginx <=> socket <=> PHP-FPM

include fastcgi_params;

В nginx есть много конфигураций fasgcgi_*.Больше конфигураций можно увидеть в каталоге того же уровня nginx.conf.В fastcgi.conf и fastcgi_params разница между ними описана выше. Взгляните, что внутри:Содержимое здесь будет передано процессу fastcgi, управляемому PHP-FPM. Зачем проходить эти? Я считаю, что все использовали глобальную переменную $_SERVER, и значение здесь получено из этой конфигурации. Мы можем видеть REMOTE_ADDR в fastcgi_params, который является адресом клиента.Причина, по которой PHP может получить информацию о клиенте, заключается в fastcgi_params в конфигурации Nginx. Для получения дополнительной информации о модуле ngx_http_fastcgi_module вы можете ознакомиться с официальной документацией: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html.

конфигурация php-fpm.conf

Знакомство с конфигурацией php-fpm может помочь нам оптимизировать производительность сервера.

emergency_restart_threshold = 60
emergency_restart_interval = 60s

Указывает, что если количество процессов php-cgi с ошибками SIGSEGV или SIGBUS в пределах значения, установленного Emergency_restart_interval, превышает Emergency_restart_threshold, php-fpm перезапустится корректно. Эти два параметра обычно сохраняют свои значения по умолчанию.

process_control_timeout = 0

Устанавливает время ожидания для дочернего процесса для получения мультиплексированных сигналов от основного процесса Доступные единицы измерения: с (секунды), м (минуты), ч (часы) или д (дни) Единица по умолчанию: с (секунды) Значение по умолчанию : 0.

listen = 127.0.0.1:9000

Порт прослушивания fpm, то есть адрес, обрабатываемый php в nginx, обычно является значением по умолчанию. Доступные форматы: 'ip:port', 'port', '/path/to/unix/socket'. Необходимо настроить каждый пул процессов.

request_slowlog_timeout = 10s
#当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 ’0′ 表示 ‘Off’
 
slowlog = log/$pool.log.slow
慢请求的记录日志,配合request_slowlog_timeout使用

Наиболее важны следующие параметры конфигурации:

pm
pm指的是process manager,指定进程管理器如何控制子进程的数量,它为必填项,支持3个值
(1)static: 使用固定的子进程数量,由pm.max_children指定(可以同时存活的子进程的最大数量)
(2)dynamic:基于下面的参数动态的调整子进程的数量,至少有一个子进程(会使用下边几个配置)
pm.start_servers: 启动时创建的子进程数量,默认值为min_spare_servers + max_spare_servers - min_spare_servers) / 2

pm.min_spare_servers: 空闲状态的子进程的最小数量,如果不足,新的子进程会被自动创建

pm.max_spare_servers: 空闲状态的子进程的最大数量,如果超过,一些子进程会被杀死
(3)ondemand: 启动时不会创建子进程,当新的请求到达时才创建,有下边两个配置
pm.max_children
pm.process_idle_timeout 子进程的空闲超时时间,如果超时时间到没有新的请求可以服务,则会被杀死

区别:
如果pm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程
如果pm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效
系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程,
然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数

还有一个比较重要的配置:
pm.max_requests
每一个子进程的最大请求服务数量,如果超过了这个值,该子进程会被自动重启。在解决第三方库的内存泄漏问题时,这个参数会很有用。默认值为0,指子进程可以持续不断的服务请求

Пул процессов PHP-FPM

Пул процессов настроен по умолчанию в php-fpm.conf. Мы можем открыть наш php-fpm.conf и посмотреть. Ниже мой:Теперь давайте выполним: ps -aux|grep php-fpmВы увидите, что есть главный и 10 рабочих процессов, то же самое, что мы настроили (www — это имя пула процессов).

Если вы хотите настроить более одного, вы можете сделать это: Вы можете настроить, какой пул процессов использовать в fastcgi_pass в nginx.

Ссылаться на:

https://www.php.cn/php-weizijiaocheng-393152.html https://www.cnblogs.com/skynet/p/4173450.html https://blog.csdn.net/afring/article/details/93880216 https://www.cnblogs.com/ahaii/p/5776809.html