月下博客

使用nginx和php-fpm

一直使用Apache的httpd作为web服务器,对nginx知之甚少。由于nginx对并发的良好支持,越来越多的站点采用nginx+fast_cgi的方式来响应请求。目前本站点也完成了从Httpd到nginx的迁移。

一、请求流程

一次完整的浏览器页面显示过程包含三步:

  1. 客户端向服务器发出请求;
  2. 服务器接受请求,处理并将响应头信息和数据返回给客户端
  3. 客户端解析响应数据,将结果显示。

二、httpd工作方式

httpd是Apache基金会下的web服务器,具有跨平台和稳定等特点。目前httpd应该还是份额最大的web服务器,LAM是许多php站点的标配。在CentOS等发行版里,也默认安装了httpd。注意httpd(web服务器)只是Apache基金会下的一个子项目,不等同于Apache。由于说到web服务器指的就是Apache项目下的httpd,一般也用Apache来指代httpd。

httpd是基于模块化设计的web服务器,许多的功能可通过模块来实现,各模块在系统启动的时候按需载入。对于客户端的请求,如果是静态文件(html,图片,css等)在找到资源之后返回客户端。如果是php脚本文件,则通过读取配置决定解析方式。在大多数的配置中,php总是以模块的方式被httpd调用,得到解析的结果后返回给客户端。

对于每个php请求,以模块方式运行的httpd都会调用php解析一次脚本。当中涉及到php.ini文件的重复解析,进程的创建和销毁等,是比较耗系统资源的。另外httpd处理请求的方式是同步多线程阻塞式的,在高并发的情形下显得吃力。httpd对php模块糟糕的进程管理催生了php-fpm。

三、php-fpm

php-fpm是fastCGI的进程管理器。上文说到以模块方式运行的httpd会调用php来解析php文件,存在配置文件重复解析,不断创建和销毁进程的开销。为了提供站点的运行性能,可以将php文件的解析剥离出来独立成服务。在这种情况下httpd不再自己调用php脚本解析php文件,而是以cgi协议向fastcgi程序请求,最后将cgi运行的结果返回客户端。

php的fastcgi程序只能解析请求,不能进行进程管理。php-fpm是用来管理fastcgi进程的,现在已经被录入到php官方收录。php-fpm支持平滑的进程管理,对高并发的站点很有帮助。有了php-fpm之后,httpd通过cgi协议将请求转发给php-fpm处理,然后将结果返回前端。

四、nginx

相对于httpd,nginx出现的比较晚。由于对高并发抗压的支持的需求,nginx发展迅速,现在已经成为第二大web服务器。相对于httpd,nginx是基于事件的异步工作模式,具有轻量级,抗并发性高,配置简洁等优点。在静态处理上,相对于Httpd,nginx具有巨大的性能优势。

五、安装nginx和php-fpm

在CentOS上的官方仓库中,没有收录nginx。如果需要从仓库中安装,可以添加epel源:

wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
sudo rpm -ivh epel-release-6-8.noarch.rpm

或者使用nginx官方源:

echo '[nginx]
name=nginx repo 
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ 
gpgcheck=0 
enabled=1' >> /etc/yum.repos.d/nginx.repo

然后就可以使用yum安装nginx了:

yum install nginx

CentOS 6的软件仓库中已经有php-fpm,但是版本为5.3.3,如果已经满足要求了,可以直接使用yum安装:

yum install php-fpm

CentOS 6中可以从SCL中安装5.4.16版本的php-fpm,需要首先安装scl:

yum install centos-release-SCL

六、启动nginx和php-fpm

service nginx start
service php-fpm start
chkconfig nginx on
chkconfig php-fpm on

其中后两条命令为配置Nginx和php-fpm开机启动。配置好Nginx和fpm之后,站点就能正常运行了。