Nginx + fastcgi + php 的原理与关系
- CGI:Common Gateway Interface 公共网关接口,web服务器和脚本语言通信的一个标准、接口、协议【协议】
- FastCGI:CGI协议的升级版【协议】
- PHP-CGI: 实现了CGI接口协议的PHP脚本解析器【程序】
- PHP-FPM: 管理和调度php-cgi进程,进而实现了FastCGI接口协议的程序【程序】
问题:CGI对每个请求会parse一遍对应脚本的配置文件(如php.ini),
加载配置和扩展,初始化执行环境,性能非常差,所有有了下面的流程:
那么实现Fastcgi协议的程序,如PHP-FPM是怎么做的呢?首先,Fastcgi会先启一个master进程,解析配置文件,初始化执行环境,然后再启动多个worker进程,这个worker就是php-cgi。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着,比如20worker,当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。
结合 用户对动态PHP网页访问过程来理解
第一步:用户将http请求发送给nginx服务器
第二步:nginx会根据用户访问的URI和后缀对请求进行判断
1.例如用户访问的index.php,nginx则会根据配置文件中的location进行匹配,例如:
root@json:/data/web# cat /etc/nginx/conf.d/blog.conf
server {
root /data/web/blog/;
index index.html index.htm;
server_name www.fwait.com;
location / {
try_files $uri $uri/ /index.html;
}
location /blog/ {
#alias /usr/share/doc/;
auth_basic "authorized users only";
auth_basic_user_file /etc/nginx/passwd.conf;
#autoindex on;
allow 192.168.1.103;
deny all;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_pass 127.0.0.1:9000;
} }
用户访问的是index.php,则会匹配到location ~ \.php$,这个的含义是对用户通过URI访问的资源进行区分大小的匹配,并且访问的资源是以.php结尾的。
nginx根据用户请求的资源匹配到具体的location后,会执行location对应的动作,location中动作的含义是:
include /etc/nginx/fastcgi_params; #表示nginx会调用fastcgi这个接口
fastcgi_intercept_errors on; #表示开启fastcgi的中断和错误信息记录
fastcgi_pass 127.0.0.1:9000; # 表示nginx通过fastcgi_pass将用户请求的资源发给127.0.0.1:9000进行解析,这里的nginx和php脚本解析服务器是在同一台机器上,所以127.0.0.1:9000表示的就是本地的php脚本解析服务器。
根据nginx服务器的配置,可以看出,用户访问的是动态的php资源,nginx会调用php相关脚本解析程序对用户访问的资源进行解析。
第三步:通过第二步可以看出,用户请求的是动态内容,nginx会将请求交给fastcgi客户端,通过fastcgi_pass将用户的请求发送给php-fpm
如果用户访问的是静态资源呢,那就简单了,nginx直接将用户请求的静态资源返回给用户。
第四步:fastcgi_pass将动态资源交给php-fpm后,php-fpm会将资源转给php脚本解析服务器的wrapper
第五步:wrapper收到php-fpm转过来的请求后,wrapper会生成一个新的线程调用php动态程序解析服务器
如果用户请求的是需要读取例如MySQL数据库等,将会触发读库操作;
如果用户请求的是如图片/附件等,PHP会触发一次查询后端存储服务器如通过NFS进行存储的存储集群;
第六步:php会将查询到的结果返回给nginx
第七步:nginx构造一个响应报文将结果返回给用户
这只是nginx的其中一种,用户请求的和返回用户请求结果是异步进行,即为用户请求的资源在nginx中做了一次中转,nginx可以同步,即为解析出来的资源,服务器直接将资源返回给用户,不用在nginx中做一次中转。
用一张图表示 nginx fastcgi wrapper php之间的关系:一图胜千言
Nginx + fastcgi + php 的原理与关系的更多相关文章
- Nginx FastCGI的运行原理
http://www.cnblogs.com/yinshoucheng-golden/p/6474034.html
- Nginx-->进阶-->原理-->Nginx+php+fastcgi的原理与关系
一.用户对动态PHP网页访问过程 用户浏览器发起对网页的访问:http://192.168.1.103/index.php 用户和nginx服务器进行三次握手进行TCP连接(忽略包括nginx访问控制 ...
- Nginx 解析PHP的原理 | CGI、FastCGI及php-fpm的关系
Nginx解析PHP的原理,CGI/FastCGI以及PHP-Fpm的关系. 一.PHP+Nginx应运而生的场景.随着互联网的发展,用户对此接受面广,数据流的增大使得Web端的运行承载压力日益增大, ...
- Nginx解析PHP的原理 | CGI、FastCGI及php-fpm的关系
Nginx解析PHP的原理,CGI/FastCGI以及PHP-Fpm的关系. 一.PHP+Nginx应运而生的场景.随着互联网的发展,用户对此接受面广,数据流的增大使得Web端的运行承载压力日益增大, ...
- nginx fastcgi php-fpm的关系梳理
CGI(Common Gateway Interface)CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具 ...
- Nginx+FastCGI运行原理(一)
1 实战Nginx与PHP(FastCGI)的安装.配置与优化 1.1 什么是 FastCGI FastCGI是一个可伸缩地.高速地在HTTP server和动态脚本语言间通信的接口.多数流行的HTT ...
- Nginx+FastCGI运行原理
Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用.FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可 ...
- windows下nginx+fastcgi不能使用file_get_contents/curl/fopen的原因
这两天一直在搞windows下nginx+fastcgi的file_get_contents请求.我想,很多同学都遇到当file_get_contents请求外网的http/https的php文件时毫 ...
- [转] nginx+FastCGI+c++
from: http://www.cnblogs.com/xiaouisme/archive/2012/08/01/2618398.html 一 安装 目的:不需支持php等.就html就行了.步骤: ...
随机推荐
- Netty编码流程及WriteAndFlush()的实现
编码器的执行时机 首先, 我们想通过服务端,往客户端发送数据, 通常我们会调用ctx.writeAndFlush(数据)的方式, 入参位置的数据可能是基本数据类型,也可能对象 其次,编码器同样属于ha ...
- C#3.0新增功能09 LINQ 基础05 使用 LINQ 进行数据转换
连载目录 [已更新最新开发文章,点击查看详细] 语言集成查询 (LINQ) 不只是检索数据. 它也是用于转换数据的强大工具. 通过使用 LINQ查询,可以使用源序列作为输入,并通过多种方式对其进 ...
- ThinkPHP 入门
ThinkPHP是一个免费.开源的,快速.简单地面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷Web应用开发和简化企业级应用开发而诞生的.ThinkPHP借鉴国外很多优秀的 ...
- SpringBoot Admin 使用指南
什么是 SpringBoot Admin? Spring Boot Admin 是一个管理和监控你的 Spring Boot 应用程序的应用程序.这些应用程序通过 Spring Boot Admin ...
- 关于STM32F103+ESP8266+阿里云过程之环境搭建和阿里云数据格式设置及注意点(一)
计划实现功能:将STM32F103采集到的温湿度,PM2.5等数值,通过UART与ESP8266通讯,使得ESP8266对外仅充当串口功能的黑盒.ESP8266通过MTQQ发布订阅数据,设备上传.接收 ...
- Linux学习笔记07之shell
shell从广义上分为两类: GUI:GNOME KDE XFACE等 CLI:sh csh bash shell启动:当用户登录完成后,系统会自动启动shelll程序 进程:应用程序的副本,用PID ...
- eclipse Mac 下补全代码
1. 每次输入都自动提示 点击 Eclipse,使其成为第一响应者,preferences->Java->Editor->Content Assist再右下角 Auto activa ...
- Android Studio项目/Flutter 案例中Gradle报错通用解决方案(包括Unable to tunnel through proxy问题)
目录 Step 1:修改Gradle版本为本地版本 Step 2:修改classpath为Android Studio版本 Step 3:关闭代理 Step 1:修改Gradle版本为本地版本 ...
- html的一些基本属性介绍
一.html的属性类型: 1.常见标签属性: a.<h1>:align对其方式 例如:<h1 align="right"> hhhhh</ ...
- Vue 中使用 typescript
Vue 中使用 typescript 什么是typescript typescript 为 javaScript的超集,这意味着它支持所有都JavaScript都语法.它很像JavaScript都强类 ...