FastCGI运行原理及php-fpm参数配置
1、什么是CGI
CGI全称是“公共网关接口”(Common Gateway Interface),http服务器与你的或其他机器上的程序进行“交谈”的一种工具,CGI程序须运行在网络服务器上。
传统CGI接口方式的主要缺点是性能很差,因为每次http服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给http服务器,这在处理高并发访问时,几乎是不可用的,因此就诞生了FastCGI。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。
2、什么是FastCGI
FastCGI是一个可伸缩地、高速地在http server和动态脚本语言间通信的接口(FastCGI接口在Linux下是socket,这个socket可以是文件socket,也可以是ip socket),主要优点是把动态语言和HTTP Server分离开来。多数流行的HTTP server都支持FastCGI包括Nginx和Lighttpd等,同时FastCGI也被许多脚本语言所支持,其中就有PHP。FastCGI接口方式采用C/S结构,可以将http服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当http服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让http服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
3、Nginx下FastCGI运行原理
Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是IP socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另外一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据,接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx,最后Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。
4、优化php-fpm进程管理配置参数。
php-fpm的编译参数:
php5.3及以上版本编译参数为”--enable-fpm”
php5.2及以下版本编译参数为”--enable-fastcgi --enable-fpm --enable-force-cgi”
#php-fpm.conf配置文件参数优化选项。
pm.max_children = 1024 #子进程最大数
pm.start_servers = 16 #启动时的进程数
#保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.min_spare_servers = 5
#保证空闲进程数最大值,如果空闲进程大于此值,则进行清理
pm.max_spare_servers = 20
#进程的超时时间
pm.process_idle_timeout = 15s
#设置每个子进程处理的最大请求数
pm.max_requests = 1000
#设置文件打开描述符的rlimit限制
rlimit_files = 1024
#当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 '0' 表示 'Off'
request_slowlog_timeout = 10s
#慢请求的记录日志,配合request_slowlog_timeout使用
slowlog = log/$pool.log.slow