阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

编译PHP并与Nginx整合

139次阅读
没有评论

共计 3802 个字符,预计需要花费 10 分钟才能阅读完成。

 

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

编译 PHP 并与 Nginx 整合

 

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 复制一份

编译 PHP 并与 Nginx 整合

 

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

编译 PHP 并与 Nginx 整合

 

7、修改 nginx 配置文件以支持 php-fpm

 

首先打开 ngnix 配置文件

 

vim /usr/local/ngnix/conf/ngnix.conf

 

在 server 段里加入以下代码

编译 PHP 并与 Nginx 整合

 

保存

 

8、启动 php-fpm 和 ngnix

 

/usr/local/ngnix

 

/usr/local/ngnix/sbin/php-fpm

 

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

 

10、测试成功

编译 PHP 并与 Nginx 整合

 

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.linuxidc.com/Linux/2015-03/114655.htm

————————————– 分割线 ————————————–

CentOS 6.2 实战部署 Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm

使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm

搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm

Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm

Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm

Nginx 的详细介绍 :请点这里
Nginx 的下载地址 :请点这里

 

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计3802字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中