Nginx+Php-fpm运行原理详解
为什么80%的码农都做不了架构师?>>>
一、代理与反向代理
现实生活中的例子
1、正向代理:访问google.com
如上图,因为google被墙,我们需要vpn翻墙才能访问google.com。
vpn对于“我们”来说,是可以感知到的(我们连接vpn)
vpn对于"google服务器"来说,是不可感知的(google只知道有http请求过来)。
对于人来说可以感知到,但服务器感知不到的服务器,我们叫他正向代理服务器。
2、反向代理:通过反向代理实现负载均衡
如上图,我们访问baidu.com的时候,baidu有一个代理服务器,通过这个代理服务器,可以做负载均衡,路由到不同的server。
此代理服务器,对于“我们”来说是不可感知的(我们只能感知到访问的是百度的服务器,不知道中间还有代理服务器来做负载均衡)。
此代理服务器,对于"server1 server2 server3"是可感知的(代理服务器负载均衡路由到不同的server)
对于人来说不可感知,但对于服务器来说是可以感知的,我们叫他反向代理服务器
总结
说白了:“正向”、“反向”是相对于人的感知来说的。
人能感受到的代理就是正向代理,人感受不到的代理就是反向代理。
二、初识Nginx与Php-fpm
Nginx是什么
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。
Php-fpm是什么
1、cgi、fast-cgi协议
cgi的历史
早期的webserver只处理html等静态文件,但是随着技术的发展,出现了像php等动态语言。
webserver处理不了了,怎么办呢?那就交给php解释器来处理吧!
交给php解释器处理很好,但是,php解释器如何与webserver进行通信呢?
为了解决不同的语言解释器(如php、python解释器)与webserver的通信,于是出现了cgi协议。只要你按照cgi协议去编写程序,就能实现语言解释器与webwerver的通信。如php-cgi程序。
fast-cgi的改进
有了cgi协议,解决了php解释器与webserver通信的问题,webserver终于可以处理动态语言了。
但是,webserver每收到一个请求,都会去fork一个cgi进程,请求结束再kill掉这个进程。这样有10000个请求,就需要fork、kill php-cgi进程10000次。
有没有发现很浪费资源?
于是,出现了cgi的改良版本,fast-cgi。fast-cgi每次处理完请求后,不会kill掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。这样每次就不用重新fork一个进程了,大大提高了效率。
2、php-fpm是什么
php-fpm即php-Fastcgi Process Manager.
php-fpm是 FastCGI 的实现,并提供了进程管理的功能。
进程包含 master 进程和 worker 进程两种进程。
master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。
三、Nginx如何与Php-fpm结合
上面我们说了,Nginx不只有处理http请求的功能,还能做反向代理。
Nginx通过反向代理功能将动态请求转向后端Php-fpm。
下面我们来配置一个全新的Nginx+Php-fpm
1、配置nginx.conf文件
进入nginx目录下,编辑 nginx.conf文件。
如图,在nginx.conf最后一行,添加include文件
2、添加对应的server
进入上面include的路径,添加一个server.
下面我们解释一下配置项的含义:
server {listen 80; #监听80端口,接收http请求server_name www.example.com; #就是网站地址root /usr/local/etc/nginx/www/huxintong_admin; # 准备存放代码工程的路径#路由到网站根目录www.example.com时候的处理location / {index index.php; #跳转到www.example.com/index.phpautoindex on;} #当请求网站下php文件的时候,反向代理到php-fpmlocation ~ \.php$ {include /usr/local/etc/nginx/fastcgi.conf; #加载nginx的fastcgi模块fastcgi_intercept_errors on;fastcgi_pass 127.0.0.1:9000; #nginx fastcgi进程监听的IP地址和端口}}
总而言之:当我们访问www.example.com的时候,处理流程是这样的:
www.example.com||Nginx|| 路由到www.example.com/index.php|| 加载nginx的fast-cgi模块|| fast-cgi监听127.0.0.1:9000地址|| www.example.com/index.php请求到达127.0.0.1:9000||等待处理...
下面我们启用php的php-fpm来处理这个请求
打开php-fpm.conf文件,我们看到如下配置:
即:php-fpm模块监听127.0.0.1:9000端口,等待请求到来去处理。
四、总结
nginx与php-fpm的结合,完整的流程是这样的。
www.example.com||Nginx|| 路由到www.example.com/index.php|| 加载nginx的fast-cgi模块|| fast-cgi监听127.0.0.1:9000地址|| www.example.com/index.php请求到达127.0.0.1:9000|| php-fpm 监听127.0.0.1:9000|| php-fpm 接收到请求,启用worker进程处理请求|| php-fpm 处理完请求,返回给nginx|| nginx将结果通过http返回给浏览器
五、效果展示
1、启动nginx与php-fpm模块
启动成功,我们查看php-fpm进程
如上图,有一个master进程,3个worker进程。
2、在网站目录下建立文件
我们编辑文件如下图:
3、访问网站
差不多写完了,文章疏漏之处在所难免,欢迎留言交流探讨。
转载于:https://my.oschina.net/yomut/blog/778551
Nginx+Php-fpm运行原理详解相关推荐
- nginx配置文件及工作原理详解
nginx配置文件及工作原理详解 1 nginx配置文件的结构 2 nginx工作原理 1 nginx配置文件的结构 1)以下是nginx配置文件默认的主要内容: #user nobody; #配置用 ...
- 为什么jvm要分为堆、方法区等?原理是什么?_「JVM」知识点详解一:JVM运行原理详解...
前言 JVM 一直都是面试的必考点,大家都知道,但是要把它搞清楚又好像不是特别容易.JVM 的知识点太散,不系统,今天带大家详细的了解一下jvm的运行原理. 正文 1 什么是JVM? JVM是Java ...
- java运行原理_Java程序的加载与运行原理详解
Java程序的运行包括两个非常重要的阶段: 一.编译阶段 第一步:程序员需要在计算机硬盘中任意位置创建一个.java扩展名的文件,该文件被称为 java源文件,源文件当中编写的是java源代码/源程序 ...
- Maven - 2、安装、配置、mvn运行过程详解
1.本篇环境 jdk1.8 maven3.6.2 我们要写java代码,需要安装jdk,那我们要使用maven,也类似,需要在我们的机器中安装maven. 2.linux中安装安装maven mave ...
- java8 stream运行原理之并行流原理详解
上一篇文章<java8 stream运行原理之顺序流原理详解>介绍了顺序流的执行原理,本文接着上一篇介绍并行流的执行原理. 一.如何创建并行流 调用parallel()方法可以创建并行流, ...
- LVS原理详解(3种工作方式8种调度算法)--老男孩
一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...
- 计算机网络知识详解之:TCP连接原理详解
网络知识详解之:TCP连接原理详解 计算机网络相关知识体系详解 网络知识详解之:TCP连接原理详解 网络知识详解之:HTTP协议基础 网络知识详解之:HTTPS通信原理剖析(对称.非对称加密.数字签名 ...
- LVS原理详解(3种工作模式及8种调度算法)
2017年1月12日, 星期四 LVS原理详解(3种工作模式及8种调度算法) LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法) 作者:woshiliwentong 发布日期:20 ...
- nginx平滑升级与配置文件详解
nginx平滑升级与配置文件详解 文章目录 nginx平滑升级 nginx配置文件 nginx.conf配置详解 用于调试.定位问题的配置参数 正常运行必备的配置参数 优化性能的配置参数 网络连接相关 ...
最新文章
- LightOJ 1364 Expected Cards(概率+DP)
- python的helper_SQLHelper ------ python实现
- typora公式zuo对齐_latex公式如何居左对齐
- 此项目的默认Web访问模式设置为文件共享, 但是无法从路径(此为转贴)
- 回调 that.setdata 数据不更新_重大利空落地,或损上亿利润,乐普医疗回调近四成...
- 记一次 .NET 某资讯论坛 CPU爆高分析
- 一个怎样得到treeView值的小例子
- python下载包突然卡住_【python】python下载视频为什么会卡?
- 如何停止CSS3的动画?
- C++ 过去的这一年
- vue canvas插件_基于vue.js 制作在线桌椅定制选择交互特效源码
- Connection reset原因分析和解决方案
- 十大算法 — 冒泡排序法【C语言代码诠释】
- ios怎么引入masonry_iOS-Masonry的简单使用
- 计算机化学试题,08计算机化学试卷yuanj.doc
- 架构 - 5种常见的软件架构
- FPGA实现除法运算
- 浙江中医药大学第十二届大学生程序设计竞赛 Wpremig的AH之战
- java中的double相乘-------保留精度
- WSL2 Ubuntu18.04 apt-get update失败
热门文章
- 刷新率调高,或高于60Hz闪屏,忽明忽暗,晃动问题
- 【PL/SQL】PL/SQL语言基础
- 使用uploadify上传大文件报 IO error #2038错误的解决方案
- 413 Request Entity Too Large 异常记录
- vue store的值刷新就被覆盖解决方案
- hive:导出数据记录中null被替换为\n的解决方案
- 解决小程序背景图片在真机上不能查看的问题
- 解决Sql中DIstinct与Order By共同使用的冲突问题
- 解决:安装R包时,经常提示“package ‘readr’ is not available (for R version 3.5.1)”的问题
- 从PHP脚本返回JSON