Nginx与Apache解析php文件的区别

Posted by

一、Apache是如何解析php文件的

我们常说的lamp架构是linux、apache、mysql、php,我们知道任何架构或者网站离不开数据库的支持,那么php和apache又是如何协同工作的呢?

php是apache的一个外挂程序,必须依靠web服务器才可以运行。当客户端浏览器触发事件—>php程序提交到apache服务器—->apache服务器根据php程序的特点判断是php程序,并从内存或者硬盘中提取访问所需要的应用程序,将其提交给php引擎程序—>php引擎程序解析并读取数据库生成相应的页面—>php引擎将html页面返回给web服务器,web服务器再将页面返回给客户端。

大致上这就是apache和php交互工作的过程。apache单独不能处理php代码,php(php 应用程序服务器)不能单独存在的,需要以apache为依托。也可以说php是apache功能模块的一种扩展,php作为apache的外挂,用于解 析php代码。经过解析的动态网页此时就不存在<?php ?>了。当apache服务启动的同时也启动了php。也就是说php必须和apache安装在同一台服务器上,不可以分割。需要注意的是,mysql与apache无关,只是在响应php代码中的sql操作的时候才被访问。不需要与apache安装在同一台服务器上,可以单独存在,只需php远程连接即可。

php作为一个动态的、共享的模块被apache调用,在启动apache时,自动加载。

二、nginx是如何解析php文件的呢?

要想搞清楚nginx是如何与php协同工作的,先来了解一下cgi和fastcgi两个协议。CGI:common gateway interface,是web server与后台编程语言交互的一种协议。有了这个协议,开发者可以使用任何语言处理 Web Server 发来的请求,动态的生成内容。但 CGI 有一个致命的缺点,那就是每处理一个请求都需要 fork 一个全新的进程,随着 Web 的兴起,高并发越来越成为常态,这样低效的方式明显不能满足需求。就这样,FastCGI 诞生了,CGI 很快就退出了历史的舞台。FastCGI,顾名思义为更快的 CGI,它允许在一个进程内处理多个请求,而不是一个请求处理完毕就直接结束进程,性能上有了很大的提高。

PHP-CGI是PHP自带的FASTCGI管理器,但有很多的缺点。FPM同样也是fastcgi的实现,相比php-cgi有很多的优点。到了PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,只需要在./configure时,加上–enable-fpm。

FPM 是一个 PHP 进程管理器,包含 master 进程和 worker 进程两种进程:master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个 (具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

从 FPM 接收到请求,到处理完毕,其具体的流程如下:

1.FPM 的 master 进程接收到请求

2.master 进程根据配置指派特定的 worker 进程进行请求处理,如果没有可用进程,返回错误,这也是我们配合 Nginx 遇到502错误比较多的原因。

3.worker 进程处理请求,如果超时,返回504错误

4.请求处理结束,返回结果

FPM 从接收到处理请求的流程就是这样了,那么Nginx 又是如何发送请求给fpm 的呢?这就需要Nginx 层面来说明了。

我们知道,Nginx 不仅仅是一个Web 服务器,也是一个功能强大的Proxy 服务器,除了进行http 请求的代理,也可以进行许多其他协议请求的代理,包括本文与fpm 相关的fastcgi 协议。为了能使Nginx 理解fastcgi 协议,Nginx 提供了fastcgi 模块来将http 请求映射为对应的 fastcgi 请求。

Nginx 的fastcgi 模块提供了fastcgi_param 指令来主要处理这些映射关系,除此之外,非常重要的就是 fastcgi_pass 指令了,这个指令用于指定 fpm 进程监听的地址,Nginx 会把所有的 php 请求翻译成 fastcgi 请求之后再发送到这个地址。

location ~ \.php$ {

include fastcgi_params;

fastcgi_pass unix:/tmp/www.sock;

#fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;

}

在这个配置文件中,/tmp/www.sock  是php-fpm监听的socket文件,nginx通过location将所有的php文件,即http请求都交给fpm处理,实现了nginx和php的协同工作。

换言之,nginx就是作了fastcgi的一个代理,用fastcgi的方式结合使用了php。所以,需要开启php-fpm服务。

本文参考:
https://www.linuxidc.com/Linux/2017-02/140100.htm