编译PHP并与Ngnix整合

nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。

nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx

一、首先我们先初步认识下FastCGI和Ngnix+FastCGI的运行原理

    1、apache+PHP和ngnix+php的区别

      apache一般是把php当做自己的一个模块来启动;而ngnix则是把http请求变量转发给php进程,即php独立进程,与ngnix通信,这种方式叫做FastCGI运行方式。

      所以,apache所编译的php不能用于ngnix。

    先看一个简单的图:

  

  以下这段我认为是在网络上找到的最通俗易懂的解释,我将它复制进来方便大家理解:

  1、什么是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服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

  2、Nginx+FastCGI运行原理 

    Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。

    wrapper: 为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后Fork(派生)出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据(html页面或者图片)发送给客户端。这就是Nginx+FastCGI的整个运作过程,

    

  所以,我们首先需要一个wrapper,这个wrapper需要完成的工作:

  1. 通过调用fastcgi(库)的函数通过socket和ningx通信(读写socket是fastcgi内部实现的功能,对wrapper是非透明的)
  2. 调度thread,进行fork和kill
  3. 和application(php)进行通信

二、编译PHP

  首先我们先认识一个概念:php-fpm

    (1)PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到

     (2)PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用

     (3)新版的PHP已经集成了php-fpm,在./configure的时候带 –enable-fpm参数即可开启PHP-FPM

  接下来我们开始安装编译PHP

  1、编译前我们需要先安装一些php需要用到的库(我用的是centos版本的linux系统)

    yum -y install gcc automake autoconf libtool make

    yum -y install gcc gcc-c++ glibc

    yum -y install libmcrypt-devel mhash-devel libxslt-devel \

    libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel \

    zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel \

    ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \

    krb5 krb5-devel libidn libidn-devel openssl openssl-devel

  2、获取php源码包

    wget http://cn2.php.net/distributions/php-5.4.7.tar.gz

   3、解压并进入php目录

    tar zvxf php-5.4.7.tar.gz

    cd php-5.4.7

    

   4、编译并安装

    ./configure --prefix=/usr/local/fastphp --enable-fpm --with-mcrypt \

    --enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath \

    --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets \

    --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex \

    --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli \

    --with-gd --with-jpeg-dir

  

    make all install

  5、将php-fpm复制一份  

  6、将php配置文件复制一份  

  7、修改nginx配置文件以支持php-fpm    首先打开ngnix配置文件      vim /usr/local/ngnix/conf/ngnix.conf    在server段里加入以下代码        保存

  8、启动php-fpm和ngnix    /usr/local/ngnix    /usr/local/ngnix/sbin/php-fpm

  9、在根目录下创建测试文件test.php做个简单的测试    

  10、测试成功    

php-fpm的关闭和重启需要使用信号控制,其实就跟ngnix的关闭重启一样  php-fpm 关闭:kill -INT `cat /usr/local/fastphp/var/run/php-fpm.pid`  php-fpm 重启:kill -USR2 `cat /usr/local/fastphp/var/run/php-fpm.pid`  查看php-fpm进程数:ps aux | grep -c php-fpm

Ngnix的安装请查看我的另一篇博文  http://www.cnblogs.com/it-cen/p/4310050.html  

  如果您觉得您能在此博文学到了新知识,请为我顶一个,如文章中有解释错的地方,欢迎指出。

  互相学习,共同进步!

   
时间: 2024-10-10 04:43:51

编译PHP并与Ngnix整合的相关文章

编译安装LAMP,xcache测试

LAMP组合的编译安装:    httpd+php整合时有两种方式:        1.modules: 把php编译成httpd的DSO对象:            prefork: libphp5            event, worker: libphp5-zts            --enable-maintainer-zts        2.fpm(fastcgi):php作为独立的服务httpd对fastcgi协议的支持:    httpd-2.2: 需要额外安装fcgi

LNMP的编译安装与xcache、memcached的安装配置——1

大纲: 一.前言 二.系统环境与软件版本 三.编译环境的准备 四.编译安装nginx及其配置 五.编译安装.配置mysql 六.编译安装PHP 七.整合nginx与PHP 八.安装配置PHP加速器xcache 九.安装配置memcached 十.安装memcached的PHP扩展 一.前言 由于公司的服务器采用的是LNMP的架构,平时接触相对较多,今天会系统的把LNMP的安装配置过程写成博文,有关nginx的其他高级功能的配置,mysql的相关知识,会在后面的时间里陆续写成博客. 二.系统环境与

静态编译和动态编译的区别【转】

本文转载自:https://segmentfault.com/a/1190000000580216 静态函数库一般扩展名为(.a),这类的函数库通常扩展名为libxxx.a .这类函数库在编译的时候会直接整合到程序中,所以利用静态函数库编译成的文件会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,而不再需要向外部要求读取函数哭的内容:但是从升级难易度来看明显没有优势,如果函数库更新,需要重新编译. 动态函数库动态函数库的扩展名一般为(.so),这类函数库通常名为libxxx.s

cocos2d-x 3.1 编译脚本android-build.py

写在前面: 前段时间下载了cocos2d-x 3.1,按照官网的教程,配置环境,编译打包,走了一遍,感觉不错,顺便发现其中用了很多python的脚本文件,比如今天要说的android-build.py.这个文件把编译,打包的功能全部整合到了一起.也就是传说中的一键打包.正好最近在看python,就顺手拿这个脚本学习一下. 小贴士: 在正式看这个脚本文件前,推荐先到cocos2d-x的官网按教程,配置环境,编译,打包,走一遍,先有个大概的了解.教程地址.http://www.cocos2d-x.o

读书笔记--C陷阱与缺陷(四)

第四章 1. 连接器 C语言的一个重要思想就是分别编译:若干个源程序可在不同的时候单独进行编译,恰当的时候整合到一起. 连接器一般与C编译器分离,其输入是一组目标模块(编译后的模块)和库文件,输出是一个载入模块(执行文件). 2. 命名冲突与static修饰符 static修饰符可有效减少命名冲突! 如: static int a; 与 int a; 声明含义相同,但是前者限制a的作用域在一个源文件(.c)内,其他源文件是不可见的.但后者都是可见的会产生命名冲突. 如果若干个函数需要共享一组外部

Linux - 动态(Dynamic)与静态(Static)函数库

首先我们要知道的是,函式库的类型有哪些?依据函式库被使用的类型而分为两大类,分别是静态 (Static) 与动态 (Dynamic) 函式库两类. 静态函式库的特色: 扩展名:(扩展名为 .a) 这类的函式库通常扩展名为 libxxx.a 的类型: 编译行为: 这类函式库在编译的时候会直接整合到运行程序当中,所以利用静态函式库编译成的文件会比较大一些喔: 独立运行的状态: 这类函式库最大的优点,就是编译成功的可运行档可以独立运行,而不需要再向外部要求读取函式库的内容 (请参照动态函式库的说明).

sbt介绍与构建Scala项目

一.sbt简介 sbt是类似ANT.MAVEN的构建工具,全称为Simple build tool,是Scala事实上的标准构建工具. 主要特性: 原生支持编译Scala代码和与诸多Scala测试框架进行交互: 使用Scala编写的DSL(领域特定语言)构建描述 使用Ivy作为库管理工具 持续编译.测试和部署 整合scala解释器快速迭代和调试 支持Java与Scala混合的项目 二.sbt安装 在sbt官网下载,这里我是下载的sbt-0.13.11.zip,下载后加压到自己定义的文件夹,然后将

STM32,你了解多少?(转载)

STM32的核心Cortex-M3处理器是一个标准化的微控制器结构,希望思考一下,何为标准化?简 言之,Cortex-M3处理器拥有32位CPU,并行总线结构,嵌套中断向量控制单元,调试系统以及标准的 存储映射. 嵌套中断向量控制器(Nested Vector Interrupt Controller,简称NVIC)是Cortex-M3处理器中一个 比较关键的组件,它为基于Cortex-M3的微控制器提供了标准的中断架构和优秀的中断响应能力,为 超过240个中断源提供专门的中断入口,而且可以赋予

linux基础学习7

Linux 的开机流程分析 1. 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置: 2. 读取并执行第一个开机装置内 MBR 的 boot Loader (亦即是 grub, spfdisk 等程序): 3. 依据 boot loader 的设定加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序: 4. 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 信息: 5. init 执行 /etc/rc.d/