一、什么是
FastCGI
FastCGI
是一个可伸缩地、高速地在
HTTP server
和动态脚本语言间通信的接口。多数流行的
HTTP server
都支持
FastCGI
,包括
Apache
、
Nginx
和
lighttpd
等,同时,
FastCGI
也被许多脚本语言所支持,其中就有
PHP
。
FastCGI
是从
CGI
发展改进而来的。传统
CGI
接口方式的主要缺点是性能很差,因为每次
HTTP
服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给
HTTP
服务器。这在处理高并发访问时,几乎是不可用的。另外传统的
CGI
接口方式安全性也很差,现在已经很少被使用了。
FastCGI
接口方式采用
C/S
结构,可以将
HTTP
服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当
HTTP
服务器每次遇到动态程序时,可以将其直接交付给
FastCGI
进程来执行,然后将得到的结果返回给浏览器。这种方式可以让
HTTP
服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
二、
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
的整个运作过程。
三、 spawn-fcgi 与 PHP-FPM
前面介绍过,
FastCGI
接口方式在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是
FastCGI
进程管理器,或者称之为
FastCGI
引擎,
spawn-fcgi
与
PHP-FPM
就是支持
PHP
的两个
FastCGI
进程管理器。
下面简单介绍
spawn-fcgi
与
PHP-FPM
的异同。
spawn-fcgi
是
HTTP
服务器
lighttpd
的一部分,目前已经独立成为一个项目,一般与
lighttpd
配合使用来支持
PHP
,但是
ligttpd
的
spwan-fcgi
在高并发访问的时候,会出现内存泄漏甚至自动重启
FastCGI
的问题。
Nginx
是个轻量级的
HTTP server
,必须借助第三方的
FastCGI
处理器才可以对
PHP
进行解析,因此
Nginx+spawn-fcgi
的组合也可以实现对
PHP
的解析,这里不过多讲述。
PHP-FPM
也是一个第三方的
FastCGI
进程管理器,它是作为
PHP
的一个补丁来开发的,在安装的时候也需要和
PHP
源码一起编译,也就是说
PHP-FPM
被编译到
PHP
内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比
spawn-fcgi
引擎好很多,因此,推荐
Nginx+PHP/PHP-FPM
这个组合对
PHP
进行解析。
FastCGI 的主要优点是把动态语言和 HTTP Server 分离开来,所以 Nginx 与 PHP/PHP-FPM 经常被部署在不同的服务器上,以分担前端 Nginx 服务器的压力,使 Nginx 专一处理静态请求和转发动态请求,而 PHP/PHP-FPM 服务器专一解析 PHP 动态请求。
四、 PHP 与 PHP-FPM 的安装及优化
1.
下载安装包
从
www.php.net
官方网站下载
PHP
源码包,这里下载的是稳定版
php-5.2.13.tar.gz
。
从
http://php-fpm.org/downloads/
下载对应的
PHP-FPM
源码包,这里下载的是
php-5.2.13-fpm-0.5.13.diff.gz
。
需要注意,在下载软件包版本时,尽量使
PHP
和
PHP-FPM
版本一致,如果版本之间相差太大,可以会出现兼容问题。
2.
配置安装环境
安装
PHP
需要下面软件包的支持,如果没有安装,请自行安装。
1. 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 过程中,根据错误提示信息,安装对应的软件库。
3.
开始编译安装
PHP
和
PHP-FPM
编译安装
PHP
和
PHP-FPM
很简单,下面是安装过程:
1. [root@localhost local]#tar zxvf php-5.2.13.tar.gz
2. [root@localhost local]#gzip -cd php-5.2.13-fpm-0.5.13.diff.gz | patch -d php-5.2.13 -p1
3. [root@localhost local]#cd php-5.2.13
4. [root@localhost php-5.2.13]#./configure --prefix=/usr/local/php --enable-fastcgi --enable-fpm
5. [root@localhost php-5.2.13]#make
6. [root@localhost php-5.2.13]#make install
7. [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
功能没有加入更多的编译选项。
4.
配置与优化
PHP-FPM
PHP
的全局配置文件是
php.ini
,在上面的步骤中,已经将此文件复制到了
/usr/local/php/lib/php.ini
下。可以根据每个应用需求的不同,对
php.ini
进行相应的配置。
下面重点介绍
PHP-FPM
引擎的配置文件。
根据上面指定的安装路径,
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>
5.
管理
FastCGI
进程
在配置完
php-fpm
后,就可以启动
FastCGI
进程了。启动
fastcgi
进程有两种方式:
1. /usr/local/php/bin/php-cgi --fpm
2. 或者
3. /usr/local/php/sbin/php-fpm start
建议采用第二种方式启动
FastCGI
进程。
/usr/local/php/sbin/php-fpm
还有其他参数,具体为
start|stop|quit|restart|reload|logrotate
。
每个启动参数的含义如下:
1. q start,启动 PHP的 FastCGI进程。
2. q stop,强制终止PHP的FastCGI进程。
3. q quit,平滑终止 PHP的 FastCGI进程。
4. q restart, 重启PHP的FastCGI进程。
5. q reload, 重新加载 PHP的 php.ini。
6. q logrotate, 重新启用log文件。
reload 是个很重要的参数,它可以在 PHP 的 FastCGI 进程不中断的情况下重新加载改动过的 php.ini ,因此通过 php-fpm 可以平滑变更 FastCGI 模式下的 PHP 设置。
在
FastCGI
进程启动后,其监听的
IP
地址和端口也随即启动,可以通过
ps
和
netstat
查看相关信息。
1. [root@localhost php]# netstat -antl|grep 9000
2. tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
3. [root@localhost php]# ps -ef|grep php-cgi
4. 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
5. 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
6. 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
7. 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
8. 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
9. 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
10. root 3583 3524 0 17:09 pts/1 00:00:00 grep php-cgi
五、配置
Nginx
来支持
PHP
Nginx
的安装特别简单,前面已经对此进行了详细介绍,这里不再进行讲述。下面重点介绍
Nginx
如何通过
php-fpm
的
FastCGI
进程对
PHP
进行解析处理。
由于N
ginx
本身不会对
PHP
进行解析,因此要实现
Nginx
对
PHP
的支持,其实是将对
PHP
页面的请求交给
fastCGI
进程监听的
IP
地址及端口。如果把
php-fpm
当做动态应用服务器,那么
Nginx
其实就是一个反向代理服务器。
Nginx
通过反向代理功能实现对
PHP
的解析,这就是
Nginx
实现
PHP
动态解析的原理。
这里假定
Nginx
的安装目录为
/usr/local
,则
Nginx
配置文件的路径为
/usr/local/nginx/conf/nginx.conf
。下面是在
Nginx
下支持
PHP
解析的一个虚拟主机配置实例。
1. server {
2. include port.conf;
3. server_name www.ixdba.net ixdba.net;
4.
5. location / {
6. index index.html index.php;
7. root /web/www/www.ixdba.net;
8. }
9.
10. location ~ \.php$ {
11. root html;
12. fastcgi_pass 127.0.0.1:9000;
13. fastcgi_index index.php;
14. fastcgi_param SCRIPT_FILENAME html$fastcgi_script_name;
15. include fastcgi_params;
16. }
17. }
18.
通过
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
已经配置完成。
六、测试
Nginx
对
PHP
的解析功能
这里在
/usr/local/nginx/html
目录下创建一个
phpinfo.php
文件,内容如下:
<?php phpinfo(); ?>
然后通过浏览器访问
http://www.ixdba.net/index.html
,默认会在浏览器显示
“Welcome to Nginx!”
表示
Nginx
正常运行。
接着在浏览器中访问
http://www.ixdba.net/phpinfo.php
,如果
PHP
能够正常解析,会出现
PHP
安装配置以及功能列表统计信息。
七、实例讲解
Nginx
中
FastCGI
参数的优化
在配置完成
Nginx+FastCGI
之后,为了保证
Nginx
下
PHP
环境的高速稳定运行,需要添加一些
FastCGI
优化指令。下面给出一个优化实例,将下面代码添加到
Nginx
主配置文件中的
HTTP
层级。
1. fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels = 1 :2 keys_zone = TEST :10m inactive = 5m ;
2. fastcgi_connect_timeout 300;
3. fastcgi_send_timeout 300;
4. fastcgi_read_timeout 300;
5. fastcgi_buffer_size 64k;
6. fastcgi_buffers 4 64k;
7. fastcgi_busy_buffers_size 128k;
8. fastcgi_temp_file_write_size 128k;
9. fastcgi_cache TEST;
10. fastcgi_cache_valid 200 302 1h;
11. fastcgi_cache_valid 301 1d;
12. 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
分钟。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69992957/viewspace-2755235/ ,如需转载,请注明出处,否则将追究法律责任。