Введение в PHP-FPM
Протокол CGI и протокол FastCGI
Файлы кода каждого динамического языка (PHP, Python и т.д.) Должны быть распознаны сервером с помощью соответствующего синтаксического анализатора. Протокол CGI используется для того, чтобы переводчики и серверы могли взаимодействовать друг с другом. Так оно и есть. Для анализа PHP-файлов на сервере необходимо использовать интерпретатор PHP вместе с соответствующим протоколом CGI, чтобы сервер мог анализировать PHP-файлы.
Поскольку механизм CGI заключается в том, чтобы разветвлять процесс CGI для каждого запроса и завершать процесс после завершения запроса, что приводит к потере ресурсов при практическом применении, появляется улучшенная версия CGI, FastCGI. FastCGI не завершает процесс после обработки запроса, но продолжает обрабатывать несколько запросов, что значительно повышает эффективность.
Что такое PHP-FPM
PHP-FPM-это PHP-менеджер процессов FastCGI, который является реализацией FastCGI и обеспечивает функцию управления процессами. Существует два вида процессов: главный процесс и рабочий процесс; главный процесс имеет только один, который отвечает за мониторинг портов и прием запросов от серверов, в то время как рабочий процесс обычно имеет более одного (определенное количество настраивается в соответствии с фактическими потребностями). Каждый процесс будет встроен с интерпретатором PHP, который является реальным выполнением кода. Место.
Механизм связи между Nginx и php-fpm
Когда мы посещаем веб-сайт (например, www.test.com), процесс заключается в следующем:
www.test.com | | Nginx | | Location to www.test.com/index.php | | Fast-cgi module loading nginx | | Fast-cgi monitors 127.0.0.1:9000 addresses | | Www.test.com/index.php request arrives at 127.0.0.1:9000 | | Waiting for processing...
Комбинация Nginx и php-fpm
В Linux существует два способа связи между nginx и php-fpm: сокет TCP и сокет UNIX.
Преимущество сокета TCP заключается в том, что он может пересекать серверы, что является единственным способом использования, когда nginx и php-fpm не находятся на одной машине.
Сокет Unix, также известный как сокет IPC (межпроцессная связь), используется для обеспечения межпроцессной связи на одном хосте. Этот метод требует заполнения местоположения файла сокета php-fpm в файле конфигурации nginx.
Процесс передачи данных в двух режимах показан на следующем рисунке:
Различия между ними заключаются в следующем:
Поскольку сокету Unix не нужно проходить через стек сетевых протоколов, не нужно упаковывать и распаковывать, вычислять контрольную сумму, сохранять порядковый номер и отвечать, просто скопируйте данные прикладного уровня из одного процесса в другой. Таким образом, его эффективность выше, чем у сокета TCP, что может снизить ненужные издержки TCP. Так оно и есть. Однако сокет UNIX нестабилен, когда он имеет высокий параллелизм. Когда количество подключений резко возрастет, будет сгенерировано большое количество долгосрочных кэшей. Без поддержки протоколов, ориентированных на подключение, Большие пакеты данных могут совершать прямые ошибки без возврата исключений Это так. Протокол, ориентированный на подключение, такой как TCP, может лучше гарантировать правильность и целостность связи.
Комбинация Nginx и php-fpm требует только настроек в соответствующих файлах конфигурации:
1) Конфигурация в Nginx
Возьмем в качестве примера связь через TCP-сокет
server {
Listen 80; listen on port 80 to receive HTTP requests
Server_name www.test.com; is the website address
Root/usr/local/etc/nginx/www/huxintong_admin; Prepare the path to store code engineering
# Processing when routing to the website root directory www.test.com
location / {
Index index.php;# jump to www.test.com/index.php
autoindex on;
}
# When requesting PHP files under the website, reverse proxy to php-fpm
location ~ .php$ {
Include / usr / local / etc / nginx / fastcgi. conf; load the fastcgi module of nginx
fastcgi_intercept_errors on;
Fastcgi_pass 127.0.0.1:9000; TCP mode, IP address and port monitored by php-fpm
# fasrcgi_pass/usr/run/php-fpm.sock# UNIX socket connection mode
}
}2) Настройка php-fpm
2) Настройка php-fpm
listen = 127.0.0.1:9000 # Or something like this listen = /var/run/php-fpm.sock
Обратите внимание, что при использовании режима сокета UNIX для подключения, поскольку файл сокета по сути является файлом, возникает проблема контроля привилегий, поэтому нам нужно обратить внимание на привилегии процесса nginx и php-fpm, иначе нам будет предложено не иметь доступа к привилегиям. (Настройка пользователей в их файлах конфигурации)
С помощью вышеуказанной конфигурации связь между php-fpm и nginx может быть завершена.
Выбор в применении
Если nginx и php-fpm работают на одном сервере и параллелизм не высок (не более 1000), сокет UNIX выбирается для повышения эффективности связи между nginx и php-fpm. Если вы столкнулись с высоким уровнем параллельных служб, рассмотрите возможность использования более надежного TCP-сокета для поддержания эффективности за счет балансировки нагрузки и оптимизации ядра.
Если параллелизм высок, но вы все еще хотите использовать сокет UNIX, стабильность сокета UNIX можно улучшить следующими способами.
1) Поместите файлы sock в каталог/dev/SHM, где файлы sock хранятся в памяти, и память может читать и записывать быстрее.
2) Увеличение отставания
Бит по умолчанию 128, 1024 лучше всего преобразовать в их обычное QOS, конфигурация выглядит следующим образом.
Файл Nginx.conf
server {
listen 80
default backlog = 1024;
}Файл Php-fpm.conf
listen.backlog = 1024
3) Увеличьте файл sock и экземпляр php-fpm
Создайте новый файл sock в/dev/shm, распределите нагрузку запроса на два файла sock через вышестоящий модуль в nginx и сопоставьте два файла sock двум экземплярам php-fpm соответственно.