Nginx、Apache解析php文件的区别

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

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


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


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

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

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

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

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 代码真正执行的地方。
apache


从 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处理,实现了nginxphp的协同工做。

换言之,nginx就是做了fastcgi的一个代理,用fastcgi的方式结合使用了php。因此,须要开启php-fpm服务。

相关文章
相关标签/搜索