前言
一直使用Apache的httpd作为web服务器,对nginx知之甚少。由于nginx对并发的良好支持,越来越多的站点采用nginx+fast_cgi的方式来响应请求。目前本站点也完成了从Httpd到nginx的迁移。
一、请求流程
一次完整的浏览器页面显示过程包含三步:
- 客户端向服务器发出请求;
- 服务器接受请求,处理并将响应头信息和数据返回给客户端
- 客户端解析响应数据,将结果显示。
二、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之后,站点就能正常运行了。
必须 注册 为本站用户, 登录 后才可以发表评论!