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