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;
}