Nginx+FastCGI运行原理(一)

1 实战Nginx与PHP(FastCGI)的安装、配置与优化php

1.1 什么是 FastCGI前端

FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通讯的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同时,FastCGI也被许多脚本语言支持,其中就有PHP。c++

FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能不好,由于每次HTTP服务器遇到动态程序时都须要从新启动脚本解析器来执行解析,而后将结果返回给HTTP服务器。这在处理高并发访问时几乎是不可用的。另外传统的CGI接口方式安全性也不好,如今已经不多使用了。浏览器

FastCGI接口方式采用C/S结构,能够将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,能够将其直接交付给FastCGI进程来执行,而后将获得的结果返回给浏览器。这种方式可让HTTP服务器专注地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提升了整个应用系统的性能。安全

 

1.2 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的整个运做过程,如图1-3所示。并发

1.3 spawn-fcgi与PHP-FPMapp

前面介绍过,FastCGI接口方式在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是FastCGI进程管理器,或者称为FastCGI引擎。 spawn-fcgi与PHP-FPM就是支持PHP的两个FastCGI进程管理器。socket

下面简单介绍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内核中,所以在处理性能方面更加优秀。同时PHP-FPM在处理高并发方面也比spawn-fcgi引擎好不少,所以,推荐使用Nginx+PHP/PHP-FPM这个组合对PHP进行解析。

FastCGI 的主要优势是把动态语言和HTTP Server分离开来,因此Nginx与PHP/PHP-FPM常常被部署在不一样的服务器上,以分担前端Nginx服务器的压力,使Nginx专注处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专注解析PHP动态请求。

 

1.4 PHP与PHP-FPM的安装及优化(1)

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。

  1. <</SPAN>value name="listen_address">127.0.0.1:9000</</SPAN>value> 

 

标签display_errors用来设置是否显示PHP错误信息,默认是0,不显示错误信息,设置为1能够显示PHP错误信息。

  1. <</SPAN>value name="display_errors">0</</SPAN>value> 

 

标签user和group用于设置运行FastCGI进程的用户和用户组。须要注意的是,这里指定的用户和用户组要和Nginx配置文件中指定的用户和用户组一致。

  1. <</SPAN>value name="user">nobody</</SPAN>value> 
  2. <</SPAN>value name="group">nobody</</SPAN>value> 

 

标签max_children用于设置FastCGI的进程数。根据官方建议,小于2GB内存的服务器,能够只开启64个进程,4GB以上内存的服务器能够开启200个进程。

  1. <</SPAN>value name="max_children">5</</SPAN>value> 

 

标签request_terminate_timeout用于设置FastCGI执行脚本的时间。默认是0秒,也就是无限地执行下去,能够根据状况对其进行修改。

  1. <</SPAN>value name="request_terminate_timeout">0s</</SPAN>value> 
相关文章
相关标签/搜索