Как nginx+php выполняет запросы

PHP

как работает пхп

Прежде всего, сначала поймите, какая связь между cgi, php-cgi, fastcgi и php-fpm, которые часто можно услышать, чтобы помочь понять принцип работы php.

cgi-протокол

Протокол cgi используется для определения веб-сервера (например, nginx), то есть, какие данные и в каком формате данные доставляет сервер распространения контента.

интерпретатор процесса php-cgi

php-cgi — это интерпретатор процесса протокола cgi в php.Каждый раз, когда он запускается, ему необходимо пройти через процесс загрузки файла php.ini -> инициализация среды выполнения -> обработка запроса -> возврат содержимого на веб-сервер -> выход из процесса php-cgi

протокол fastcgi

Протокол fastcgi является дополнением к повышению эффективности протокола cgi.Он в основном оптимизирован для необходимости запуска процесса интерпретатора cgi каждый раз, когда приходит запрос.Процессу интерпретатора cgi больше не нужно перезагружать php каждый раз он получает запрос веб-сервера.ini файл и среду выполнения инициализации

Менеджер процессов php-fpm

php-fpm — это реализация протокола fastcgi. Это менеджер процессов. Он включает в себя главный и рабочий процессы при запуске. Главный процесс отвечает за управление рабочими процессами. Как правило, существует несколько рабочих процессов, которые используются для мониторинга портов. , получать запросы от веб-серверов, и каждый рабочий процесс имеет интерпретатор процесса cgi для выполнения php-кода.

Как запускается и работает php

При запуске phpfpm запускается основной процесс, загружается файл php.ini, инициализируется среда выполнения и запускаются несколько рабочих процессов. Каждый раз, когда приходит запрос, рабочий процесс, слушающий порт, будет его обрабатывать.

Принцип плавного перезапуска PHP

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

Как работает нгинкс

Если вы хотите понять принцип взаимодействия nginx и php, вам также необходимо разобраться в серверной части в конфигурационном файле nginx

server {
    listen       80; #监听80端口,接收http请求
    server_name  www.example.com; #一般存放网址,表示配置的哪个项目
    root /home/wwwroot/zensmall/public/; # 存放代码的根目录地址或代码启动入口
    index index.php index.html; #网站默认首页
	
    #当请求网站的url进行location的前缀匹配且最长匹配字符串是该配置项时,按顺序检查文件是否存在,并返回第一个找到的文件
    location / {
    	  #try_files,按顺序检查文件是否存在,返回第一个找到的文件
    	  #$uri代表不带请求参数的当前地址
          #$query_string代表请求携带的参数
    	  try_files   $uri $uri/ /index.php?$query_string; #按顺序检查$uri文件,$uri地址是否存在,如果存在,返回第一个找到的文件;如果都不存在,发起访问/index.php?$query_string的内部请求,该请求会重新匹配到下面的location请求
    }
    
	 #当请求网站的php文件的时候,反向代理到php-fpm去处理
    location ~ \.php$ {
    	  include       fastcgi_params; #引入fastcgi的配置文件
    	  fastcgi_pass   127.0.0.1:9000; #设置php fastcgi进程监听的IP地址和端口
    	  fastcgi_index  index.php; #设置首页文件
    	  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; #设置脚本文件请求的路径
    }
}

Общий смысл приведенной выше конфигурации сервера таков: каждый раз, когда nginx прослушивает запрос URL-адреса на порту 80, он будет выполнять сопоставление местоположения с URL-адресом. Если он соответствует правилу /, внутренний запрос будет перенаправлен, и будет инициирован внутренний запрос /index.php?$query_string, а соответствующее правило конфигурации местоположения отправит запрос рабочему процессу php-fpm, прослушивающему порт. 9000.

Суммировать

Ниже приводится простейший процесс запроса пользователя:

Пользователь получает доступ к доменному имени -> доменное имя выполняет разрешение DNS -> запросы к соответствующему IP-серверу и порту -> nginx прослушивает запрос соответствующего порта -> nginx соответствует расположению URL-адреса -> выполняет правила под соответствующее местоположение -> nginx перенаправляет запрос в php -> рабочий процесс php-fpm прослушивает запрос nginx -> рабочий процесс выполняет запрос -> рабочий процесс возвращает результат выполнения в nginx -> nginx возвращает результат пользователю