Введение в 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
|
|
路由到www.test.com/index.php
|
|
加载nginx的fast-cgi模块
|
|
fast-cgi监听127.0.0.1:9000地址
|
|
www.test.com/index.php请求到达127.0.0.1:9000
|
|
等待处理...
Сочетание 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; #监听80端口,接收http请求
server_name www.test.com; #就是网站地址
root /usr/local/etc/nginx/www/huxintong_admin; # 准备存放代码工程的路径
#路由到网站根目录www.test.com时候的处理
location / {
index index.php; #跳转到www.test.com/index.php
autoindex on;
}
#当请求网站下php文件的时候,反向代理到php-fpm
location ~ \.php$ {
include /usr/local/etc/nginx/fastcgi.conf; #加载nginx的fastcgi模块
fastcgi_intercept_errors on;
fastcgi_pass 127.0.0.1:9000; # tcp 方式,PHP-fpm 监听的IP地址和端口
# fasrcgi_pass /usr/run/php-fpm.sock # unix socket 连接方式
}
}
- конфигурация php-fpm
listen = 127.0.0.1:9000
# 或者下面这样
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 невыполненных битовых значений по умолчанию предпочтительно преобразуются в их обычные QPS, настроенные следующим образом.
в файле 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 соответственно.