nginx本身不支持對外部程序的直接調用或者解析,所有的外部程序包括php必須通過FastCGI接口來調用(FastCGI接口在Linux下是socket)
為了調用CGI程序,還需要FastCGI的wrapper,當nginx將cgi請求發送給這個socket的時候,通過fastcgi接口,wrapper接收到請求,然后派生出一個線程,這個線程調用外部程序處理並返回數據;
接着,wrapper再將返回的數據通過fastcgi接口,socket傳遞給nginx;
最后,nginx將返回的數據發送給客戶端
一、Nginx解析PHP
PHP-FRM是管理FastCGI的一個管理器
1.php-frm自身初始化,啟動進程php-frm,監聽9000端口;FastCGI子進程等待來自web服務器的連接
2.當客戶端request到達nginx時,nginx通過location指令,將所有以.php結尾的文件都交給127.0.0.1:9000(本地php解析服務器)進行處理
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; #表示nginx通過fastcgi_pass將用戶請求的資源發給9000端口進行解析
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; #腳本文件請求的路徑
include fastcgi.conf; #表示nginx會調用fastcgi.conf這個配置文件
}
3.nginx將請求fastcgi客戶端,通過fastcgi_pass將用戶的請求發送給php-fpm
4.wrapper收到php-fpm的請求后,會生成一個新的線程調用php動態程序解析服務器(如果請求是mysql數據的讀取,將會觸發讀庫操作,如果是圖片、文件等,將會觸發查詢后端存儲服務器)
5.php將查詢到的結果通過fastcgi返回給nginx
6.nginx將數據返回給用戶
二、如何配置nginx支持php
1.在編譯安裝時添加--enable-fpm 參數即可開啟php-fpm
./configure --prefix=/usr/local/php/ …… --enable-fpm
2.生成php-fpm的配置文件,並修改參數
#cd /usr/local/php/etc/
cp -a php-fpm.conf.default php-fpm.conf
#vim php-fpm.conf
pid = run/php-fpm.pid
#取消注釋
user = nginx
group = nginx
pm.start_servers = 2
#啟動時開啟的進程數(默認值)
pm.min_spare_servers = 1
#最少空閑進程數(默認值)
pm.max_spare_servers = 3
#最多空閑進程數(默認值)
2.修改nginx的配置文件,使其識別.php后綴的
#vim /usr/local/nginx/conf/nginx.conf
#取消以下幾行的注釋,並修改include選項的后綴位fastcgi.conf
#65行-71行
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}