1、什么是 FastCGI php
FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通讯的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。图1 Nginx+FastCGI运行原理 html
前面介绍过,FastCGI接口方式在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是FastCGI进程管理器,或者称之为FastCGI引擎, spawn-fcgi与PHP-FPM就是支持PHP的两个FastCGI进程管理器。
下面简单介绍spawn-fcgi与PHP-FPM的异同。 前端
spawn-fcgi是HTTP服务器lighttpd的一部分,目前已经独立成为一个项目,通常与lighttpd配合使用来支持PHP,可是ligttpd的spwan-fcgi在高并发访问的时候,会出现内存泄漏甚至自动重启FastCGI的问题。 nginx
Nginx是个轻量级的HTTP server,必须借助第三方的FastCGI处理器才能够对PHP进行解析,所以Nginx+spawn-fcgi的组合也能够实现对PHP的解析,这里不过多讲述。 c++
PHP-FPM也是一个第三方的FastCGI进程管理器,它是做为PHP的一个补丁来开发的,在安装的时候也须要和PHP源码一块儿编译,也就是说PHP-FPM被编译到PHP内核中,所以在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好不少,所以,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 web
FastCGI 的主要优势是把动态语言和HTTP Server分离开来,因此Nginx与PHP/PHP-FPM常常被部署在不一样的服务器上,以分担前端Nginx服务器的压力,使Nginx专注处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专注解析PHP动态请求。 后端
gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel
因为各个Linux系统版本的不肯定性,读者也能够在安装PHP过程当中,根据错误提示信息,安装对应的软件库。 浏览器
[root@localhost local]#tar zxvf php-5.2.13.tar.gz [root@localhost local]#gzip -cd php-5.2.13-fpm-0.5.13.diff.gz | patch -d php-5.2.13 -p1 [root@localhost local]#cd php-5.2.13 [root@localhost php-5.2.13]#./configure --prefix=/usr/local/php --enable-fastcgi --enable-fpm [root@localhost php-5.2.13]#make [root@localhost php-5.2.13]#make install [root@localhost php-5.2.13]cp php.ini-dist /usr/local/php/lib/php.ini
其中,第二步将PHP-FPM做为补丁加入PHP源码中。
在“./configure”编译选项中,指定将PHP安装到/usr/local下,“--enable-fastcgi”是启用对PHP的FastCGI支持,“--enable-fpm”是激活对FastCGI模式的fpm支持。
在编译PHP时能够加入不少编译选项,可是这里为了介绍PHP的FastCGI功能没有加入更多的编译选项。 缓存
根据上面指定的安装路径,PHP-FPM的默认配置文件为/usr/local/php/etc/php-fpm.conf。
php-fpm.conf是一个XML格式的纯文本文件,其内容很容易看明白。这里重点介绍几个重要的配置标签:
安全
标签listen_address是配置fastcgi进程监听的IP地址以及端口,默认是127.0.0.1:9000。
<value name="listen_address">127.0.0.1:9000</value>
标签display_errors用来设置是否显示PHP错误信息,默认是0,不显示错误信息,设置为1能够显示PHP错误信息。
<value name="display_errors">0</value>
标签user和group用于设置运行FastCGI进程的用户和用户组。须要注意的是,这里指定的用户和用户组要和Nginx配置文件中指定的用户和用户组一致。
<value name="user">nobody</value>
<value name="group">nobody</value>
标签max_children用于设置FastCGI的进程数。根据官方建议,小于2GB内存的服务器,能够只开启64个进程,4GB以上内存的服务器能够开启200个进程。
<value name="max_children">5</value>
标签request_terminate_timeout用于设置FastCGI执行脚本的时间。默认是0s,也就是无限执行下去,能够根据状况对其进行修改。
<value name="request_terminate_timeout">0s</value>
标签rlimit_files用于设置PHP-FPM对打开文件描述符的限制,默认值为1024。这个标签的值必须和Linux内核打开文件数关联起来,例如要将此值设置为65535,就必须在Linux命令行执行'ulimit -HSn 65536'。
<value name="rlimit_files">1024</value>
标签max_requests指明了每一个children最多处理多少个请求后便会被关闭,默认的设置是500。
<value name="max_requests">500</value>
标签allowed_clients用于设置容许访问FastCGI进程解析器的IP地址。若是不在这里指定IP地址,Nginx转发过来的PHP解析请求将没法被接受。
<value name="allowed_clients">127.0.0.1</value>
/usr/local/php/bin/php-cgi --fpm 或者 /usr/local/php/sbin/php-fpm start
建议采用第二种方式启动FastCGI进程。
/usr/local/php/sbin/php-fpm还有其余参数,具体为start|stop|quit|restart|reload|logrotate。
每一个启动参数的含义以下:
start,启动PHP的FastCGI进程。 stop,强制终止PHP的FastCGI进程。 quit,平滑终止PHP的FastCGI进程。 restart, 重启PHP的FastCGI进程。 reload, 从新加载PHP的php.ini。 logrotate, 从新启用log文件。
reload是个很重要的参数,它能够在PHP的FastCGI进程不中断的状况下从新加载改动过的php.ini,所以经过php-fpm能够平滑变动FastCGI模式下的PHP设置。
在FastCGI进程启动后,其监听的IP地址和端口也随即启动,能够经过ps和netstat查看相关信息。
[root@localhost php]# netstat -antl|grep 9000 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN [root@localhost php]# ps -ef|grep php-cgi root 3567 1 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf nobody 3568 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf nobody 3569 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf nobody 3570 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf nobody 3571 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf nobody 3572 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf root 3583 3524 0 17:09 pts/1 00:00:00 grep php-cgi
server { include port.conf; server_name www.ixdba.net ixdba.net; location / { index index.html index.php; root /web/www/www.ixdba.net; } location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME html$fastcgi_script_name; include fastcgi_params; } }
经过location指令,将全部以php为后缀的文件都交给127.0.0.1:9000来处理,而这里的IP地址和端口就是FastCGI进程监听的IP地址和端口。
fastcgi_param指令指定放置PHP动态程序的主目录,也就是$fastcgi_script_name前面指定的路径,这里是/usr/local/nginx/html目录,建议将这个目录与Nginx虚拟主机指定的根目录保持一致,固然也能够不一致。
fastcgi_params文件是FastCGI进程的一个参数配置文件,在安装Nginx后,会默认生成一个这样的文件,这里经过include指令将FastCGI参数配置文件包含了进来。
接下来,启动nginx服务。
/usr/local/nginx/sbin/nginx
到此为止,Nginx+PHP已经配置完成。
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_cache TEST; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m;
下面是对上述代码的含义进行介绍。
第一行代码是为FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间。
fastcgi_connect_timeout指定链接到后端FastCGI的超时时间。
fastcgi_send_timeout指定向FastCGI传送请求的超时时间,这个值是已经完成两次握手后向FastCGI传送请求的超时时间。
fastcgi_read_timeout指定接收FastCGI应答的超时时间,这个值是已经完成两次握手后接收FastCGI应答的超时时间。
fastcgi_buffer_size用于指定读取FastCGI应答第一部分须要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),能够设置为fastcgi_buffers选项指定的缓冲区大小。
fastcgi_buffers指定本地须要用多少和多大的缓冲区来缓冲FastCGI的应答请求。若是一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;若是页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,可是这并非好方法,由于内存中的数据处理速度要快于硬盘。通常这个值应该为站点中PHP脚本所产生的页面大小的中间值,若是站点大部分脚本所产生的页面大小为256KB,那么能够把这个值设置为“16 16k”、“4 64k”等。
fastcgi_busy_buffers_size的默认值是fastcgi_buffers的两倍。
fastcgi_temp_file_write_size表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍。
fastcgi_cache表示开启FastCGI缓存并为其指定一个名称。开启缓存很是有用,能够有效下降CPU的负载,而且防止502错误的发生,可是开启缓存也会引发不少问题,要视具体状况而定。
fastcgi_cache_valid、fastcgi用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一个小时,将301应答缓存1天,其余应答均缓存1分钟。
nginx实践笔记