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

Nginx与Apache解析php文件的区别

159次阅读
没有评论

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

一、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 服务。

CentOS 7.2 下编译安装 PHP7.0.10+MySQL5.7.14+Nginx1.10.1  http://www.linuxidc.com/Linux/2016-09/134804.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 的 500,502,504 错误解决方法 http://www.linuxidc.com/Linux/2015-03/115507.htm

CentOS 7 编译安装 Nginx1.10.2 脚本启动失败解决思路 http://www.linuxidc.com/Linux/2017-01/139794.htm

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

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-02/140100.htm

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