设为首页 收藏本站
查看: 825|回复: 0

[经验分享] 编译PHP并与Ngnix整合

[复制链接]

尚未签到

发表于 2015-8-24 09:01:32 | 显示全部楼层 |阅读模式
  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。
      先看一个简单的图:
     DSC0000.png
    以下这段我认为是在网络上找到的最通俗易懂的解释,我将它复制进来方便大家理解:
    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的整个运作过程,
       DSC0001.jpg
    所以,我们首先需要一个wrapper,这个wrapper需要完成的工作:


  • 通过调用fastcgi(库)的函数通过socket和ningx通信(读写socket是fastcgi内部实现的功能,对wrapper是非透明的)
  • 调度thread,进行fork和kill
  • 和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
       DSC0002.png
  
  
     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复制一份
   DSC0003.png
  6、将php配置文件复制一份
   DSC0004.png
  7、修改nginx配置文件以支持php-fpm
    首先打开ngnix配置文件
      vim /usr/local/ngnix/conf/ngnix.conf
    在server段里加入以下代码
     DSC0005.png
    保存
  8、启动php-fpm和ngnix
    /usr/local/ngnix
    /usr/local/ngnix/sbin/php-fpm
  9、在根目录下创建测试文件test.php做个简单的测试
     DSC0006.png
  10、测试成功
     DSC0007.png

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.iyunv.com/it-cen/p/4310050.html
  


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

  互相学习,共同进步!


   

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103243-1-1.html 上篇帖子: php生成excel 下篇帖子: zend源代码分析Application.php
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表