web服务器运行原理

web服务器运行原理

LNMP

L指linux系统平台
N是nginx指网站的前端程序,发布静态页面和调用外部程序解析动态页面,Nginx直接处理静态请求,动态请求会转发给php-fpm
M是mysql指网站的后台数据库
P是PHP指网页编程语言,是作为一个独立服务存在的,这个服务叫做php-fpm

web服务器运行原理_第1张图片

运行原理

  1. 域名通过DNS服务器进行解析成ip
  2. 浏览器发送http请求,通过IP找到对应IP的服务器
  3. 服务器(Nginx)响应并处理web请求,如果访问静态资源,nginx直接返回,如果请求动态资源
  4. nginx 加载PHP-FPM,FastCGI进程管理器(php-fpm)自身初始化,启动多个CGI解释器php-cgi进程 调用PHP解析器php-cgi解析脚本信息。(之后,php-fpm自己搞定)
  5. PHP解析器进程可以启动多个,进行并发执行。
  6. 将解析后的脚本返回到PHP-FPM,PHP-FPM再通过fastcgi的形式将脚本信息转送给Nginx
  7. 服务器再通过Http response的形式转送给浏览器
  8. 浏览器再进行解析与渲染然后进行呈现。
    注意:php-fpm 是管理php-cgi 的,是针对php54之前的,之后php-fpm即是解释器,又是管理器

FastCGI(是一个协议)

FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同时FastCGI也被许多脚本语言支持,其中就有PHP。FastCGI是从CGI发展改进而来的。

FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。

这种方式的优点:可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

CGI 程序和FastCGI程序,是指实现这两个协议的程序,可以是任何语言实现这个协议的。(PHP-CGI 和PHP-FPM就是实现FastCGI的程序)

每次请求,都会解析php.ini,初始化执行环境,所以处理每个时间的时间会比较长。这明显不合理嘛!那么fastcgi是用来启动一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。

什么是PHP-FPM

PHP-FPM是管理FastCGI的一个管理器,它作为PHP的插件存在,在安装PHP要想使用PHP-FPM时在老php的老版本(php5.3.3之前)就需要把PHP-FPM以补丁的形式安装到PHP中,而且PHP要与PHP-FPM版本一致,这是必须的)

PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。

PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,被PHP官方收录了。

PHP的解释器是php-cgi。php-cgi只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理,那么php-fpm就是管理进程的

Nginx如何调用php

FastCGI进程管理器php-fpm自身初始化,启动主进程php-cgi master和启动start_servers个CGI 子进程。主进程主要是管理fastcgi子进程,监听9000端口。fastcgi子进程等待来自Web Server的连接。

当客户端请求到达Web Server Nginx时,Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,即Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理。

FastCGI进程管理器PHP-FPM,选择并连接到一个子进程CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程。

FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。

FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。

简单来说,当需要处理php请求时,nginx的worker进程会将请求移交给php-fpm的worker进程进行处理,其实严格得讲是nginx间接调用php。

参考连接:

  • FastCgi与PHP-fpm之间是个什么样的关系:https://segmentfault.com/q/1010000000256516

  • http://www.cleey.com/blog/single/id/848.html

  • http://m.blog.csdn.net/article/details?id=8740914

  • fastcgi php-cgi与php-fpm区别和之间的关系:https://www.cnblogs.com/itxiongwei/p/9072075.html

你可能感兴趣的:(nginx,服务器)