十五大原理之一--Nginx FastCGI的运行原理

一、FastCGI

1.介绍

CGI全称通用网关接口 Commmon Gateway Interface

用于HTTP服务上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上。

传统CGI接口方式性能较差,由于每次HTTP服务器遇到动态程序需要重启解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发时,几乎是不可能的,因此诞生了FastCGI。另外传统的CGI接口方式安全性也很差

一个可伸缩地。高速地在HTTP服务器和动态脚本语言间通信的接口

接口在linux下是socket(这个socket可以是文件socket也可以是ip socket)

主要优点把动态语言和HTTP服务器分离开来。多数流行的HTTP服务器都支持FsatCGI包括Apache/Nginx/lighttpd等

支持语言比较流行的是PHP,接口方式采用C/S架构,可以将HTTP服务器和脚本解析器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。

当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

2. 配置文件注释

vim /application/nginx/conf/fastcgi.conf

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;#脚本文件请求的路径

fastcgi_param  QUERY_STRING       $query_string; #请求的参数;如?app=123

fastcgi_param  REQUEST_METHOD     $request_method; #请求的动作(GET,POST)

fastcgi_param  CONTENT_TYPE       $content_type; #请求头中的Content-Type字段

fastcgi_param  CONTENT_LENGTH     $content_length; #请求头中的Content-length字段。

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; #脚本名称

fastcgi_param  REQUEST_URI        $request_uri; #请求的地址不带参数

fastcgi_param  DOCUMENT_URI       $document_uri; #与$uri相同。

fastcgi_param  DOCUMENT_ROOT      $document_root; #网站的根目录。在server配置中root指令中指定的值

fastcgi_param  SERVER_PROTOCOL    $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;#cgi 版本

fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;#nginx 版本号,可修改、隐藏

fastcgi_param  REMOTE_ADDR        $remote_addr; #客户端IP

fastcgi_param  REMOTE_PORT        $remote_port; #客户端端口

fastcgi_param  SERVER_ADDR        $server_addr; #服务器IP地址

fastcgi_param  SERVER_PORT        $server_port; #服务器端口

fastcgi_param  SERVER_NAME        $server_name; #服务器名,域名在server配置中指定的server_name

#fastcgi_param  PATH_INFO           $path_info;#可自定义变量

# PHP only, required if PHP was builtwith --enable-force-cgi-redirect

#fastcgi_param  REDIRECT_STATUS    200;

在php可打印出上面的服务环境变量

如:echo$_SERVER[‘REMOTE_ADDR‘]

3.FastCGI的重要特点总结:

1)是HTTP服务器和动态脚本语言间通信的接口或者工具!

2)优点就是把动态语言解析和HTTP服务器分离了开来!

3)Nginx、Apache、lighttpd以及多数动态语言都支持FastCGI。

4)接口方式采用C/S结构,分为HTTP服务器(客户端)和动态语言解析服务器(服务端)

5)PHP动态语言服务端可以启动多个FastCGI的守护进程例如:php-fpm(fcgi process mangemnt))

6)http服务器通过例(Nginx fastgi_pass)FastCGI客户端和动态语言FastCGI服务端通信(例如:php-fpm)

二、Nginx FastCGI的运行原理

Nginx 不支持对外部动态程序的直接调用或者解析 ,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在linux下是socket,(这个socket可以是文件socket,也可以是IP  socket)。为了调用CGI程序,还需要wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,warpper接収到请求,然后派出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据,接着,wrapper再将返回的数据通过FastCGI接口,沿着固定socket传递给Nginx;最后,nginx将返回的数据发送给客户端,这就是Nginx+fastcgi的整个运行过程。

nginx fastcgi访问php

1、用户发送http请求报文给nginx服务器

2、nginx会根据文件url和后缀来判断请求

3、如果请求的是静态内容,nginx会将结果直接返回给用户

4、如果请求的是动态内容,nginx会将请求交给fastcgi客户端,通过fastcgi_pass将这个请求发送给php-fpm

5、php-fpm会将请求交给wrapper

6、wrapper收到请求会生成新的线程调用php动态程序解析服务器

7、如果用户请求的是博文、或者内容、PHP会请求MySQL查询结果

8、如果用户请求的是图片、附件、PHP会请求nfs存储查询结果

9、php会将查询到的结果交给Nginx

10、nginx会生成一个响应报文返还给用户

知识补充:

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

Socket的英文原义是“孔”或“插座”。作为BSDUNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。客户软件将插头插到不同编号的插座,就可以得到不同的服务。

时间: 2024-10-27 18:52:56

十五大原理之一--Nginx FastCGI的运行原理的相关文章

Nginx FastCGI的运行原理

一.FastCGI 1.介绍 CGI全称通用网关接口 Commmon Gateway Interface 用于HTTP服务上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上. 传统CGI接口方式性能较差,由于每次HTTP服务器遇到动态程序需要重启解析器来执行解析,然后结果被返回给HTTP服务器.这在处理高并发时,几乎是不可能的,因此诞生了FastCGI.另外传统的CGI接口方式安全性也很差 一个可伸缩地.高速地在HTTP服务器和动态脚本语言间通信的接口 接口在linux下是socke

Nginx + fastcgi + php 的原理与关系

CGI:Common Gateway Interface 公共网关接口,web服务器和脚本语言通信的一个标准.接口.协议[协议] FastCGI:CGI协议的升级版[协议] PHP-CGI: 实现了CGI接口协议的PHP脚本解析器[程序] PHP-FPM: 管理和调度php-cgi进程,进而实现了FastCGI接口协议的程序[程序] 问题:CGI对每个请求会parse一遍对应脚本的配置文件(如php.ini), 加载配置和扩展,初始化执行环境,性能非常差,所有有了下面的流程: 那么实现Fastc

CGI 和 FastCGI 协议的运行原理

目录 介绍 深入CGI协议 CGI的运行原理 CGI协议的缺陷 深入FastCGI协议 FastCGI协议运行原理 为什么是 FastCGI 而非 CGI 协议 CGI 与 FastCGI 架构 再看 FastCGI 协议 Web 服务器和 FastCGI 交互过程 为什么需要在消息头发送 RequestID 这个标识? PHP-FPM 介绍 在用PHP开发的过程中,我们常常使用Nginx或者Apache作为我们的Web服务器.但是PHP是如何与这些Web服务器通信的呢? Apache把PHP作

Android开发学习笔记(二)——编译和运行原理(1)

http://www.cnblogs.com/Pickuper/archive/2011/06/14/2078969.html 接着上一篇的内容,继续从全局了解Android.在清楚了Android的平台架构(可以看作是静态原理)后,还需要掌握其动态原理.动态原理包含两部分,一部分是编译原理,另一部分是运行原理.有人会说,搭建一个基于Eclipse的Android开发环境,编译和运行只要点击按钮即可完成.但是,如果只是“知其然而不知其所以然”的话,在后面的开发中一旦遇到奇怪的问题后可能就束手无措

Nginx+FastCGI运行原理

转自  http://book.51cto.com/art/201202/314840.htm Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用.FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket).为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件s

(转)Apache和Nginx运行原理解析

Apache和Nginx运行原理解析 原文:https://www.server110.com/nginx/201402/6543.html Web服务器 Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务. 应用层使用HTTP协议. HTML文档格式. 浏览器统一资源定位器(URL). Web服务器常常以B/S(Browser/Server)方式提供服务.浏览器和服务器的交互方式如下: GET /index.php HTTP/1.1 +-------

Nginx解析PHP的原理 | CGI、FastCGI及php-fpm的关系

Nginx解析PHP的原理,CGI/FastCGI以及PHP-Fpm的关系. 一.PHP+Nginx应运而生的场景.随着互联网的发展,用户对此接受面广,数据流的增大使得Web端的运行承载压力日益增大,野蛮生长在大数据时代里的WEB语言PHP也找到了比老搭档更优越的活力搭档Nginx,说到Nginx咱就一起唠一唠这其中的奥妙. 从以下几个维度来剖析一下Nginx的活力所在,当然是和解析PHP的老搭档APACHE相比而言. 性能1.1 资源占有率少,节省内存资源1.2 非阻塞式的请求处理机制给之增加

Nginx+Php-fpm运行原理详解

一.代理与反向代理 现实生活中的例子 1.正向代理:访问google.com 如上图,因为google被墙,我们需要vpnFQ才能访问google.com. vpn对于"我们"来说,是可以感知到的(我们连接vpn)vpn对于"google服务器"来说,是不可感知的(google只知道有http请求过来). 对于人来说可以感知到,但服务器感知不到的服务器,我们叫他正向代理服务器. 2.反向代理:通过反向代理实现负载均衡 如上图,我们访问baidu.com的时候,bai

Web的运行原理

1.web工作原理 我是学习PHP网站建设的,那么网站在客户端和服务端的运行是网站运行的根本所在,那个这个运行过程是怎样的呢?我们一探就将! Web:万维网(WorldWideWeb) 服务器:我们把提供(响应)服务的计算机称作服务器(Server).  客户端:接受(请求)服务的计算机称作客户机(Client),也叫工作站(Workstations). 1.1服务器端和客户端连接原理 很简明的意思,就是在客户端请求数据,然后把服务的请求执行结果反馈给客户端. 客户机/服务器的这种计算机间的协作